diff --git a/include/llvm/DebugInfo/CodeView/CVSymbolVisitor.h b/include/llvm/DebugInfo/CodeView/CVSymbolVisitor.h index b2d3f5ea34a..7c8cd121751 100644 --- a/include/llvm/DebugInfo/CodeView/CVSymbolVisitor.h +++ b/include/llvm/DebugInfo/CodeView/CVSymbolVisitor.h @@ -25,7 +25,9 @@ public: CVSymbolVisitor(SymbolVisitorCallbacks &Callbacks); Error visitSymbolRecord(CVSymbol &Record); + Error visitSymbolRecord(CVSymbol &Record, uint32_t Offset); Error visitSymbolStream(const CVSymbolArray &Symbols); + Error visitSymbolStream(const CVSymbolArray &Symbols, uint32_t InitialOffset); private: SymbolVisitorCallbacks &Callbacks; diff --git a/include/llvm/DebugInfo/CodeView/SymbolDeserializer.h b/include/llvm/DebugInfo/CodeView/SymbolDeserializer.h index 7080b048075..5b6599d8c1d 100644 --- a/include/llvm/DebugInfo/CodeView/SymbolDeserializer.h +++ b/include/llvm/DebugInfo/CodeView/SymbolDeserializer.h @@ -51,6 +51,10 @@ public: CodeViewContainer Container) : Delegate(Delegate), Container(Container) {} + Error visitSymbolBegin(CVSymbol &Record, uint32_t Offset) override { + return visitSymbolBegin(Record); + } + Error visitSymbolBegin(CVSymbol &Record) override { assert(!Mapping && "Already in a symbol mapping!"); Mapping = llvm::make_unique(Record.content(), Container); diff --git a/include/llvm/DebugInfo/CodeView/SymbolVisitorCallbackPipeline.h b/include/llvm/DebugInfo/CodeView/SymbolVisitorCallbackPipeline.h index 5f4205bd6e0..e29511a67b7 100644 --- a/include/llvm/DebugInfo/CodeView/SymbolVisitorCallbackPipeline.h +++ b/include/llvm/DebugInfo/CodeView/SymbolVisitorCallbackPipeline.h @@ -30,6 +30,14 @@ public: return Error::success(); } + Error visitSymbolBegin(CVSymbol &Record, uint32_t Offset) override { + for (auto Visitor : Pipeline) { + if (auto EC = Visitor->visitSymbolBegin(Record, Offset)) + return EC; + } + return Error::success(); + } + Error visitSymbolBegin(CVSymbol &Record) override { for (auto Visitor : Pipeline) { if (auto EC = Visitor->visitSymbolBegin(Record)) diff --git a/include/llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h b/include/llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h index 2ef7eabdaa9..0816f7c6265 100644 --- a/include/llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h +++ b/include/llvm/DebugInfo/CodeView/SymbolVisitorCallbacks.h @@ -29,8 +29,10 @@ public: /// Paired begin/end actions for all symbols. Receives all record data, /// including the fixed-length record prefix. visitSymbolBegin() should - /// return - /// the type of the Symbol, or an error if it cannot be determined. + /// return the type of the Symbol, or an error if it cannot be determined. + virtual Error visitSymbolBegin(CVSymbol &Record, uint32_t Offset) { + return Error::success(); + } virtual Error visitSymbolBegin(CVSymbol &Record) { return Error::success(); } virtual Error visitSymbolEnd(CVSymbol &Record) { return Error::success(); } diff --git a/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp b/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp index d058f486497..e0c7ef58c30 100644 --- a/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp +++ b/lib/DebugInfo/CodeView/CVSymbolVisitor.cpp @@ -29,10 +29,8 @@ static Error visitKnownRecord(CVSymbol &Record, return Error::success(); } -Error CVSymbolVisitor::visitSymbolRecord(CVSymbol &Record) { - if (auto EC = Callbacks.visitSymbolBegin(Record)) - return EC; - +static Error finishVisitation(CVSymbol &Record, + SymbolVisitorCallbacks &Callbacks) { switch (Record.Type) { default: if (auto EC = Callbacks.visitUnknownSymbol(Record)) @@ -55,6 +53,18 @@ Error CVSymbolVisitor::visitSymbolRecord(CVSymbol &Record) { return Error::success(); } +Error CVSymbolVisitor::visitSymbolRecord(CVSymbol &Record) { + if (auto EC = Callbacks.visitSymbolBegin(Record)) + return EC; + return finishVisitation(Record, Callbacks); +} + +Error CVSymbolVisitor::visitSymbolRecord(CVSymbol &Record, uint32_t Offset) { + if (auto EC = Callbacks.visitSymbolBegin(Record, Offset)) + return EC; + return finishVisitation(Record, Callbacks); +} + Error CVSymbolVisitor::visitSymbolStream(const CVSymbolArray &Symbols) { for (auto I : Symbols) { if (auto EC = visitSymbolRecord(I)) @@ -62,3 +72,13 @@ Error CVSymbolVisitor::visitSymbolStream(const CVSymbolArray &Symbols) { } return Error::success(); } + +Error CVSymbolVisitor::visitSymbolStream(const CVSymbolArray &Symbols, + uint32_t InitialOffset) { + for (auto I : Symbols) { + if (auto EC = visitSymbolRecord(I, InitialOffset)) + return EC; + InitialOffset += I.length(); + } + return Error::success(); +} diff --git a/test/DebugInfo/PDB/pdbdump-headers.test b/test/DebugInfo/PDB/pdbdump-headers.test index 70a1163b6c9..3b7895e06b7 100644 --- a/test/DebugInfo/PDB/pdbdump-headers.test +++ b/test/DebugInfo/PDB/pdbdump-headers.test @@ -474,64 +474,64 @@ ALL-NEXT: TI: 0x1000, Offset: 0 ALL: Hash Adjusters: ALL: Public Symbols ALL-NEXT: ============================================================ -ALL-NEXT: - S_PUB32 [size = 36] `?__purecall@@3PAXA` +ALL-NEXT: 0 | S_PUB32 [size = 36] `?__purecall@@3PAXA` ALL-NEXT: flags = none, addr = 0003:0000 -ALL-NEXT: - S_PUB32 [size = 20] `_main` +ALL-NEXT: 36 | S_PUB32 [size = 20] `_main` ALL-NEXT: flags = function, addr = 0001:0016 -ALL-NEXT: - S_PROCREF [size = 20] `main` +ALL-NEXT: 56 | S_PROCREF [size = 20] `main` ALL-NEXT: module = 1, sum name = 0, offset = 120 -ALL-NEXT: - S_GDATA32 [size = 28] `__purecall` +ALL-NEXT: 76 | S_GDATA32 [size = 28] `__purecall` ALL-NEXT: type = 0x0403 (void*), addr = 0003:0000 ALL: Symbols ALL-NEXT: ============================================================ ALL-NEXT: Mod 0000 | `d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj`: -ALL-NEXT: - S_OBJNAME [size = 56] sig=0, `d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj` -ALL-NEXT: - S_COMPILE3 [size = 60] -ALL-NEXT: machine = intel pentium 3, Ver = Microsoft (R) Optimizing Compiler, language = c++ -ALL-NEXT: frontend = 18.0.31101.0, backend = 18.0.31101.0 -ALL-NEXT: flags = security checks -ALL-NEXT: - S_GPROC32 [size = 44] `main` -ALL-NEXT: parent = 0, addr = 0001:0016, code size = 10, end = 196 -ALL-NEXT: debug start = 3, debug end = 8, flags = has fp -ALL-NEXT: - S_FRAMEPROC [size = 32] -ALL-NEXT: size = 0, padding size = 0, offset to padding = 0 -ALL-NEXT: bytes of callee saved registers = 0, exception handler addr = 0000:0000 -ALL-NEXT: flags = has async eh | opt speed -ALL-NEXT: - S_END [size = 4] -ALL-NEXT: - S_BUILDINFO [size = 8] BuildId = `4110` +ALL-NEXT: 4 | S_OBJNAME [size = 56] sig=0, `d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.obj` +ALL-NEXT: 60 | S_COMPILE3 [size = 60] +ALL-NEXT: machine = intel pentium 3, Ver = Microsoft (R) Optimizing Compiler, language = c++ +ALL-NEXT: frontend = 18.0.31101.0, backend = 18.0.31101.0 +ALL-NEXT: flags = security checks +ALL-NEXT: 120 | S_GPROC32 [size = 44] `main` +ALL-NEXT: parent = 0, end = 196, addr = 0001:0016, code size = 10 +ALL-NEXT: debug start = 3, debug end = 8, flags = has fp +ALL-NEXT: 164 | S_FRAMEPROC [size = 32] +ALL-NEXT: size = 0, padding size = 0, offset to padding = 0 +ALL-NEXT: bytes of callee saved registers = 0, exception handler addr = 0000:0000 +ALL-NEXT: flags = has async eh | opt speed +ALL-NEXT: 196 | S_END [size = 4] +ALL-NEXT: 200 | S_BUILDINFO [size = 8] BuildId = `4110` ALL-NEXT: Mod 0001 | `* Linker *`: -ALL-NEXT: - S_OBJNAME [size = 20] sig=0, `* Linker *` -ALL-NEXT: - S_COMPILE3 [size = 48] -ALL-NEXT: machine = intel 80386, Ver = Microsoft (R) LINK, language = link -ALL-NEXT: frontend = 0.0.0.0, backend = 12.0.31101.0 -ALL-NEXT: flags = none -ALL-NEXT: - S_ENVBLOCK [size = 172] -ALL-NEXT: - cwd -ALL-NEXT: - d:\src\llvm\test\DebugInfo\PDB\Inputs -ALL-NEXT: - exe -ALL-NEXT: - C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\link.exe -ALL-NEXT: - pdb -ALL-NEXT: - d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.pdb -ALL-NEXT: - S_TRAMPOLINE [size = 20] -ALL-NEXT: type = tramp incremental, size = 5, source = 0001:0005, target = 0001:0005 -ALL-NEXT: - S_SECTION [size = 28] `.text` -ALL-NEXT: length = 4122, alignment = 12, rva = 4096, section # = 1, characteristics = 1610612768 -ALL-NEXT: - S_COFFGROUP [size = 28] `.text$mn` -ALL-NEXT: length = 4122, addr = 0001:0000, characteristics = 1610612768 -ALL-NEXT: - S_SECTION [size = 28] `.rdata` -ALL-NEXT: length = 690, alignment = 12, rva = 12288, section # = 2, characteristics = 1073741888 -ALL-NEXT: - S_COFFGROUP [size = 28] `.rdata` -ALL-NEXT: length = 323, addr = 0002:0000, characteristics = 1073741888 -ALL-NEXT: - S_COFFGROUP [size = 28] `.edata` -ALL-NEXT: length = 0, addr = 0002:0323, characteristics = 1073741888 -ALL-NEXT: - S_COFFGROUP [size = 32] `.rdata$debug` -ALL-NEXT: length = 366, addr = 0002:0324, characteristics = 1073741888 -ALL-NEXT: - S_SECTION [size = 28] `.data` -ALL-NEXT: length = 4, alignment = 12, rva = 16384, section # = 3, characteristics = 3221225536 -ALL-NEXT: - S_COFFGROUP [size = 24] `.bss` -ALL-NEXT: length = 4, addr = 0003:0000, characteristics = 3221225600 -ALL-NEXT: - S_SECTION [size = 28] `.reloc` -ALL-NEXT: length = 8, alignment = 12, rva = 20480, section # = 4, characteristics = 1107296320 +ALL-NEXT: 4 | S_OBJNAME [size = 20] sig=0, `* Linker *` +ALL-NEXT: 24 | S_COMPILE3 [size = 48] +ALL-NEXT: machine = intel 80386, Ver = Microsoft (R) LINK, language = link +ALL-NEXT: frontend = 0.0.0.0, backend = 12.0.31101.0 +ALL-NEXT: flags = none +ALL-NEXT: 72 | S_ENVBLOCK [size = 172] +ALL-NEXT: - cwd +ALL-NEXT: - d:\src\llvm\test\DebugInfo\PDB\Inputs +ALL-NEXT: - exe +ALL-NEXT: - C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\link.exe +ALL-NEXT: - pdb +ALL-NEXT: - d:\src\llvm\test\DebugInfo\PDB\Inputs\empty.pdb +ALL-NEXT: 244 | S_TRAMPOLINE [size = 20] +ALL-NEXT: type = tramp incremental, size = 5, source = 0001:0005, target = 0001:0005 +ALL-NEXT: 264 | S_SECTION [size = 28] `.text` +ALL-NEXT: length = 4122, alignment = 12, rva = 4096, section # = 1, characteristics = 1610612768 +ALL-NEXT: 292 | S_COFFGROUP [size = 28] `.text$mn` +ALL-NEXT: length = 4122, addr = 0001:0000, characteristics = 1610612768 +ALL-NEXT: 320 | S_SECTION [size = 28] `.rdata` +ALL-NEXT: length = 690, alignment = 12, rva = 12288, section # = 2, characteristics = 1073741888 +ALL-NEXT: 348 | S_COFFGROUP [size = 28] `.rdata` +ALL-NEXT: length = 323, addr = 0002:0000, characteristics = 1073741888 +ALL-NEXT: 376 | S_COFFGROUP [size = 28] `.edata` +ALL-NEXT: length = 0, addr = 0002:0323, characteristics = 1073741888 +ALL-NEXT: 404 | S_COFFGROUP [size = 32] `.rdata$debug` +ALL-NEXT: length = 366, addr = 0002:0324, characteristics = 1073741888 +ALL-NEXT: 436 | S_SECTION [size = 28] `.data` +ALL-NEXT: length = 4, alignment = 12, rva = 16384, section # = 3, characteristics = 3221225536 +ALL-NEXT: 464 | S_COFFGROUP [size = 24] `.bss` +ALL-NEXT: length = 4, addr = 0003:0000, characteristics = 3221225600 +ALL-NEXT: 488 | S_SECTION [size = 28] `.reloc` +ALL-NEXT: length = 8, alignment = 12, rva = 20480, section # = 4, characteristics = 1107296320 ALL: Section Contributions ALL-NEXT: ============================================================ ALL-NEXT: SC | mod = 1, 0001:0000, size = 10, data crc = 0, reloc crc = 0 diff --git a/tools/llvm-pdbutil/DumpOutputStyle.cpp b/tools/llvm-pdbutil/DumpOutputStyle.cpp index 3a956c9f64f..a1f919b4dd0 100644 --- a/tools/llvm-pdbutil/DumpOutputStyle.cpp +++ b/tools/llvm-pdbutil/DumpOutputStyle.cpp @@ -834,7 +834,8 @@ Error DumpOutputStyle::dumpModuleSyms() { Pipeline.addCallbackToPipeline(Deserializer); Pipeline.addCallbackToPipeline(Dumper); CVSymbolVisitor Visitor(Pipeline); - if (auto EC = Visitor.visitSymbolStream(ModS.getSymbolArray())) { + auto SS = ModS.getSymbolsSubstream(); + if (auto EC = Visitor.visitSymbolStream(ModS.getSymbolArray(), SS.Offset)) { P.formatLine("Error while processing symbol records. {0}", toString(std::move(EC))); continue; @@ -863,13 +864,14 @@ Error DumpOutputStyle::dumpPublics() { Pipeline.addCallbackToPipeline(Deserializer); Pipeline.addCallbackToPipeline(Dumper); CVSymbolVisitor Visitor(Pipeline); + auto ExpectedSymbols = Publics.getSymbolArray(); if (!ExpectedSymbols) { P.formatLine("Could not read public symbol record stream"); return Error::success(); } - if (auto EC = Visitor.visitSymbolStream(*ExpectedSymbols)) + if (auto EC = Visitor.visitSymbolStream(*ExpectedSymbols, 0)) P.formatLine("Error while processing public symbol records. {0}", toString(std::move(EC))); diff --git a/tools/llvm-pdbutil/MinimalSymbolDumper.cpp b/tools/llvm-pdbutil/MinimalSymbolDumper.cpp index 7f5412d5988..9d57e429485 100644 --- a/tools/llvm-pdbutil/MinimalSymbolDumper.cpp +++ b/tools/llvm-pdbutil/MinimalSymbolDumper.cpp @@ -367,11 +367,17 @@ static std::string formatGaps(uint32_t IndentLevel, } Error MinimalSymbolDumper::visitSymbolBegin(codeview::CVSymbol &Record) { + return visitSymbolBegin(Record, 0); +} + +Error MinimalSymbolDumper::visitSymbolBegin(codeview::CVSymbol &Record, + uint32_t Offset) { // formatLine puts the newline at the beginning, so we use formatLine here // to start a new line, and then individual visit methods use format to // append to the existing line. - P.formatLine("- {0} [size = {1}]", getSymbolKindName(Record.Type), - Record.length()); + P.formatLine("{0} | {1} [size = {2}]", + fmt_align(Offset, AlignStyle::Right, 6), + getSymbolKindName(Record.Type), Record.length()); P.Indent(); return Error::success(); } @@ -394,28 +400,31 @@ std::string MinimalSymbolDumper::typeIndex(TypeIndex TI) const { Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, BlockSym &Block) { P.format(" `{0}`", Block.Name); - AutoIndent Indent(P); - P.formatLine("parent = {0}, addr = {1}", Block.Parent, + AutoIndent Indent(P, 7); + ; + P.formatLine("parent = {0}, end = {1}", Block.Parent, Block.End); + P.formatLine("code size = {0}, addr = {1}", Block.CodeSize, formatSegmentOffset(Block.Segment, Block.CodeOffset)); - P.formatLine("code size = {0}, end = {1}", Block.CodeSize, Block.End); return Error::success(); } Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Thunk32Sym &Thunk) { P.format(" `{0}`", Thunk.Name); - AutoIndent Indent(P); - P.formatLine("parent = {0}, addr = {1}", Thunk.Parent, - formatSegmentOffset(Thunk.Segment, Thunk.Offset)); - P.formatLine("kind = {0}, size = {1}, end = {2}, next = {3}", - formatThunkOrdinal(Thunk.Thunk), Thunk.Length, Thunk.End, + AutoIndent Indent(P, 7); + ; + P.formatLine("parent = {0}, end = {1}, next = {2}", Thunk.Parent, Thunk.End, Thunk.Next); + P.formatLine("kind = {0}, size = {1}, addr = {2}", + formatThunkOrdinal(Thunk.Thunk), Thunk.Length, + formatSegmentOffset(Thunk.Segment, Thunk.Offset)); return Error::success(); } Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, TrampolineSym &Tramp) { - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("type = {0}, size = {1}, source = {2}, target = {3}", formatTrampolineType(Tramp.Type), Tramp.Size, formatSegmentOffset(Tramp.ThunkSection, Tramp.ThunkOffset), @@ -427,7 +436,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, SectionSym &Section) { P.format(" `{0}`", Section.Name); - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("length = {0}, alignment = {1}, rva = {2}, section # = {3}, " "characteristics = {4}", Section.Length, Section.Alignment, Section.Rva, @@ -437,7 +447,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, CoffGroupSym &CG) { P.format(" `{0}`", CG.Name); - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("length = {0}, addr = {1}, characteristics = {2}", CG.Size, formatSegmentOffset(CG.Segment, CG.Offset), CG.Characteristics); return Error::success(); @@ -446,7 +457,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, CoffGroupSym &CG) { Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, BPRelativeSym &BPRel) { P.format(" `{0}`", BPRel.Name); - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("type = {0}, offset = {1}", typeIndex(BPRel.Type), BPRel.Offset); return Error::success(); } @@ -459,7 +471,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, CallSiteInfoSym &CSI) { - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("type = {0}, addr = {1}", typeIndex(CSI.Type), formatSegmentOffset(CSI.Segment, CSI.CodeOffset)); return Error::success(); @@ -467,6 +480,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, EnvBlockSym &EnvBlock) { + AutoIndent Indent(P, 7); + ; for (const auto &Entry : EnvBlock.Fields) { P.formatLine("- {0}", Entry); } @@ -475,7 +490,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, FileStaticSym &FS) { P.format(" `{0}`", FS.Name); - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("type = {0}, file name offset = {1}, flags = {2}", typeIndex(FS.Index), FS.ModFilenameOffset, formatLocalSymFlags(P.getIndentLevel() + 9, FS.Flags)); @@ -484,7 +500,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, FileStaticSym &FS) { Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, ExportSym &Export) { P.format(" `{0}`", Export.Name); - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("ordinal = {0}, flags = {1}", Export.Ordinal, formatExportFlags(P.getIndentLevel() + 9, Export.Flags)); return Error::success(); @@ -492,7 +509,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, ExportSym &Export) { Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Compile2Sym &Compile2) { - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; SourceLanguage Lang = static_cast( Compile2.Flags & CompileSym2Flags::SourceLanguageMask); P.formatLine("machine = {0}, ver = {1}, language = {2}", @@ -512,7 +530,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Compile3Sym &Compile3) { - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; SourceLanguage Lang = static_cast( Compile3.Flags & CompileSym3Flags::SourceLanguageMask); P.formatLine("machine = {0}, Ver = {1}, language = {2}", @@ -531,7 +550,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, ConstantSym &Constant) { P.format(" `{0}`", Constant.Name); - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("type = {0}, value = {1}", typeIndex(Constant.Type), Constant.Value.toString(10)); return Error::success(); @@ -539,7 +559,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, DataSym &Data) { P.format(" `{0}`", Data.Name); - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("type = {0}, addr = {1}", typeIndex(Data.Type), formatSegmentOffset(Data.Segment, Data.DataOffset)); return Error::success(); @@ -553,7 +574,8 @@ Error MinimalSymbolDumper::visitKnownRecord( Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, DefRangeFramePointerRelSym &Def) { - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("offset = {0}, range = {1}", Def.Offset, formatRange(Def.Range)); P.formatLine("gaps = {2}", Def.Offset, formatGaps(P.getIndentLevel() + 9, Def.Gaps)); @@ -562,7 +584,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, DefRangeRegisterRelSym &Def) { - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("register = {0}, base ptr = {1}, offset in parent = {2}, has " "spilled udt = {3}", uint16_t(Def.Hdr.Register), int32_t(Def.Hdr.BasePointerOffset), @@ -574,7 +597,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Error MinimalSymbolDumper::visitKnownRecord( CVSymbol &CVR, DefRangeRegisterSym &DefRangeRegister) { - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("register = {0}, may have no name = {1}, range start = " "{2}, length = {3}", uint16_t(DefRangeRegister.Hdr.Register), @@ -589,7 +613,8 @@ Error MinimalSymbolDumper::visitKnownRecord( Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, DefRangeSubfieldRegisterSym &Def) { - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; bool NoName = !!(Def.Hdr.MayHaveNoName == 0); P.formatLine("register = {0}, may have no name = {1}, offset in parent = {2}", uint16_t(Def.Hdr.Register), NoName, @@ -601,7 +626,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, DefRangeSubfieldSym &Def) { - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("program = {0}, offset in parent = {1}, range = {2}", Def.Program, Def.OffsetInParent, formatRange(Def.Range)); P.formatLine("gaps = {0}", formatGaps(P.getIndentLevel() + 9, Def.Gaps)); @@ -609,7 +635,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, } Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, DefRangeSym &Def) { - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("program = {0}, range = {1}", Def.Program, formatRange(Def.Range)); P.formatLine("gaps = {0}", formatGaps(P.getIndentLevel() + 9, Def.Gaps)); @@ -617,7 +644,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, DefRangeSym &Def) { } Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, FrameCookieSym &FC) { - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("code offset = {0}, Register = {1}, kind = {2}, flags = {3}", FC.CodeOffset, FC.Register, formatCookieKind(FC.CookieKind), FC.Flags); @@ -625,7 +653,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, FrameCookieSym &FC) { } Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, FrameProcSym &FP) { - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("size = {0}, padding size = {1}, offset to padding = {2}", FP.TotalFrameBytes, FP.PaddingFrameBytes, FP.OffsetToPadding); P.formatLine("bytes of callee saved registers = {0}, exception handler addr " @@ -640,7 +669,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, FrameProcSym &FP) { Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, HeapAllocationSiteSym &HAS) { - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("type = {0}, addr = {1} call size = {2}", typeIndex(HAS.Type), formatSegmentOffset(HAS.Segment, HAS.CodeOffset), HAS.CallInstructionSize); @@ -648,7 +678,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, } Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, InlineSiteSym &IS) { - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; auto Bytes = makeArrayRef(IS.AnnotationData); StringRef Annotations(reinterpret_cast(Bytes.begin()), Bytes.size()); @@ -662,7 +693,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, InlineSiteSym &IS) { Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, RegisterSym &Register) { P.format(" `{0}`", Register.Name); - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("register = {0}, type = {1}", formatRegisterId(Register.Register), typeIndex(Register.Index)); return Error::success(); @@ -671,7 +703,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, PublicSym32 &Public) { P.format(" `{0}`", Public.Name); - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("flags = {0}, addr = {1}", formatPublicSymFlags(P.getIndentLevel() + 9, Public.Flags), formatSegmentOffset(Public.Segment, Public.Offset)); @@ -680,7 +713,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, ProcRefSym &PR) { P.format(" `{0}`", PR.Name); - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("module = {0}, sum name = {1}, offset = {2}", PR.Module, PR.SumName, PR.SymOffset); return Error::success(); @@ -689,7 +723,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, ProcRefSym &PR) { Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, LabelSym &Label) { P.format(" `{0}` (addr = {1})", Label.Name, formatSegmentOffset(Label.Segment, Label.CodeOffset)); - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("flags = {0}", formatProcSymFlags(P.getIndentLevel() + 9, Label.Flags)); return Error::success(); @@ -697,7 +732,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, LabelSym &Label) { Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, LocalSym &Local) { P.format(" `{0}`", Local.Name); - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; std::string FlagStr = formatLocalSymFlags(P.getIndentLevel() + 9, Local.Flags); @@ -713,10 +749,12 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, ProcSym &Proc) { P.format(" `{0}`", Proc.Name); - AutoIndent Indent(P); - P.formatLine("parent = {0}, addr = {1}, code size = {2}, end = {3}", - Proc.Parent, formatSegmentOffset(Proc.Segment, Proc.CodeOffset), - Proc.CodeSize, Proc.End); + AutoIndent Indent(P, 7); + ; + P.formatLine("parent = {0}, end = {1}, addr = {2}, code size = {3}", + Proc.Parent, Proc.End, + formatSegmentOffset(Proc.Segment, Proc.CodeOffset), + Proc.CodeSize); P.formatLine("debug start = {0}, debug end = {1}, flags = {2}", Proc.DbgStart, Proc.DbgEnd, formatProcSymFlags(P.getIndentLevel() + 9, Proc.Flags)); @@ -729,7 +767,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, } Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, CallerSym &Caller) { - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; for (const auto &I : Caller.Indices) { P.formatLine("callee: {0}", typeIndex(I)); } @@ -739,7 +778,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, CallerSym &Caller) { Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, RegRelativeSym &RegRel) { P.format(" `{0}`", RegRel.Name); - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("type = {0}, register = {1}, offset = {2}", typeIndex(RegRel.Type), formatRegisterId(RegRel.Register), RegRel.Offset); @@ -749,7 +789,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, ThreadLocalDataSym &Data) { P.format(" `{0}`", Data.Name); - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("type = {0}, addr = {1}", typeIndex(Data.Type), formatSegmentOffset(Data.Segment, Data.DataOffset)); return Error::success(); @@ -757,7 +798,8 @@ Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, Error MinimalSymbolDumper::visitKnownRecord(CVSymbol &CVR, UDTSym &UDT) { P.format(" `{0}`", UDT.Name); - AutoIndent Indent(P); + AutoIndent Indent(P, 7); + ; P.formatLine("original type = {0}", UDT.Type); return Error::success(); } diff --git a/tools/llvm-pdbutil/MinimalSymbolDumper.h b/tools/llvm-pdbutil/MinimalSymbolDumper.h index 451f2da6fd1..5e30959ea9c 100644 --- a/tools/llvm-pdbutil/MinimalSymbolDumper.h +++ b/tools/llvm-pdbutil/MinimalSymbolDumper.h @@ -27,6 +27,7 @@ public: : P(P), Types(Types) {} Error visitSymbolBegin(codeview::CVSymbol &Record) override; + Error visitSymbolBegin(codeview::CVSymbol &Record, uint32_t Offset) override; Error visitSymbolEnd(codeview::CVSymbol &Record) override; #define SYMBOL_RECORD(EnumName, EnumVal, Name) \