blob: 333313ee7ef030c956c361fcb33f132a5e9ad55b [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) {
73 if (auto Data = dyn_cast<PDBSymbolData>(Child.get())) {
74 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
80 // const),
81 // so in layout mode we skip them.
82 continue;
83 }
84 } else {
85 // Only data symbols affect record layout, so skip any non-data symbols
86 // if
87 // we're in record layout mode.
88 continue;
89 }
90 }
Zachary Turner29c69102015-02-23 05:58:34 +000091
92 if (auto Func = dyn_cast<PDBSymbolFunc>(Child.get())) {
Zachary Turnera30bd1a2016-06-30 17:42:48 +000093 if (Func->isCompilerGenerated() && opts::pretty::ExcludeCompilerGenerated)
Zachary Turner29c69102015-02-23 05:58:34 +000094 continue;
Zachary Turner10169b62017-04-06 23:43:39 +000095
Zachary Turner7797c722015-03-02 04:39:56 +000096 if (Func->getLength() == 0 && !Func->isPureVirtual() &&
97 !Func->isIntroVirtualFunction())
Zachary Turner29c69102015-02-23 05:58:34 +000098 continue;
Zachary Turner29c69102015-02-23 05:58:34 +000099 }
Zachary Turner10169b62017-04-06 23:43:39 +0000100
101 ++DumpedCount;
102 Child->dump(*this);
Zachary Turner29c69102015-02-23 05:58:34 +0000103 }
104
Zachary Turner10169b62017-04-06 23:43:39 +0000105 Printer.Unindent();
106 if (DumpedCount > 0)
Zachary Turner2d11c202015-02-27 09:15:59 +0000107 Printer.NewLine();
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000108 Printer << "}";
Zachary Turner29c69102015-02-23 05:58:34 +0000109}
110
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000111void ClassDefinitionDumper::dump(const PDBSymbolTypeBaseClass &Symbol) {}
Zachary Turner29c69102015-02-23 05:58:34 +0000112
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000113void ClassDefinitionDumper::dump(const PDBSymbolData &Symbol) {
Zachary Turner2d11c202015-02-27 09:15:59 +0000114 VariableDumper Dumper(Printer);
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000115 Dumper.start(Symbol);
Zachary Turner29c69102015-02-23 05:58:34 +0000116}
117
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000118void ClassDefinitionDumper::dump(const PDBSymbolFunc &Symbol) {
Zachary Turnerf5abda22015-03-01 06:49:49 +0000119 if (Printer.IsSymbolExcluded(Symbol.getName()))
120 return;
121
Zachary Turner2d11c202015-02-27 09:15:59 +0000122 Printer.NewLine();
123 FunctionDumper Dumper(Printer);
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000124 Dumper.start(Symbol, FunctionDumper::PointerType::None);
Zachary Turner29c69102015-02-23 05:58:34 +0000125}
126
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000127void ClassDefinitionDumper::dump(const PDBSymbolTypeVTable &Symbol) {}
Zachary Turner29c69102015-02-23 05:58:34 +0000128
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000129void ClassDefinitionDumper::dump(const PDBSymbolTypeEnum &Symbol) {
Zachary Turnerf5abda22015-03-01 06:49:49 +0000130 if (Printer.IsTypeExcluded(Symbol.getName()))
131 return;
132
Zachary Turner2d11c202015-02-27 09:15:59 +0000133 Printer.NewLine();
Zachary Turner65323652015-03-04 06:09:53 +0000134 EnumDumper Dumper(Printer);
135 Dumper.start(Symbol);
Zachary Turner29c69102015-02-23 05:58:34 +0000136}
137
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000138void ClassDefinitionDumper::dump(const PDBSymbolTypeTypedef &Symbol) {
Zachary Turnerf5abda22015-03-01 06:49:49 +0000139 if (Printer.IsTypeExcluded(Symbol.getName()))
140 return;
141
Zachary Turner2d11c202015-02-27 09:15:59 +0000142 Printer.NewLine();
143 TypedefDumper Dumper(Printer);
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000144 Dumper.start(Symbol);
Zachary Turner29c69102015-02-23 05:58:34 +0000145}
146
Zachary Turnerb52d08d2015-03-01 06:51:29 +0000147void ClassDefinitionDumper::dump(const PDBSymbolTypeUDT &Symbol) {}