Add support for S_DEFRANGE and S_DEFRANGE_SUBFIELD
authorDavid Majnemer <david.majnemer@gmail.com>
Thu, 4 Feb 2016 17:37:30 +0000 (17:37 +0000)
committerDavid Majnemer <david.majnemer@gmail.com>
Thu, 4 Feb 2016 17:37:30 +0000 (17:37 +0000)
llvm-svn: 259805

llvm/include/llvm/DebugInfo/CodeView/SymbolRecord.h
llvm/tools/llvm-readobj/COFFDumper.cpp

index 28e6158..c01b7ba 100644 (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;
index 1d773b1..078e0b1 100644 (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));