summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Majnemer <david.majnemer@gmail.com>2016-02-04 17:37:30 +0000
committerDavid Majnemer <david.majnemer@gmail.com>2016-02-04 17:37:30 +0000
commit4d123512a27dde92994302267651bfbc10c63e0c (patch)
treeba7984f92752be40f4fc666a062eb54401109ad1
parent6f01e05d7e184870d3287ade1ca2bdcccc025052 (diff)
downloadbcm5719-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.h15
-rw-r--r--llvm/tools/llvm-readobj/COFFDumper.cpp29
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));
OpenPOWER on IntegriCloud