forked from OSchip/llvm-project
[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:
parent
c53606ef02
commit
26d060fbf9
|
@ -8,6 +8,7 @@ set(LLVM_LINK_COMPONENTS
|
|||
add_llvm_tool(obj2yaml
|
||||
obj2yaml.cpp
|
||||
coff2yaml.cpp
|
||||
dwarf2yaml.cpp
|
||||
elf2yaml.cpp
|
||||
macho2yaml.cpp
|
||||
Error.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;
|
||||
}
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue