llvm-dwarfdump: support .apple-namespaces in --find
authorAdrian Prantl <aprantl@apple.com>
Fri, 29 Sep 2017 00:52:33 +0000 (00:52 +0000)
committerAdrian Prantl <aprantl@apple.com>
Fri, 29 Sep 2017 00:52:33 +0000 (00:52 +0000)
llvm-svn: 314481

llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h
llvm/lib/DebugInfo/DWARF/DWARFContext.cpp
llvm/test/tools/llvm-dwarfdump/X86/find.test
llvm/tools/llvm-dwarfdump/llvm-dwarfdump.cpp

index 9a1da73..4cecd22 100644 (file)
@@ -71,6 +71,8 @@ class DWARFContext : public DIContext {
   std::unique_ptr<DWARFDebugMacro> Macro;
   std::unique_ptr<DWARFAcceleratorTable> AppleNames;
   std::unique_ptr<DWARFAcceleratorTable> AppleTypes;
+  std::unique_ptr<DWARFAcceleratorTable> AppleNamespaces;
+  std::unique_ptr<DWARFAcceleratorTable> AppleObjC;
 
   DWARFUnitSection<DWARFCompileUnit> DWOCUs;
   std::deque<DWARFUnitSection<DWARFTypeUnit>> DWOTUs;
@@ -246,6 +248,12 @@ public:
   /// Get a reference to the parsed accelerator table object.
   const DWARFAcceleratorTable &getAppleTypes();
 
+  /// Get a reference to the parsed accelerator table object.
+  const DWARFAcceleratorTable &getAppleNamespaces();
+
+  /// Get a reference to the parsed accelerator table object.
+  const DWARFAcceleratorTable &getAppleObjC();
+
   /// Get a pointer to a parsed line table corresponding to a compile unit.
   const DWARFDebugLine::LineTable *getLineTableForUnit(DWARFUnit *cu);
 
index a48f5c4..bf0c4b0 100644 (file)
@@ -68,17 +68,6 @@ DWARFContext::DWARFContext(std::unique_ptr<const DWARFObject> DObj,
 
 DWARFContext::~DWARFContext() = default;
 
-static void dumpAccelSection(raw_ostream &OS, const DWARFObject &Obj,
-                             const DWARFSection &Section,
-                             StringRef StringSection, bool LittleEndian) {
-  DWARFDataExtractor AccelSection(Obj, Section, LittleEndian, 0);
-  DataExtractor StrData(StringSection, LittleEndian, 0);
-  DWARFAcceleratorTable Accel(AccelSection, StrData);
-  if (!Accel.extract())
-    return;
-  Accel.dump(OS);
-}
-
 /// Dump the UUID load command.
 static void dumpUUID(raw_ostream &OS, const ObjectFile &Obj) {
   auto *MachO = dyn_cast<MachOObjectFile>(&Obj);
@@ -461,13 +450,11 @@ void DWARFContext::dump(
 
   if (shouldDump(Explicit, ".apple_namespaces", DIDT_ID_AppleNamespaces,
                  DObj->getAppleNamespacesSection().Data))
-    dumpAccelSection(OS, *DObj, DObj->getAppleNamespacesSection(),
-                     DObj->getStringSection(), isLittleEndian());
+    getAppleNamespaces().dump(OS);
 
   if (shouldDump(Explicit, ".apple_objc", DIDT_ID_AppleObjC,
                  DObj->getAppleObjCSection().Data))
-    dumpAccelSection(OS, *DObj, DObj->getAppleObjCSection(),
-                     DObj->getStringSection(), isLittleEndian());
+    getAppleObjC().dump(OS);
 }
 
 DWARFCompileUnit *DWARFContext::getDWOCompileUnitForHash(uint64_t Hash) {
@@ -659,6 +646,17 @@ const DWARFAcceleratorTable &DWARFContext::getAppleTypes() {
                        DObj->getStringSection(), isLittleEndian());
 }
 
+const DWARFAcceleratorTable &DWARFContext::getAppleNamespaces() {
+  return getAccelTable(AppleNamespaces, *DObj,
+                       DObj->getAppleNamespacesSection(),
+                       DObj->getStringSection(), isLittleEndian());
+}
+
+const DWARFAcceleratorTable &DWARFContext::getAppleObjC() {
+  return getAccelTable(AppleObjC, *DObj, DObj->getAppleObjCSection(),
+                       DObj->getStringSection(), isLittleEndian());
+}
+
 const DWARFLineTable *
 DWARFContext::getLineTableForUnit(DWARFUnit *U) {
   if (!Line)
index e6a40b0..2d308b7 100644 (file)
@@ -35,3 +35,10 @@ TYPES: : DW_TAG_base_type
 TYPES-NOT: {{:}}
 TYPES:     DW_AT_name ("int")
 TYPES-NOT: {{:}}
+
+RUN: llvm-dwarfdump %S/../../dsymutil/Inputs/odr-anon-namespace/1.o \
+RUN:    -find="(anonymous namespace)" \
+RUN:   | FileCheck %s --check-prefix=NAMESPACE
+NAMESPACE-NOT: {{: DW}}
+NAMESPACE: 0x0000005b: DW_TAG_namespace
+NAMESPACE-NOT: {{: DW}}
index a36926d..c5584b8 100644 (file)
@@ -260,6 +260,8 @@ static bool dumpObjectFile(ObjectFile &Obj, DWARFContext &DICtx, Twine Filename,
           return DumpOffsets[DIDT_ID_DebugInfo] = *Offset;
         if (auto Offset = find(DICtx.getAppleTypes()))
           return DumpOffsets[DIDT_ID_DebugInfo] = *Offset;
+        if (auto Offset = find(DICtx.getAppleNamespaces()))
+          return DumpOffsets[DIDT_ID_DebugInfo] = *Offset;
       }
       return None;
     }();