mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-22 18:54:02 +01:00
[llvm-pdbutil] Output the symbol offset when dumping.
Type records have a unique type index, but symbol records do not. Instead, symbol records refer to other symbol records by referencing their offset in the symbol stream. In a sense this is the analogue of the TypeIndex, but we are not printing it in the dumper. Printing it not only gives us more useful information when manually investigating the contents of a PDB, but also allows us to write better tests by enabling us to verify that fields that reference other symbol records do so correctly. Differential Revision: https://reviews.llvm.org/D34906 llvm-svn: 306890
This commit is contained in:
parent
0271f6ebc2
commit
3d6950d915
@ -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;
|
||||
|
@ -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<MappingInfo>(Record.content(), Container);
|
||||
|
@ -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))
|
||||
|
@ -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(); }
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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)));
|
||||
|
||||
|
@ -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<SourceLanguage>(
|
||||
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<SourceLanguage>(
|
||||
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<const char *>(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();
|
||||
}
|
||||
|
@ -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) \
|
||||
|
Loading…
Reference in New Issue
Block a user