diff options
author | David Majnemer <david.majnemer@gmail.com> | 2016-02-03 22:36:46 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2016-02-03 22:36:46 +0000 |
commit | ac10cfde97c4bf7ee8022704417eee51f461ac4f (patch) | |
tree | 5e730ad26379c10fad72cb2ff36b55f432713260 /llvm/tools/llvm-readobj/COFFDumper.cpp | |
parent | 354809e139f532ec8ecbf7e7b31a9de9fada46ed (diff) | |
download | bcm5719-llvm-ac10cfde97c4bf7ee8022704417eee51f461ac4f.tar.gz bcm5719-llvm-ac10cfde97c4bf7ee8022704417eee51f461ac4f.zip |
[llvm-readobj] Add support for dumping S_DEFRANGE symbols
llvm-svn: 259719
Diffstat (limited to 'llvm/tools/llvm-readobj/COFFDumper.cpp')
-rw-r--r-- | llvm/tools/llvm-readobj/COFFDumper.cpp | 85 |
1 files changed, 84 insertions, 1 deletions
diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp index 8c308f60592..69043d076c3 100644 --- a/llvm/tools/llvm-readobj/COFFDumper.cpp +++ b/llvm/tools/llvm-readobj/COFFDumper.cpp @@ -89,6 +89,8 @@ private: StringRef getFileNameForFileOffset(uint32_t FileOffset); void printFileNameForOffset(StringRef Label, uint32_t FileOffset); void printTypeIndex(StringRef FieldName, TypeIndex TI); + void printLocalVariableAddrRange(const LocalVariableAddrRange &Range); + void printLocalVariableAddrGap(const LocalVariableAddrGap &Gap); void printCodeViewSymbolsSubsection(StringRef Subsection, const SectionRef &Section, @@ -1499,6 +1501,75 @@ void COFFDumper::printCodeViewSymbolsSubsection(StringRef Subsection, break; } + case S_DEFRANGE_REGISTER: { + DictScope S(W, "DefRangeRegister"); + const DefRangeRegisterSym *DefRangeRegister; + error(consumeObject(SymData, DefRangeRegister)); + W.printNumber("Register", DefRangeRegister->Register); + W.printNumber("MayHaveNoName", DefRangeRegister->MayHaveNoName); + printLocalVariableAddrRange(DefRangeRegister->Range); + while (!SymData.empty()) { + const LocalVariableAddrGap *Gap; + error(consumeObject(SymData, Gap)); + printLocalVariableAddrGap(*Gap); + } + break; + } + case S_DEFRANGE_SUBFIELD_REGISTER: { + DictScope S(W, "DefRangeSubfieldRegister"); + const DefRangeSubfieldRegisterSym *DefRangeSubfieldRegisterSym; + error(consumeObject(SymData, DefRangeSubfieldRegisterSym)); + W.printNumber("Register", DefRangeSubfieldRegisterSym->Register); + W.printNumber("MayHaveNoName", + DefRangeSubfieldRegisterSym->MayHaveNoName); + W.printNumber("OffsetInParent", + DefRangeSubfieldRegisterSym->OffsetInParent); + printLocalVariableAddrRange(DefRangeSubfieldRegisterSym->Range); + while (!SymData.empty()) { + const LocalVariableAddrGap *Gap; + error(consumeObject(SymData, Gap)); + printLocalVariableAddrGap(*Gap); + } + break; + } + case S_DEFRANGE_FRAMEPOINTER_REL: { + DictScope S(W, "DefRangeFramePointerRel"); + const DefRangeFramePointerRelSym *DefRangeFramePointerRel; + error(consumeObject(SymData, DefRangeFramePointerRel)); + W.printNumber("Offset", DefRangeFramePointerRel->Offset); + printLocalVariableAddrRange(DefRangeFramePointerRel->Range); + while (!SymData.empty()) { + const LocalVariableAddrGap *Gap; + error(consumeObject(SymData, Gap)); + printLocalVariableAddrGap(*Gap); + } + break; + } + case S_DEFRANGE_FRAMEPOINTER_REL_FULL_SCOPE: { + DictScope S(W, "DefRangeFramePointerRelFullScope"); + const DefRangeFramePointerRelFullScopeSym + *DefRangeFramePointerRelFullScope; + error(consumeObject(SymData, DefRangeFramePointerRelFullScope)); + W.printNumber("Offset", DefRangeFramePointerRelFullScope->Offset); + break; + } + case S_DEFRANGE_REGISTER_REL: { + DictScope S(W, "DefRangeRegisterRel"); + const DefRangeRegisterRelSym *DefRangeRegisterRel; + error(consumeObject(SymData, DefRangeRegisterRel)); + W.printNumber("BaseRegister", DefRangeRegisterRel->BaseRegister); + W.printBoolean("HasSpilledUDTMember", + DefRangeRegisterRel->hasSpilledUDTMember()); + W.printNumber("OffsetInParent", DefRangeRegisterRel->offsetInParent()); + printLocalVariableAddrRange(DefRangeRegisterRel->Range); + while (!SymData.empty()) { + const LocalVariableAddrGap *Gap; + error(consumeObject(SymData, Gap)); + printLocalVariableAddrGap(*Gap); + } + break; + } + case S_CALLSITEINFO: { DictScope S(W, "CallSiteInfo"); const CallSiteInfoSym *CallSiteInfo; @@ -1650,7 +1721,7 @@ void COFFDumper::printCodeViewSymbolsSubsection(StringRef Subsection, DictScope S(W, "BPRelativeSym"); const BPRelativeSym *BPRel; error(consumeObject(SymData, BPRel)); - W.printHex("Offset", BPRel->Offset); + W.printNumber("Offset", BPRel->Offset); printTypeIndex("Type", BPRel->Type); StringRef VarName = SymData.split('\0').first; W.printString("VarName", VarName); @@ -1812,6 +1883,18 @@ void COFFDumper::printTypeIndex(StringRef FieldName, TypeIndex TI) { W.printHex(FieldName, TI.getIndex()); } +void COFFDumper::printLocalVariableAddrRange( + const LocalVariableAddrRange &Range) { + W.printNumber("OffsetStart", Range.OffsetStart); + W.printNumber("ISectStart", Range.ISectStart); + W.printNumber("Range", Range.Range); +} + +void COFFDumper::printLocalVariableAddrGap(const LocalVariableAddrGap &Gap) { + W.printNumber("GapStartOffset", Gap.GapStartOffset); + W.printNumber("Range", Gap.Range); +} + StringRef COFFDumper::getFileNameForFileOffset(uint32_t FileOffset) { // The file checksum subsection should precede all references to it. if (!CVFileChecksumTable.data() || !CVStringTable.data()) |