diff options
author | David Majnemer <david.majnemer@gmail.com> | 2016-02-04 17:37:30 +0000 |
---|---|---|
committer | David Majnemer <david.majnemer@gmail.com> | 2016-02-04 17:37:30 +0000 |
commit | 4d123512a27dde92994302267651bfbc10c63e0c (patch) | |
tree | ba7984f92752be40f4fc666a062eb54401109ad1 | |
parent | 6f01e05d7e184870d3287ade1ca2bdcccc025052 (diff) | |
download | bcm5719-llvm-4d123512a27dde92994302267651bfbc10c63e0c.tar.gz bcm5719-llvm-4d123512a27dde92994302267651bfbc10c63e0c.zip |
Add support for S_DEFRANGE and S_DEFRANGE_SUBFIELD
llvm-svn: 259805
-rw-r--r-- | llvm/include/llvm/DebugInfo/CodeView/SymbolRecord.h | 15 | ||||
-rw-r--r-- | llvm/tools/llvm-readobj/COFFDumper.cpp | 29 |
2 files changed, 42 insertions, 2 deletions
diff --git a/llvm/include/llvm/DebugInfo/CodeView/SymbolRecord.h b/llvm/include/llvm/DebugInfo/CodeView/SymbolRecord.h index 28e6158f149..c01b7baa2aa 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/SymbolRecord.h +++ b/llvm/include/llvm/DebugInfo/CodeView/SymbolRecord.h @@ -123,6 +123,21 @@ struct LocalVariableAddrGap { ulittle16_t Range; }; +// S_DEFRANGE +struct DefRangeSym { + ulittle32_t Program; + LocalVariableAddrRange Range; + // LocalVariableAddrGap Gaps[]; +}; + +// S_DEFRANGE_SUBFIELD +struct DefRangeSubfieldSym { + ulittle32_t Program; + ulittle16_t OffsetInParent; + LocalVariableAddrRange Range; + // LocalVariableAddrGap Gaps[]; +}; + // S_DEFRANGE_REGISTER struct DefRangeRegisterSym { ulittle16_t Register; diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp index 1d773b1195d..078e0b16dea 100644 --- a/llvm/tools/llvm-readobj/COFFDumper.cpp +++ b/llvm/tools/llvm-readobj/COFFDumper.cpp @@ -92,7 +92,7 @@ private: void printLocalVariableAddrRange(const LocalVariableAddrRange &Range, const coff_section *Sec, StringRef SectionContents); - void printLocalVariableAddrGap(StringRef SymData); + void printLocalVariableAddrGap(StringRef &SymData); void printCodeViewSymbolsSubsection(StringRef Subsection, const SectionRef &Section, @@ -1503,6 +1503,31 @@ void COFFDumper::printCodeViewSymbolsSubsection(StringRef Subsection, break; } + case S_DEFRANGE: { + DictScope S(W, "DefRange"); + const DefRangeSym *DefRange; + error(consumeObject(SymData, DefRange)); + W.printString( + "Program", + CVStringTable.drop_front(DefRange->Program).split('\0').first); + printLocalVariableAddrRange(DefRange->Range, Sec, SectionContents); + printLocalVariableAddrGap(SymData); + break; + } + case S_DEFRANGE_SUBFIELD: { + DictScope S(W, "DefRangeSubfield"); + const DefRangeSubfieldSym *DefRangeSubfield; + error(consumeObject(SymData, DefRangeSubfield)); + W.printString("Program", + CVStringTable.drop_front(DefRangeSubfield->Program) + .split('\0') + .first); + W.printNumber("OffsetInParent", DefRangeSubfield->OffsetInParent); + printLocalVariableAddrRange(DefRangeSubfield->Range, Sec, + SectionContents); + printLocalVariableAddrGap(SymData); + break; + } case S_DEFRANGE_REGISTER: { DictScope S(W, "DefRangeRegister"); const DefRangeRegisterSym *DefRangeRegister; @@ -1882,7 +1907,7 @@ void COFFDumper::printLocalVariableAddrRange( W.printNumber("Range", Range.Range); } -void COFFDumper::printLocalVariableAddrGap(StringRef SymData) { +void COFFDumper::printLocalVariableAddrGap(StringRef &SymData) { while (!SymData.empty()) { const LocalVariableAddrGap *Gap; error(consumeObject(SymData, Gap)); |