From: Chris Bieneman Date: Wed, 7 Dec 2016 22:30:15 +0000 (+0000) Subject: [yaml2obj] Refactor and abstract yaml2dwarf functions X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=581f04c40e3ff73c7d21b2fa77bb0e96fe23c6fa;p=llvm [yaml2obj] Refactor and abstract yaml2dwarf functions This abstracts the code for emitting DWARF binary from the DWARFYAML types into reusable interfaces that could be used by ELF and COFF. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@288990 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/yaml2obj/CMakeLists.txt b/tools/yaml2obj/CMakeLists.txt index 885a69f5d3c..5e726496003 100644 --- a/tools/yaml2obj/CMakeLists.txt +++ b/tools/yaml2obj/CMakeLists.txt @@ -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/tools/yaml2obj/yaml2dwarf.cpp b/tools/yaml2obj/yaml2dwarf.cpp new file mode 100644 index 00000000000..9e869996367 --- /dev/null +++ b/tools/yaml2obj/yaml2dwarf.cpp @@ -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); + } +} diff --git a/tools/yaml2obj/yaml2macho.cpp b/tools/yaml2obj/yaml2macho.cpp index 48bd9e83ad3..a6d56ef8501 100644 --- a/tools/yaml2obj/yaml2macho.cpp +++ b/tools/yaml2obj/yaml2macho.cpp @@ -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(); diff --git a/tools/yaml2obj/yaml2obj.h b/tools/yaml2obj/yaml2obj.h index b5025e860bd..55edf33a2be 100644 --- a/tools/yaml2obj/yaml2obj.h +++ b/tools/yaml2obj/yaml2obj.h @@ -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