[obj2yaml] Refactor and abstract dwarf2yaml
authorChris Bieneman <beanz@apple.com>
Wed, 7 Dec 2016 21:47:28 +0000 (21:47 +0000)
committerChris Bieneman <beanz@apple.com>
Wed, 7 Dec 2016 21:47:28 +0000 (21:47 +0000)
This makes the dwarf2yaml code separated and reusable allowing ELF and COFF to share implementations with MachO.

llvm-svn: 288986

llvm/tools/obj2yaml/CMakeLists.txt
llvm/tools/obj2yaml/dwarf2yaml.cpp [new file with mode: 0644]
llvm/tools/obj2yaml/macho2yaml.cpp
llvm/tools/obj2yaml/obj2yaml.h

index 813f399..0fab6d1 100644 (file)
@@ -8,6 +8,7 @@ set(LLVM_LINK_COMPONENTS
 add_llvm_tool(obj2yaml
   obj2yaml.cpp
   coff2yaml.cpp
+  dwarf2yaml.cpp
   elf2yaml.cpp
   macho2yaml.cpp
   Error.cpp
diff --git a/llvm/tools/obj2yaml/dwarf2yaml.cpp b/llvm/tools/obj2yaml/dwarf2yaml.cpp
new file mode 100644 (file)
index 0000000..99c12b2
--- /dev/null
@@ -0,0 +1,53 @@
+//===------ dwarf2yaml.cpp - obj2yaml conversion tool -----------*- C++ -*-===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "Error.h"
+#include "llvm/DebugInfo/DWARF/DWARFContext.h"
+#include "llvm/ObjectYAML/DWARFYAML.h"
+
+using namespace llvm;
+
+void dumpDebugAbbrev(DWARFContextInMemory &DCtx, DWARFYAML::DWARFData &Y) {
+  auto AbbrevSetPtr = DCtx.getDebugAbbrev();
+  if (AbbrevSetPtr) {
+    for (auto AbbrvDeclSet : *AbbrevSetPtr) {
+      for (auto AbbrvDecl : AbbrvDeclSet.second) {
+        DWARFYAML::DWARFAbbrev Abbrv;
+        Abbrv.Code = AbbrvDecl.getCode();
+        Abbrv.Tag = AbbrvDecl.getTag();
+        Abbrv.Children = AbbrvDecl.hasChildren() ? dwarf::DW_CHILDREN_yes
+                                                 : dwarf::DW_CHILDREN_no;
+        for (auto Attribute : AbbrvDecl.attributes()) {
+          DWARFYAML::DWARFAttributeAbbrev AttAbrv;
+          AttAbrv.Attribute = Attribute.Attr;
+          AttAbrv.Form = Attribute.Form;
+          Abbrv.Attributes.push_back(AttAbrv);
+        }
+        Y.AbbrevDecls.push_back(Abbrv);
+      }
+    }
+  }
+}
+
+void dumpDebugStrings(DWARFContextInMemory &DCtx, DWARFYAML::DWARFData &Y) {
+  StringRef RemainingTable = DCtx.getStringSection();
+  while (RemainingTable.size() > 0) {
+    auto SymbolPair = RemainingTable.split('\0');
+    RemainingTable = SymbolPair.second;
+    Y.DebugStrings.push_back(SymbolPair.first);
+  }
+}
+
+std::error_code dwarf2yaml(DWARFContextInMemory &DCtx,
+                           DWARFYAML::DWARFData &Y) {
+  dumpDebugAbbrev(DCtx, Y);
+  dumpDebugStrings(DCtx, Y);
+
+  return obj2yaml_error::success;
+}
index cc82bbb..9cd0546 100644 (file)
@@ -35,7 +35,6 @@ class MachODumper {
                        ArrayRef<uint8_t> OpcodeBuffer, bool Lazy = false);
   void dumpExportTrie(std::unique_ptr<MachOYAML::Object> &Y);
   void dumpSymbols(std::unique_ptr<MachOYAML::Object> &Y);
-  void dumpDWARF(std::unique_ptr<MachOYAML::Object> &Y);
   void dumpDebugAbbrev(DWARFContextInMemory &DCtx,
                         std::unique_ptr<MachOYAML::Object> &Y);
   void dumpDebugStrings(DWARFContextInMemory &DCtx,
@@ -169,7 +168,10 @@ Expected<std::unique_ptr<MachOYAML::Object>> MachODumper::dump() {
   dumpHeader(Y);
   dumpLoadCommands(Y);
   dumpLinkEdit(Y);
-  dumpDWARF(Y);
+
+  DWARFContextInMemory DICtx(Obj);
+  if(auto Err = dwarf2yaml(DICtx, Y->DWARF))
+    return errorCodeToError(Err);
   return std::move(Y);
 }
 
@@ -466,45 +468,6 @@ void MachODumper::dumpSymbols(std::unique_ptr<MachOYAML::Object> &Y) {
   }
 }
 
-void MachODumper::dumpDWARF(std::unique_ptr<MachOYAML::Object> &Y) {
-  DWARFContextInMemory DICtx(Obj);
-  dumpDebugStrings(DICtx, Y);
-  dumpDebugAbbrev(DICtx, Y);
-}
-
-void MachODumper::dumpDebugStrings(DWARFContextInMemory &DICtx,
-                                   std::unique_ptr<MachOYAML::Object> &Y) {
-  StringRef RemainingTable = DICtx.getStringSection();
-  while (RemainingTable.size() > 0) {
-    auto SymbolPair = RemainingTable.split('\0');
-    RemainingTable = SymbolPair.second;
-    Y->DWARF.DebugStrings.push_back(SymbolPair.first);
-  }
-}
-
-void MachODumper::dumpDebugAbbrev(DWARFContextInMemory &DCtx,
-                        std::unique_ptr<MachOYAML::Object> &Y) {
-  auto AbbrevSetPtr = DCtx.getDebugAbbrev();
-  if(AbbrevSetPtr) {
-    for(auto AbbrvDeclSet : *AbbrevSetPtr) {
-      for(auto AbbrvDecl : AbbrvDeclSet.second) {
-        DWARFYAML::DWARFAbbrev Abbrv;
-        Abbrv.Code = AbbrvDecl.getCode();
-        Abbrv.Tag = AbbrvDecl.getTag();
-        Abbrv.Children = AbbrvDecl.hasChildren() ? dwarf::DW_CHILDREN_yes
-                                                 : dwarf::DW_CHILDREN_no;
-        for(auto Attribute : AbbrvDecl.attributes()) {
-          DWARFYAML::DWARFAttributeAbbrev AttAbrv;
-          AttAbrv.Attribute = Attribute.Attr;
-          AttAbrv.Form = Attribute.Form;
-          Abbrv.Attributes.push_back(AttAbrv);
-        }
-        Y->DWARF.AbbrevDecls.push_back(Abbrv);
-      }
-    }
-  }
-}
-
 Error macho2yaml(raw_ostream &Out, const object::MachOObjectFile &Obj) {
   MachODumper Dumper(Obj);
   Expected<std::unique_ptr<MachOYAML::Object>> YAML = Dumper.dump();
index 28c7475..0711233 100644 (file)
@@ -24,4 +24,15 @@ std::error_code elf2yaml(llvm::raw_ostream &Out,
 std::error_code macho2yaml(llvm::raw_ostream &Out,
                            const llvm::object::Binary &Obj);
 
+// Forward decls for dwarf2yaml
+namespace llvm {
+class DWARFContextInMemory;
+namespace DWARFYAML {
+struct DWARFData;
+}
+}
+
+std::error_code dwarf2yaml(llvm::DWARFContextInMemory &DCtx,
+                           llvm::DWARFYAML::DWARFData &Y);
+
 #endif