OSDN Git Service

[dwarfdump] Add pretty printer for accelerator table based on Atom.
authorJonas Devlieghere <jonas@devlieghere.com>
Fri, 13 Jul 2018 17:21:51 +0000 (17:21 +0000)
committerJonas Devlieghere <jonas@devlieghere.com>
Fri, 13 Jul 2018 17:21:51 +0000 (17:21 +0000)
For instance, When dumping .apple_types, the second atom represents the
DW_TAG. In addition to printing the raw value, we now also pretty print
the value if the ATOM tells us how.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@337026 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/BinaryFormat/Dwarf.h
lib/BinaryFormat/Dwarf.cpp
lib/DebugInfo/DWARF/DWARFAcceleratorTable.cpp
test/tools/dsymutil/X86/objc.test

index 15724a9..9036f40 100644 (file)
@@ -540,6 +540,10 @@ bool isValidFormForVersion(Form F, unsigned Version, bool ExtensionsOk = true);
 /// for attribute Attr.
 StringRef AttributeValueString(uint16_t Attr, unsigned Val);
 
+/// Returns the symbolic string representing Val when used as a value
+/// for atom Atom.
+StringRef AtomValueString(uint16_t Atom, unsigned Val);
+
 /// Describes an entry of the various gnu_pub* debug sections.
 ///
 /// The gnu_pub* kind looks like:
index a2e86c7..5984de7 100644 (file)
@@ -571,6 +571,17 @@ StringRef llvm::dwarf::AttributeValueString(uint16_t Attr, unsigned Val) {
   return StringRef();
 }
 
+StringRef llvm::dwarf::AtomValueString(uint16_t Atom, unsigned Val) {
+  switch (Atom) {
+  case DW_ATOM_null:
+    return "NULL";
+  case DW_ATOM_die_tag:
+    return TagString(Val);
+  }
+
+  return StringRef();
+}
+
 StringRef llvm::dwarf::IndexString(unsigned Idx) {
   switch (Idx) {
   default:
index 0ded97c..4582e03 100644 (file)
@@ -183,12 +183,18 @@ bool AppleAcceleratorTable::dumpName(ScopedPrinter &W,
     ListScope DataScope(W, ("Data " + Twine(Data)).str());
     unsigned i = 0;
     for (auto &Atom : AtomForms) {
-      W.startLine() << format("Atom[%d]: ", i++);
-      if (Atom.extractValue(AccelSection, DataOffset, FormParams))
+      W.startLine() << format("Atom[%d]: ", i);
+      if (Atom.extractValue(AccelSection, DataOffset, FormParams)) {
         Atom.dump(W.getOStream());
-      else
+        if (Optional<uint64_t> Val = Atom.getAsUnsignedConstant()) {
+          StringRef Str = dwarf::AtomValueString(HdrData.Atoms[i].first, *Val);
+          if (!Str.empty())
+            W.getOStream() << " (" << Str << ")";
+        }
+      } else
         W.getOStream() << "Error extracting the value";
       W.getOStream() << "\n";
+      i++;
     }
   }
   return true; // more entries follow
index 7acb7c7..47dfef5 100644 (file)
@@ -5,7 +5,7 @@ CHECK: .apple_types contents:
 CHECK: String: 0x00000066 "A"
 CHECK-NEXT: Data 0 [
 CHECK-NEXT:   Atom[0]: 0x0000012d
-CHECK-NEXT:   Atom[1]: 0x0013
+CHECK-NEXT:   Atom[1]: 0x0013 (DW_TAG_structure_type)
 CHECK-NEXT:   Atom[2]: 0x02
 CHECK-NEXT:   Atom[3]: 0x0b87b15a
 CHECK-NEXT: ]