[yaml2obj] Refactor and abstract yaml2dwarf functions
authorChris Bieneman <beanz@apple.com>
Wed, 7 Dec 2016 22:30:15 +0000 (22:30 +0000)
committerChris Bieneman <beanz@apple.com>
Wed, 7 Dec 2016 22:30:15 +0000 (22:30 +0000)
This abstracts the code for emitting DWARF binary from the DWARFYAML types into reusable interfaces that could be used by ELF and COFF.

llvm-svn: 288990

llvm/tools/yaml2obj/CMakeLists.txt
llvm/tools/yaml2obj/yaml2dwarf.cpp [new file with mode: 0644]
llvm/tools/yaml2obj/yaml2macho.cpp
llvm/tools/yaml2obj/yaml2obj.h

index 885a69f..5e72649 100644 (file)
@@ -8,6 +8,7 @@ set(LLVM_LINK_COMPONENTS
 add_llvm_tool(yaml2obj
   yaml2obj.cpp
   yaml2coff.cpp
+  yaml2dwarf.cpp
   yaml2elf.cpp
   yaml2macho.cpp
   )
diff --git a/llvm/tools/yaml2obj/yaml2dwarf.cpp b/llvm/tools/yaml2obj/yaml2dwarf.cpp
new file mode 100644 (file)
index 0000000..9e86999
--- /dev/null
@@ -0,0 +1,41 @@
+//===- yaml2dwarf - Convert YAML to DWARF binary data ---------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// \brief The DWARF component of yaml2obj.
+///
+//===----------------------------------------------------------------------===//
+
+#include "llvm/ObjectYAML/DWARFYAML.h"
+#include "llvm/Support/Error.h"
+#include "llvm/Support/LEB128.h"
+#include "llvm/Support/raw_ostream.h"
+
+using namespace llvm;
+
+void yaml2debug_str(raw_ostream &OS, const DWARFYAML::DWARFData &DI) {
+  for (auto Str : DI.DebugStrings) {
+    OS.write(Str.data(), Str.size());
+    OS.write('\0');
+  }
+}
+
+void yaml2debug_abbrev(raw_ostream &OS, const DWARFYAML::DWARFData &DI) {
+  for (auto AbbrevDecl : DI.AbbrevDecls) {
+    encodeULEB128(AbbrevDecl.Code, OS);
+    encodeULEB128(AbbrevDecl.Tag, OS);
+    OS.write(AbbrevDecl.Children);
+    for (auto Attr : AbbrevDecl.Attributes) {
+      encodeULEB128(Attr.Attribute, OS);
+      encodeULEB128(Attr.Form, OS);
+    }
+    encodeULEB128(0, OS);
+    encodeULEB128(0, OS);
+  }
+}
index 48bd9e8..a6d56ef 100644 (file)
@@ -389,22 +389,9 @@ Error MachOWriter::writeDWARFData(raw_ostream &OS,
   for(auto Section : Sections) {
     ZeroToOffset(OS, Section.offset);
     if (0 == strncmp(&Section.sectname[0], "__debug_str", 16)) {
-      for (auto Str : Obj.DWARF.DebugStrings) {
-        OS.write(Str.data(), Str.size());
-        OS.write('\0');
-      }
+      yaml2debug_str(OS, Obj.DWARF);
     } else if (0 == strncmp(&Section.sectname[0], "__debug_abbrev", 16)) {
-      for (auto AbbrevDecl : Obj.DWARF.AbbrevDecls) {
-        encodeULEB128(AbbrevDecl.Code, OS);
-        encodeULEB128(AbbrevDecl.Tag, OS);
-        OS.write(AbbrevDecl.Children);
-        for (auto Attr : AbbrevDecl.Attributes) {
-          encodeULEB128(Attr.Attribute, OS);
-          encodeULEB128(Attr.Form, OS);
-        }
-        encodeULEB128(0, OS);
-        encodeULEB128(0, OS);
-      }
+      yaml2debug_abbrev(OS, Obj.DWARF);
     }
   }
   return Error::success();
index b5025e8..55edf33 100644 (file)
@@ -23,6 +23,10 @@ namespace ELFYAML {
 struct Object;
 }
 
+namespace DWARFYAML {
+struct DWARFData;
+}
+
 namespace yaml {
 class Input;
 struct YamlObjectFile;
@@ -33,4 +37,9 @@ int yaml2coff(llvm::COFFYAML::Object &Doc, llvm::raw_ostream &Out);
 int yaml2elf(llvm::ELFYAML::Object &Doc, llvm::raw_ostream &Out);
 int yaml2macho(llvm::yaml::YamlObjectFile &Doc, llvm::raw_ostream &Out);
 
+void yaml2debug_abbrev(llvm::raw_ostream &OS,
+                       const llvm::DWARFYAML::DWARFData &DI);
+void yaml2debug_str(llvm::raw_ostream &OS,
+                    const llvm::DWARFYAML::DWARFData &DI);
+
 #endif