diff --git a/llvm/include/llvm/DebugInfo/CodeView/SymbolRecord.h b/llvm/include/llvm/DebugInfo/CodeView/SymbolRecord.h index 28e6158f149c..c01b7baa2aa7 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 1d773b1195d1..078e0b16dea0 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));