Add support for S_DEFRANGE and S_DEFRANGE_SUBFIELD

llvm-svn: 259805
This commit is contained in:
David Majnemer 2016-02-04 17:37:30 +00:00
parent 6f01e05d7e
commit 4d123512a2
2 changed files with 42 additions and 2 deletions

View File

@ -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;

View File

@ -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));