Go to the documentation of this file.
33 : Types(Types), ObjDelegate(ObjDelegate),
W(
W), CompilationCPUType(CPU),
34 PrintRecordBytes(PrintRecordBytes), InFunctionScope(
false) {}
37 #define SYMBOL_RECORD(EnumName, EnumVal, Name) \
38 Error visitKnownRecord(CVSymbol &CVR, Name &Record) override;
39 #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
40 #include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
46 CPUType getCompilationCPUType()
const {
return CompilationCPUType; }
61 bool PrintRecordBytes;
68 #define SYMBOL_RECORD(EnumName, EnumVal, Name) \
71 #include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
78 void CVSymbolDumperImpl::printLocalVariableAddrRange(
82 ObjDelegate->printRelocatedField(
"OffsetStart", RelocationOffset,
85 W.printHex(
"Range", Range.
Range);
88 void CVSymbolDumperImpl::printLocalVariableAddrGap(
90 for (
auto &Gap : Gaps) {
92 W.printHex(
"GapStartOffset", Gap.GapStartOffset);
93 W.printHex(
"Range", Gap.Range);
103 W.getOStream() <<
" {\n";
110 if (PrintRecordBytes && ObjDelegate)
111 ObjDelegate->printBinaryBlockWithRelocs(
"SymData", CVR.
content());
114 W.startLine() <<
"}\n";
120 W.printHex(
"PtrParent",
Block.Parent);
121 W.printHex(
"PtrEnd",
Block.End);
122 W.printHex(
"CodeSize",
Block.CodeSize);
124 ObjDelegate->printRelocatedField(
"CodeOffset",
Block.getRelocationOffset(),
125 Block.CodeOffset, &LinkageName);
127 W.printHex(
"Segment",
Block.Segment);
128 W.printString(
"BlockName",
Block.Name);
129 W.printString(
"LinkageName", LinkageName);
134 W.printString(
"Name",
Thunk.Name);
135 W.printNumber(
"Parent",
Thunk.Parent);
136 W.printNumber(
"End",
Thunk.End);
137 W.printNumber(
"Next",
Thunk.Next);
138 W.printNumber(
"Off",
Thunk.Offset);
139 W.printNumber(
"Seg",
Thunk.Segment);
140 W.printNumber(
"Len",
Thunk.Length);
148 W.printNumber(
"Size", Tramp.
Size);
157 W.printNumber(
"SectionNumber",
Section.SectionNumber);
158 W.printNumber(
"Alignment",
Section.Alignment);
160 W.printNumber(
"Length",
Section.Length);
161 W.printFlags(
"Characteristics",
Section.Characteristics,
165 W.printString(
"Name",
Section.Name);
172 W.printFlags(
"Characteristics",
CoffGroup.Characteristics,
183 W.printNumber(
"Offset", BPRel.
Offset);
185 W.printString(
"VarName", BPRel.
Name);
199 ObjDelegate->printRelocatedField(
"CodeOffset",
203 W.printHex(
"Segment", CallSiteInfo.
Segment);
206 W.printString(
"LinkageName", LinkageName);
213 for (
auto Entry : EnvBlock.
Fields) {
214 W.printString(Entry);
222 W.printNumber(
"ModFilenameOffset",
FileStatic.ModFilenameOffset);
229 W.printNumber(
"Ordinal",
Export.Ordinal);
231 W.printString(
"Name",
Export.Name);
240 CompilationCPUType = Compile2.
Machine;
241 std::string FrontendVersion;
247 std::string BackendVersion;
253 W.printString(
"FrontendVersion", FrontendVersion);
254 W.printString(
"BackendVersion", BackendVersion);
255 W.printString(
"VersionName", Compile2.
Version);
265 CompilationCPUType = Compile3.
Machine;
266 std::string FrontendVersion;
273 std::string BackendVersion;
280 W.printString(
"FrontendVersion", FrontendVersion);
281 W.printString(
"BackendVersion", BackendVersion);
282 W.printString(
"VersionName", Compile3.
Version);
297 ObjDelegate->printRelocatedField(
"DataOffset",
Data.getRelocationOffset(),
298 Data.DataOffset, &LinkageName);
301 W.printString(
"DisplayName",
Data.Name);
303 W.printString(
"LinkageName", LinkageName);
310 W.printNumber(
"Offset", DefRangeFramePointerRelFullScope.
Offset);
316 W.printNumber(
"Offset", DefRangeFramePointerRel.
Hdr.
Offset);
317 printLocalVariableAddrRange(DefRangeFramePointerRel.
Range,
319 printLocalVariableAddrGap(DefRangeFramePointerRel.
Gaps);
327 W.printBoolean(
"HasSpilledUDTMember",
331 printLocalVariableAddrRange(DefRangeRegisterRel.
Range,
333 printLocalVariableAddrGap(DefRangeRegisterRel.
Gaps);
342 printLocalVariableAddrRange(DefRangeRegister.
Range,
344 printLocalVariableAddrGap(DefRangeRegister.
Gaps);
354 printLocalVariableAddrRange(DefRangeSubfieldRegister.
Range,
356 printLocalVariableAddrGap(DefRangeSubfieldRegister.
Gaps);
364 auto ExpectedProgram = Strings.getString(DefRangeSubfield.
Program);
365 if (!ExpectedProgram) {
367 return llvm::make_error<CodeViewError>(
368 "String table offset outside of bounds of String Table!");
370 W.printString(
"Program", *ExpectedProgram);
373 printLocalVariableAddrRange(DefRangeSubfield.
Range,
375 printLocalVariableAddrGap(DefRangeSubfield.
Gaps);
383 auto ExpectedProgram = Strings.getString(DefRange.
Program);
384 if (!ExpectedProgram) {
386 return llvm::make_error<CodeViewError>(
387 "String table offset outside of bounds of String Table!");
389 W.printString(
"Program", *ExpectedProgram);
392 printLocalVariableAddrGap(DefRange.
Gaps);
400 ObjDelegate->printRelocatedField(
"CodeOffset",
408 W.printHex(
"Flags", FrameCookie.
Flags);
417 W.printHex(
"BytesOfCalleeSavedRegisters",
420 W.printHex(
"SectionIdOfExceptionHandler",
424 W.printEnum(
"LocalFramePtrReg",
427 W.printEnum(
"ParamFramePtrReg",
437 ObjDelegate->printRelocatedField(
"CodeOffset",
441 W.printHex(
"Segment", HeapAllocSite.
Segment);
445 W.printString(
"LinkageName", LinkageName);
455 ListScope BinaryAnnotations(
W,
"BinaryAnnotations");
456 for (
auto &Annotation :
InlineSite.annotations()) {
459 W.printString(
"(Annotation Padding)");
479 W.printHex(
"ChangeFile",
480 ObjDelegate->getFileNameForFileOffset(
Annotation.U1),
488 W.startLine() <<
"ChangeCodeOffsetAndLineOffset: {CodeOffset: "
494 W.startLine() <<
"ChangeCodeLengthAndCodeOffset: {CodeOffset: "
515 W.printNumber(
"Seg",
Public.Segment);
516 W.printNumber(
"Off",
Public.Offset);
517 W.printString(
"Name",
Public.Name);
522 W.printNumber(
"SumName", ProcRef.
SumName);
523 W.printNumber(
"SymOffset", ProcRef.
SymOffset);
524 W.printNumber(
"Mod", ProcRef.
Module);
525 W.printString(
"Name", ProcRef.
Name);
532 ObjDelegate->printRelocatedField(
"CodeOffset",
Label.getRelocationOffset(),
533 Label.CodeOffset, &LinkageName);
535 W.printHex(
"Segment",
Label.Segment);
536 W.printHex(
"Flags", uint8_t(
Label.Flags));
538 W.printString(
"DisplayName",
Label.Name);
540 W.printString(
"LinkageName", LinkageName);
547 W.printString(
"VarName",
Local.Name);
553 W.printString(
"ObjectName", ObjName.
Name);
559 return llvm::make_error<CodeViewError>(
560 "Visiting a ProcSym while inside function scope!");
562 InFunctionScope =
true;
565 W.printHex(
"PtrParent", Proc.
Parent);
566 W.printHex(
"PtrEnd", Proc.
End);
567 W.printHex(
"PtrNext", Proc.
Next);
570 W.printHex(
"DbgEnd", Proc.
DbgEnd);
576 W.printHex(
"Segment", Proc.
Segment);
577 W.printFlags(
"Flags",
static_cast<uint8_t
>(Proc.
Flags),
579 W.printString(
"DisplayName", Proc.
Name);
581 W.printString(
"LinkageName", LinkageName);
587 InFunctionScope =
false;
593 for (
auto FuncID :
Caller.Indices)
600 W.printHex(
"Offset",
RegRel.Offset);
604 W.printString(
"VarName",
RegRel.Name);
612 ObjDelegate->printRelocatedField(
"DataOffset",
Data.getRelocationOffset(),
613 Data.DataOffset, &LinkageName);
616 W.printString(
"DisplayName",
Data.Name);
618 W.printString(
"LinkageName", LinkageName);
624 W.printString(
"UDTName",
UDT.Name);
630 W.printString(
"Namespace", UN.
Name);
637 W.printHex(
"Segment", Annot.
Segment);
646 Error CVSymbolDumperImpl::visitUnknownSymbol(
CVSymbol &CVR) {
647 W.printNumber(
"Length", CVR.
length());
654 CVSymbolDumperImpl Dumper(Types, ObjDelegate.get(), W, CompilationCPUType,
661 CompilationCPUType = Dumper.getCompilationCPUType();
668 CVSymbolDumperImpl Dumper(Types, ObjDelegate.get(), W, CompilationCPUType,
675 CompilationCPUType = Dumper.getCompilationCPUType();
FrameCookieKind CookieKind
This is an optimization pass for GlobalISel generic memory operations.
uint16_t VersionFrontendMajor
std::tuple< uint64_t, uint32_t > InlineSite
uint32_t getRelocationOffset() const
LocalVariableAddrRange Range
FrameProcedureOptions Flags
ArrayRef< EnumEntry< uint32_t > > getCompileSym3FlagNames()
SymbolKind
Duplicate copy of the above enum, but using the official CV names.
A raw_ostream that writes to an std::string.
std::vector< LocalVariableAddrGap > Gaps
DefRangeSubfieldRegisterHeader Hdr
static ErrorSuccess success()
Create a success value.
uint32_t getRelocationOffset() const
ArrayRef< EnumEntry< uint16_t > > getLocalFlagNames()
uint16_t VersionBackendBuild
static Error visitKnownRecord(CVSymbol &Record, SymbolVisitorCallbacks &Callbacks)
ArrayRef< EnumEntry< COFF::SectionCharacteristics > > getImageSectionCharacteristicNames()
void consumeError(Error Err)
Consume a Error without doing anything.
DefRangeRegisterHeader Hdr
uint8_t getLanguage() const
static StringRef getSymbolKindName(SymbolKind Kind)
void printTypeIndex(ScopedPrinter &Printer, StringRef FieldName, TypeIndex TI, TypeCollection &Types)
uint16_t VersionFrontendMajor
uint16_t VersionFrontendMinor
ArrayRef< EnumEntry< uint8_t > > getThunkOrdinalNames()
uint16_t VersionBackendBuild
uint16_t VersionFrontendMinor
std::vector< StringRef > Fields
Error visitSymbolStream(const CVSymbolArray &Symbols)
CompileSym3Flags getFlags() const
uint16_t VersionFrontendQFE
ArrayRef< EnumEntry< uint32_t > > getPublicSymFlagNames()
std::vector< LocalVariableAddrGap > Gaps
LocalVariableAddrRange Range
uint32_t OffsetOfExceptionHandler
ArrayRef< EnumEntry< uint8_t > > getProcSymFlagNames()
LocalVariableAddrRange Range
ArrayRef< EnumEntry< unsigned > > getCPUTypeNames()
uint32_t BytesOfCalleeSavedRegisters
Error dump(CVRecord< SymbolKind > &Record)
Dumps one type record.
uint32_t getFlags() const
Value(Type *Ty, unsigned scid)
std::vector< LocalVariableAddrGap > Gaps
This is an important base class in LLVM.
SourceLanguage getLanguage() const
uint16_t VersionFrontendBuild
uint16_t CallInstructionSize
DefRangeRegisterRelHeader Hdr
uint32_t getRelocationOffset() const
uint16_t VersionBackendMinor
LocalVariableAddrRange Range
ArrayRef< EnumEntry< uint8_t > > getFrameCookieKindNames()
void addCallbackToPipeline(SymbolVisitorCallbacks &Callbacks)
ArrayRef< EnumEntry< SymbolKind > > getSymbolTypeNames()
uint32_t getRelocationOffset() const
ArrayRef< uint8_t > content() const
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
uint16_t VersionBackendMajor
StringRef - Represent a constant reference to a string, i.e.
CVRecord is a fat pointer (base + size pair) to a symbol or type record.
ArrayRef< EnumEntry< SourceLanguage > > getSourceLanguageNames()
std::vector< LocalVariableAddrGap > Gaps
uint16_t VersionBackendMinor
uint32_t getRelocationOffset() const
uint32_t getRelocationOffset() const
add sub stmia L5 ldr r0 bl L_printf $stub Instead of a and a wouldn t it be better to do three moves *Return an aggregate type is even return S
uint32_t PaddingFrameBytes
std::vector< LocalVariableAddrGap > Gaps
RegisterId getParamFramePtrReg(CPUType CPU) const
Extract the register this frame uses to refer to parameters.
@ ChangeCodeLengthAndCodeOffset
Wrapper class representing virtual and physical registers.
ArrayRef< EnumEntry< uint16_t > > getTrampolineNames()
std::vector< StringRef > Strings
uint32_t getRelocationOffset() const
RegisterId getLocalFramePtrReg(CPUType CPU) const
Extract the register this frame uses to refer to local variables.
Lightweight error class with error context and mandatory checking.
CPUType
These values correspond to the CV_CPU_TYPE_e enumeration, and are documented here: https://msdn....
ArrayRef< EnumEntry< uint32_t > > getFrameProcSymFlagNames()
Error visitSymbolRecord(CVSymbol &Record)
uint16_t VersionBackendQFE
uint16_t offsetInParent() const
ArrayRef< EnumEntry< uint32_t > > getCompileSym2FlagNames()
std::vector< LocalVariableAddrGap > Gaps
uint32_t getRelocationOffset() const
Represents a read-only view of a CodeView string table.
uint16_t SectionIdOfExceptionHandler
bool hasSpilledUDTMember() const
uint16_t VersionFrontendBuild
DefRangeFramePointerRelHeader Hdr
uint16_t VersionBackendMajor
uint32_t getRelocationOffset() const
@ ChangeCodeOffsetAndLineOffset
ArrayRef< EnumEntry< uint16_t > > getExportSymFlagNames()
uint32_t getRelocationOffset() const
LocalVariableAddrRange Range
constexpr Register(unsigned Val=0)
LocalVariableAddrRange Range
ArrayRef< EnumEntry< uint16_t > > getRegisterNames(CPUType Cpu)