From 7d7364ab4fecfd8cdf6f129df518922dacb53047 Mon Sep 17 00:00:00 2001 From: Chris Bieneman Date: Wed, 7 Dec 2016 22:30:15 +0000 Subject: [PATCH] [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. llvm-svn: 288990 --- llvm/tools/yaml2obj/CMakeLists.txt | 1 + llvm/tools/yaml2obj/yaml2dwarf.cpp | 41 ++++++++++++++++++++++++++++++++++++++ llvm/tools/yaml2obj/yaml2macho.cpp | 17 ++-------------- llvm/tools/yaml2obj/yaml2obj.h | 9 +++++++++ 4 files changed, 53 insertions(+), 15 deletions(-) create mode 100644 llvm/tools/yaml2obj/yaml2dwarf.cpp diff --git a/llvm/tools/yaml2obj/CMakeLists.txt b/llvm/tools/yaml2obj/CMakeLists.txt index 885a69f..5e72649 100644 --- a/llvm/tools/yaml2obj/CMakeLists.txt +++ b/llvm/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/llvm/tools/yaml2obj/yaml2dwarf.cpp b/llvm/tools/yaml2obj/yaml2dwarf.cpp new file mode 100644 index 0000000..9e86999 --- /dev/null +++ b/llvm/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/llvm/tools/yaml2obj/yaml2macho.cpp b/llvm/tools/yaml2obj/yaml2macho.cpp index 48bd9e8..a6d56ef 100644 --- a/llvm/tools/yaml2obj/yaml2macho.cpp +++ b/llvm/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/llvm/tools/yaml2obj/yaml2obj.h b/llvm/tools/yaml2obj/yaml2obj.h index b5025e8..55edf33 100644 --- a/llvm/tools/yaml2obj/yaml2obj.h +++ b/llvm/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 -- 2.7.4