From: Chris Bieneman Date: Wed, 7 Dec 2016 21:47:28 +0000 (+0000) Subject: [obj2yaml] Refactor and abstract dwarf2yaml X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=26d060fbf9fe5525f06f13c398ad1c564528fe57;p=platform%2Fupstream%2Fllvm.git [obj2yaml] Refactor and abstract dwarf2yaml This makes the dwarf2yaml code separated and reusable allowing ELF and COFF to share implementations with MachO. llvm-svn: 288986 --- diff --git a/llvm/tools/obj2yaml/CMakeLists.txt b/llvm/tools/obj2yaml/CMakeLists.txt index 813f399..0fab6d1 100644 --- a/llvm/tools/obj2yaml/CMakeLists.txt +++ b/llvm/tools/obj2yaml/CMakeLists.txt @@ -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 index 0000000..99c12b2 --- /dev/null +++ b/llvm/tools/obj2yaml/dwarf2yaml.cpp @@ -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; +} diff --git a/llvm/tools/obj2yaml/macho2yaml.cpp b/llvm/tools/obj2yaml/macho2yaml.cpp index cc82bbb..9cd0546 100644 --- a/llvm/tools/obj2yaml/macho2yaml.cpp +++ b/llvm/tools/obj2yaml/macho2yaml.cpp @@ -35,7 +35,6 @@ class MachODumper { ArrayRef OpcodeBuffer, bool Lazy = false); void dumpExportTrie(std::unique_ptr &Y); void dumpSymbols(std::unique_ptr &Y); - void dumpDWARF(std::unique_ptr &Y); void dumpDebugAbbrev(DWARFContextInMemory &DCtx, std::unique_ptr &Y); void dumpDebugStrings(DWARFContextInMemory &DCtx, @@ -169,7 +168,10 @@ Expected> 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 &Y) { } } -void MachODumper::dumpDWARF(std::unique_ptr &Y) { - DWARFContextInMemory DICtx(Obj); - dumpDebugStrings(DICtx, Y); - dumpDebugAbbrev(DICtx, Y); -} - -void MachODumper::dumpDebugStrings(DWARFContextInMemory &DICtx, - std::unique_ptr &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 &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> YAML = Dumper.dump(); diff --git a/llvm/tools/obj2yaml/obj2yaml.h b/llvm/tools/obj2yaml/obj2yaml.h index 28c7475..0711233 100644 --- a/llvm/tools/obj2yaml/obj2yaml.h +++ b/llvm/tools/obj2yaml/obj2yaml.h @@ -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