[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
This commit is contained in:
Chris Bieneman 2016-12-07 21:47:28 +00:00
parent c53606ef02
commit 26d060fbf9
4 changed files with 69 additions and 41 deletions

View 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

View File

@ -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;
}

View 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();

View 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