blob: 07e1662c47b9754cdc741d9cd3c9710a8cbe4e2f [file] [log] [blame]
Zachary Turnera9054dd2017-01-11 00:35:43 +00001//===- PrettyClassDefinitionDumper.cpp --------------------------*- C++ -*-===//
Zachary Turner29c69102015-02-23 05:58:34 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Zachary Turnera9054dd2017-01-11 00:35:43 +000010#include "PrettyClassDefinitionDumper.h"
11
Zachary Turner2d11c202015-02-27 09:15:59 +000012#include "LinePrinter.h"
Zachary Turnera9054dd2017-01-11 00:35:43 +000013#include "PrettyEnumDumper.h"
14#include "PrettyFunctionDumper.h"
15#include "PrettyTypedefDumper.h"
16#include "PrettyVariableDumper.h"
Zachary Turner29c69102015-02-23 05:58:34 +000017#include "llvm-pdbdump.h"
Zachary Turner29c69102015-02-23 05:58:34 +000018
19#include "llvm/DebugInfo/PDB/IPDBSession.h"
20#include "llvm/DebugInfo/PDB/PDBExtras.h"
21#include "llvm/DebugInfo/PDB/PDBSymbolData.h"
22#include "llvm/DebugInfo/PDB/PDBSymbolFunc.h"
23#include "llvm/DebugInfo/PDB/PDBSymbolTypeBaseClass.h"
24#include "llvm/DebugInfo/PDB/PDBSymbolTypeEnum.h"
25#include "llvm/DebugInfo/PDB/PDBSymbolTypePointer.h"
26#include "llvm/DebugInfo/PDB/PDBSymbolTypeTypedef.h"
27#include "llvm/DebugInfo/PDB/PDBSymbolTypeUDT.h"
28#include "llvm/DebugInfo/PDB/PDBSymbolTypeVTable.h"
29#include "llvm/Support/Format.h"
30
31using namespace llvm;
Zachary Turnerec28fc32016-05-04 20:32:13 +000032using namespace llvm::pdb;
Zachary Turner29c69102015-02-23 05:58:34 +000033
Zachary Turner2d11c202015-02-27 09:15:59 +000034ClassDefinitionDumper::ClassDefinitionDumper(LinePrinter &P)
35 : PDBSymDumper(true), Printer(P) {}
Zachary Turner29c69102015-02-23 05:58:34 +000036
Zachary Turnerb52d08d2015-03-01 06:51:29 +000037void ClassDefinitionDumper::start(const PDBSymbolTypeUDT &Class) {
Zachary Turner10169b62017-04-06 23:43:39 +000038 assert(opts::pretty::ClassFormat !=
39 opts::pretty::ClassDefinitionFormat::None);
40
Zachary Turner2d11c202015-02-27 09:15:59 +000041 std::string Name = Class.getName();
Zachary Turner7797c722015-03-02 04:39:56 +000042 WithColor(Printer, PDB_ColorItem::Keyword).get() << Class.getUdtKind() << " ";
Zachary Turner2d11c202015-02-27 09:15:59 +000043 WithColor(Printer, PDB_ColorItem::Type).get() << Class.getName();
Zachary Turner7797c722015-03-02 04:39:56 +000044
45 auto Bases = Class.findAllChildren<PDBSymbolTypeBaseClass>();
46 if (Bases->getChildCount() > 0) {
47 Printer.Indent();
48 Printer.NewLine();
49 Printer << ":";
50 uint32_t BaseIndex = 0;
51 while (auto Base = Bases->getNext()) {
52 Printer << " ";
53 WithColor(Printer, PDB_ColorItem::Keyword).get() << Base->getAccess();
54 if (Base->isVirtualBaseClass())
55 WithColor(Printer, PDB_ColorItem::Keyword).get() << " virtual";
56 WithColor(Printer, PDB_ColorItem::Type).get() << " " << Base->getName();
57 if (++BaseIndex < Bases->getChildCount()) {
58 Printer.NewLine();
59 Printer << ",";
60 }
61 }
62 Printer.Unindent();
63 }
64
Zachary Turner2d11c202015-02-27 09:15:59 +000065 Printer << " {";
Zachary Turner29c69102015-02-23 05:58:34 +000066 auto Children = Class.findAllChildren();
Zachary Turner10169b62017-04-06 23:43:39 +000067 Printer.Indent();
68 int DumpedCount = 0;
Zachary Turner29c69102015-02-23 05:58:34 +000069 while (auto Child = Children->getNext()) {
Zachary Turner29c69102015-02-23 05:58:34 +000070
Zachary Turner10169b62017-04-06 23:43:39 +000071 if (opts::pretty::ClassFormat ==
72 opts::pretty::ClassDefinitionFormat::LayoutOnly) {
Zachary Turner1b1a70f2017-04-10 06:14:09 +000073 if (auto Data = Child->cast<PDBSymbolData>()) {
Zachary Turner10169b62017-04-06 23:43:39 +000074 switch (Data->getLocationType()) {
75 case PDB_LocType::ThisRel:
76 case PDB_LocType::BitField:
77 break;
78 default:
79 // All other types of data field do not occupy any storage (e.g. are
Zachary Turner1b1a70f2017-04-10 06:14:09 +000080 // const), so in layout mode we skip them.
Zachary Turner10169b62017-04-06 23:43:39 +000081 continue;
82 }
83 } else {
84 // Only data symbols affect record layout, so skip any non-data symbols
Zachary Turner1b1a70f2017-04-10 06:14:09 +000085 // if we're in record layout mode.
Zachary Turner10169b62017-04-06 23:43:39 +000086 continue;
87 }
88 }
Zachary Turner29c69102015-02-23 05:58:34 +000089
Zachary Turner1b1a70f2017-04-10 06:14:09 +000090 if (auto Func = Child->cast<PDBSymbolFunc>()) {
Zachary Turnera30bd1a2016-06-30 17:42:48 +000091 if (Func->isCompilerGenerated() && opts::pretty::ExcludeCompilerGenerated)
Zachary Turner29c69102015-02-23 05:58:34 +000092 continue;
Zachary Turner10169b62017-04-06 23:43:39 +000093
Zachary Turner7797c722015-03-02 04:39:56 +000094 if (Func->getLength() == 0 && !Func->isPureVirtual() &&
95 !Func->isIntroVirtualFunction())
Zachary Turner29c69102015-02-23 05:58:34 +000096 continue;
Zachary Turner29c69102015-02-23 05:58:34 +000097 }
Zachary Turner10169b62017-04-06 23:43:39 +000098
99 ++DumpedCount;
100 Child->dump(*this);
Zachary Turner29c69102015-02-23 05:58:34 +0000101 }
102
Zachary Turner10169b62017-04-06 23:43:39 +0000103 Printer.Unindent();
104 if (DumpedCount > 0)
Zachary Turner2d11c202015-02-27 09:15:59 +0000105 Printer.NewLine();
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000106 Printer << "}";
Zachary Turner29c69102015-02-23 05:58:34 +0000107}
108
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000109void ClassDefinitionDumper::dump(const PDBSymbolTypeBaseClass &Symbol) {}
Zachary Turner29c69102015-02-23 05:58:34 +0000110
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000111void ClassDefinitionDumper::dump(const PDBSymbolData &Symbol) {
Zachary Turner2d11c202015-02-27 09:15:59 +0000112 VariableDumper Dumper(Printer);
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000113 Dumper.start(Symbol);
Zachary Turner29c69102015-02-23 05:58:34 +0000114}
115
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000116void ClassDefinitionDumper::dump(const PDBSymbolFunc &Symbol) {
Zachary Turnerf5abda22015-03-01 06:49:49 +0000117 if (Printer.IsSymbolExcluded(Symbol.getName()))
118 return;
119
Zachary Turner2d11c202015-02-27 09:15:59 +0000120 Printer.NewLine();
121 FunctionDumper Dumper(Printer);
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000122 Dumper.start(Symbol, FunctionDumper::PointerType::None);
Zachary Turner29c69102015-02-23 05:58:34 +0000123}
124
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000125void ClassDefinitionDumper::dump(const PDBSymbolTypeVTable &Symbol) {}
Zachary Turner29c69102015-02-23 05:58:34 +0000126
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000127void ClassDefinitionDumper::dump(const PDBSymbolTypeEnum &Symbol) {
Zachary Turnerf5abda22015-03-01 06:49:49 +0000128 if (Printer.IsTypeExcluded(Symbol.getName()))
129 return;
130
Zachary Turner2d11c202015-02-27 09:15:59 +0000131 Printer.NewLine();
Zachary Turner65323652015-03-04 06:09:53 +0000132 EnumDumper Dumper(Printer);
133 Dumper.start(Symbol);
Zachary Turner29c69102015-02-23 05:58:34 +0000134}
135
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000136void ClassDefinitionDumper::dump(const PDBSymbolTypeTypedef &Symbol) {
Zachary Turnerf5abda22015-03-01 06:49:49 +0000137 if (Printer.IsTypeExcluded(Symbol.getName()))
138 return;
139
Zachary Turner2d11c202015-02-27 09:15:59 +0000140 Printer.NewLine();
141 TypedefDumper Dumper(Printer);
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000142 Dumper.start(Symbol);
Zachary Turner29c69102015-02-23 05:58:34 +0000143}
144
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000145void ClassDefinitionDumper::dump(const PDBSymbolTypeUDT &Symbol) {}