Skip to content

Commit

Permalink
[dsymutil] Add DwarfLinker class.
Browse files Browse the repository at this point in the history
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
  • Loading branch information
fredriss committed Jan 28, 2015
1 parent 1135b0d commit b616a18
Show file tree
Hide file tree
Showing 5 changed files with 113 additions and 4 deletions.
54 changes: 54 additions & 0 deletions test/tools/dsymutil/basic-linking.test
Original file line number Diff line number Diff line change
@@ -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 change: 1 addition & 0 deletions tools/dsymutil/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
set(LLVM_LINK_COMPONENTS
DebugInfo
Object
Support
)
Expand Down
58 changes: 56 additions & 2 deletions tools/dsymutil/DwarfLinker.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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);
}
}
}
2 changes: 1 addition & 1 deletion tools/dsymutil/LLVMBuild.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,4 +19,4 @@
type = Tool
name = llvm-dsymutil
parent = Tools
required_libraries = Object Support
required_libraries = DebugInfo Object Support
2 changes: 1 addition & 1 deletion tools/dsymutil/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit b616a18

Please sign in to comment.