mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-12 14:20:33 +00:00
[dsymutil] Add DwarfLinker class.
It's an empty shell for now. It's main method just opens the debug map objects and parses their Dwarf info. Test that we at least do that correctly. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@227337 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1135b0df02
commit
b616a18f02
54
test/tools/dsymutil/basic-linking.test
Normal file
54
test/tools/dsymutil/basic-linking.test
Normal file
@ -0,0 +1,54 @@
|
||||
RUN: llvm-dsymutil -v -oso-prepend-path=%p %p/Inputs/basic.macho.x86_64 | FileCheck %s
|
||||
RUN: llvm-dsymutil -v -oso-prepend-path=%p %p/Inputs/basic-lto.macho.x86_64 | FileCheck %s --check-prefix=CHECK-LTO
|
||||
RUN: llvm-dsymutil -v -oso-prepend-path=%p %p/Inputs/basic-archive.macho.x86_64 | FileCheck %s --check-prefix=CHECK-ARCHIVE
|
||||
|
||||
This test check the basic Dwarf linking process through the debug dumps.
|
||||
|
||||
CHECK: DEBUG MAP OBJECT: {{.*}}basic1.macho.x86_64.o
|
||||
CHECK: Input compilation unit:
|
||||
CHECK-NEXT: TAG_compile_unit
|
||||
CHECK-NOT: TAG
|
||||
CHECK: AT_name {{.*}}basic1.c
|
||||
CHECK: DEBUG MAP OBJECT: {{.*}}basic2.macho.x86_64.o
|
||||
CHECK: Input compilation unit:
|
||||
CHECK-NEXT: TAG_compile_unit
|
||||
CHECK-NOT: TAG
|
||||
CHECK: AT_name {{.*}}basic2.c
|
||||
CHECK: DEBUG MAP OBJECT: {{.*}}basic3.macho.x86_64.o
|
||||
CHECK: Input compilation unit:
|
||||
CHECK-NEXT: TAG_compile_unit
|
||||
CHECK-NOT: TAG
|
||||
CHECK: AT_name {{.*}}basic3.c
|
||||
|
||||
|
||||
CHECK-LTO: DEBUG MAP OBJECT: {{.*}}basic-lto.macho.x86_64.o
|
||||
CHECK-LTO: Input compilation unit:
|
||||
CHECK-LTO-NEXT: TAG_compile_unit
|
||||
CHECK-LTO-NOT: TAG
|
||||
CHECK-LTO: AT_name {{.*}}basic1.c
|
||||
CHECK-LTO: Input compilation unit:
|
||||
CHECK-LTO-NEXT: TAG_compile_unit
|
||||
CHECK-LTO-NOT: TAG
|
||||
CHECK-LTO: AT_name {{.*}}basic2.c
|
||||
CHECK-LTO: Input compilation unit:
|
||||
CHECK-LTO-NEXT: TAG_compile_unit
|
||||
CHECK-LTO-NOT: TAG
|
||||
CHECK-LTO: AT_name {{.*}}basic3.c
|
||||
|
||||
|
||||
CHECK-ARCHIVE: DEBUG MAP OBJECT: {{.*}}basic1.macho.x86_64.o
|
||||
CHECK-ARCHIVE: Input compilation unit:
|
||||
CHECK-ARCHIVE-NEXT: TAG_compile_unit
|
||||
CHECK-ARCHIVE-NOT: TAG
|
||||
CHECK-ARCHIVE: AT_name {{.*}}basic1.c
|
||||
CHECK-ARCHIVE: DEBUG MAP OBJECT: {{.*}}libbasic.a(basic2.macho.x86_64.o)
|
||||
CHECK-ARCHIVE: Input compilation unit:
|
||||
CHECK-ARCHIVE-NEXT: TAG_compile_unit
|
||||
CHECK-ARCHIVE-NOT: TAG
|
||||
CHECK-ARCHIVE: AT_name {{.*}}basic2.c
|
||||
CHECK-ARCHIVE: DEBUG MAP OBJECT: {{.*}}libbasic.a(basic3.macho.x86_64.o)
|
||||
CHECK-ARCHIVE: Input compilation unit:
|
||||
CHECK-ARCHIVE-NEXT: TAG_compile_unit
|
||||
CHECK-ARCHIVE-NOT: TAG
|
||||
CHECK-ARCHIVE: AT_name {{.*}}basic3.c
|
||||
|
@ -1,4 +1,5 @@
|
||||
set(LLVM_LINK_COMPONENTS
|
||||
DebugInfo
|
||||
Object
|
||||
Support
|
||||
)
|
||||
|
@ -7,14 +7,68 @@
|
||||
//
|
||||
//===----------------------------------------------------------------------===//
|
||||
#include "DebugMap.h"
|
||||
|
||||
#include "BinaryHolder.h"
|
||||
#include "DebugMap.h"
|
||||
#include "dsymutil.h"
|
||||
#include "llvm/DebugInfo/DWARFContext.h"
|
||||
#include "llvm/DebugInfo/DWARFDebugInfoEntry.h"
|
||||
#include <string>
|
||||
|
||||
namespace llvm {
|
||||
namespace dsymutil {
|
||||
|
||||
bool linkDwarf(StringRef OutputFilename, const DebugMap &DM, bool Verbose) {
|
||||
// Do nothing for now.
|
||||
namespace {
|
||||
|
||||
/// \brief The core of the Dwarf linking logic.
|
||||
class DwarfLinker {
|
||||
public:
|
||||
DwarfLinker(StringRef OutputFilename, bool Verbose)
|
||||
: OutputFilename(OutputFilename), Verbose(Verbose), BinHolder(Verbose) {}
|
||||
|
||||
/// \brief Link the contents of the DebugMap.
|
||||
bool link(const DebugMap &);
|
||||
|
||||
private:
|
||||
std::string OutputFilename;
|
||||
bool Verbose;
|
||||
BinaryHolder BinHolder;
|
||||
};
|
||||
|
||||
bool DwarfLinker::link(const DebugMap &Map) {
|
||||
|
||||
if (Map.begin() == Map.end()) {
|
||||
errs() << "Empty debug map.\n";
|
||||
return false;
|
||||
}
|
||||
|
||||
for (const auto &Obj : Map.objects()) {
|
||||
if (Verbose)
|
||||
outs() << "DEBUG MAP OBJECT: " << Obj->getObjectFilename() << "\n";
|
||||
auto ErrOrObj = BinHolder.GetObjectFile(Obj->getObjectFilename());
|
||||
if (std::error_code EC = ErrOrObj.getError()) {
|
||||
errs() << Obj->getObjectFilename() << ": " << EC.message() << "\n";
|
||||
continue;
|
||||
}
|
||||
|
||||
DWARFContextInMemory DwarfContext(*ErrOrObj);
|
||||
|
||||
for (const auto &CU : DwarfContext.compile_units()) {
|
||||
auto *CUDie = CU->getCompileUnitDIE(false);
|
||||
if (Verbose) {
|
||||
outs() << "Input compilation unit:";
|
||||
CUDie->dump(outs(), CU.get(), 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool linkDwarf(StringRef OutputFilename, const DebugMap &DM, bool Verbose) {
|
||||
DwarfLinker Linker(OutputFilename, Verbose);
|
||||
return Linker.link(DM);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -19,4 +19,4 @@
|
||||
type = Tool
|
||||
name = llvm-dsymutil
|
||||
parent = Tools
|
||||
required_libraries = Object Support
|
||||
required_libraries = DebugInfo Object Support
|
||||
|
@ -9,7 +9,7 @@
|
||||
|
||||
LEVEL := ../..
|
||||
TOOLNAME := llvm-dsymutil
|
||||
LINK_COMPONENTS := Object Support
|
||||
LINK_COMPONENTS := DebugInfo Object Support
|
||||
|
||||
# This tool has no plugins, optimize startup time.
|
||||
TOOL_NO_EXPORTS := 1
|
||||
|
Loading…
Reference in New Issue
Block a user