DWARF: wire up .debug_str dumping.
authorBenjamin Kramer <benny.kra@googlemail.com>
Thu, 15 Sep 2011 16:57:13 +0000 (16:57 +0000)
committerBenjamin Kramer <benny.kra@googlemail.com>
Thu, 15 Sep 2011 16:57:13 +0000 (16:57 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@139799 91177308-0d34-0410-b5e6-96231b3b80d8

lib/DebugInfo/DWARFContext.cpp
lib/DebugInfo/DWARFDebugInfoEntry.cpp
lib/DebugInfo/DWARFFormValue.cpp
lib/DebugInfo/DWARFFormValue.h
tools/llvm-dwarfdump/llvm-dwarfdump.cpp

index 68f58d90319d1810dcacdfa72c3259002e025f63..215effac41ffc6dc3795bb82e0d9c630f622553a 100644 (file)
@@ -8,6 +8,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "DWARFContext.h"
+#include "llvm/Support/Format.h"
 #include "llvm/Support/raw_ostream.h"
 using namespace llvm;
 
@@ -27,8 +28,18 @@ void DWARFContext::dump(raw_ostream &OS) {
     set.dump(OS);
 
   OS << "\n.debug_lines contents:\n";
-  DataExtractor lineData(getLineSection(), isLittleEndian(), 8);
+  // FIXME: must be done per CU.
+  DataExtractor lineData(getLineSection(), isLittleEndian(), /*FIXME*/8);
   DWARFDebugLine::dump(lineData, OS);
+
+  OS << "\n.debug_str contents:\n";
+  DataExtractor strData(getStringSection(), isLittleEndian(), 0);
+  offset = 0;
+  uint32_t lastOffset = 0;
+  while (const char *s = strData.getCStr(&offset)) {
+    OS << format("0x%8.8x: \"%s\"\n", lastOffset, s);
+    lastOffset = offset;
+  }
 }
 
 const DWARFDebugAbbrev *DWARFContext::getDebugAbbrev() {
index f8c89fde9328e576bb666ae14a4429a9addf4a47..1b089adbe13b5f52f61ba1420ae4391e75184b13 100644 (file)
@@ -89,7 +89,7 @@ void DWARFDebugInfoEntryMinimal::dumpAttribute(raw_ostream &OS,
     return;
 
   OS << "\t(";
-  formValue.dump(OS, 0, cu);
+  formValue.dump(OS, cu);
   OS << ")\n";
 }
 
index 506aab881274be8d94693312e46d875ee68f9457..705efe5549b674f219f4e7493bf6a7f162a8e2d3 100644 (file)
@@ -9,6 +9,7 @@
 
 #include "DWARFFormValue.h"
 #include "DWARFCompileUnit.h"
+#include "DWARFContext.h"
 #include "llvm/Support/Dwarf.h"
 #include "llvm/Support/Format.h"
 #include "llvm/Support/raw_ostream.h"
@@ -256,8 +257,8 @@ DWARFFormValue::skipValue(uint16_t form, DataExtractor debug_info_data,
 }
 
 void
-DWARFFormValue::dump(raw_ostream &OS, const DataExtractor *debug_str_data,
-                     const DWARFCompileUnit *cu) const {
+DWARFFormValue::dump(raw_ostream &OS, const DWARFCompileUnit *cu) const {
+  DataExtractor debug_str_data(cu->getContext().getStringSection(), true, 0);
   uint64_t uvalue = getUnsigned();
   bool cu_relative_offset = false;
 
@@ -302,19 +303,16 @@ DWARFFormValue::dump(raw_ostream &OS, const DataExtractor *debug_str_data,
 
   case DW_FORM_sdata:     OS << getSigned();   break;
   case DW_FORM_udata:     OS << getUnsigned(); break;
-  case DW_FORM_strp:
-    if (debug_str_data) {
-      OS << format(" .debug_str[0x%8.8x] = ", (uint32_t)uvalue);
-      const char* dbg_str = getAsCString(debug_str_data);
-      if (dbg_str) {
-        OS << '"';
-        OS.write_escaped(dbg_str);
-        OS << '"';
-      }
-    } else {
-      OS << format("0x%08x", uvalue);
+  case DW_FORM_strp: {
+    OS << format(" .debug_str[0x%8.8x] = ", (uint32_t)uvalue);
+    const char* dbg_str = getAsCString(&debug_str_data);
+    if (dbg_str) {
+      OS << '"';
+      OS.write_escaped(dbg_str);
+      OS << '"';
     }
     break;
+  }
   case DW_FORM_ref_addr:
     OS << format("0x%016x", uvalue);
     break;
index b1b04491d3c8fe4f66557651556f850a38a15dc8..22ac0116646ef8c8257f1e9c0c18b969d7cc398e 100644 (file)
@@ -48,8 +48,7 @@ public:
   DWARFFormValue(uint16_t form = 0) : Form(form) {}
   uint16_t getForm() const { return Form; }
   const ValueType& value() const { return Value; }
-  void dump(raw_ostream &OS, const DataExtractor *debug_str_data,
-            const DWARFCompileUnit* cu) const;
+  void dump(raw_ostream &OS, const DWARFCompileUnit* cu) const;
   bool extractValue(DataExtractor data, uint32_t *offset_ptr,
                     const DWARFCompileUnit *cu);
   bool isInlinedCStr() const {
index 90225deaeefb34fe2e8571b659b0718363e28f44..9618a1a4bba2d4476e5d7ba941c679bfaf4c6af1 100644 (file)
@@ -53,6 +53,7 @@ static void DumpInput(const StringRef &Filename) {
   StringRef DebugAbbrevSection;
   StringRef DebugLineSection;
   StringRef DebugArangesSection;
+  StringRef DebugStringSection;
 
   error_code ec;
   for (ObjectFile::section_iterator i = Obj->begin_sections(),
@@ -74,13 +75,16 @@ static void DumpInput(const StringRef &Filename) {
       DebugLineSection = data;
     else if (name == "debug_aranges")
       DebugArangesSection = data;
+    else if (name == "debug_str")
+      DebugStringSection = data;
   }
 
   OwningPtr<DIContext> dictx(DIContext::getDWARFContext(/*FIXME*/true,
                                                         DebugInfoSection,
                                                         DebugAbbrevSection,
                                                         DebugArangesSection,
-                                                        DebugLineSection));
+                                                        DebugLineSection,
+                                                        DebugStringSection));
   dictx->dump(outs());
 }