[llvm] r224134 - Initial dsymutil tool commit.
Colin LeMahieu
colinl at codeaurora.org
Fri Dec 12 11:05:57 PST 2014
I forwarded this to another person that might be able to look at the
machine. Will let you know what we find.
-----Original Message-----
From: llvm-commits-bounces at cs.uiuc.edu
[mailto:llvm-commits-bounces at cs.uiuc.edu] On Behalf Of Frederic Riss
Sent: Friday, December 12, 2014 12:28 PM
To: Frederic Riss; Rick Foos
Cc: llvm-commits at cs.uiuc.edu
Subject: Re: [llvm] r224134 - Initial dsymutil tool commit.
It looks like this commit has broken the hexagon bots for some obscure
reason.
http://lab.llvm.org:8011/builders/llvm-hexagon-elf/builds/13548
The svn update stage is marked as successful, but I believe the issue is
there, because it shows 2 tree conflicts on the new directories.
These directories where already added a couple of days ago and then deleted.
I /think/ the builder must have left something in the removed directories
that prevented the updates from really deleting them. Now that the
directories are added again, the new version conflicts with the ones that
haven't been deleted.
I've cc'ed rfoos who is the bots' maintainer, but if anybody else has access
to the bot and could confirm/fix that would be great.
Fred
On 12 December 2014 at 09:31, Frederic Riss <friss at apple.com> wrote:
> Author: friss
> Date: Fri Dec 12 11:31:24 2014
> New Revision: 224134
>
> URL: http://llvm.org/viewvc/llvm-project?rev=224134&view=rev
> Log:
> Initial dsymutil tool commit.
>
> The goal of this tool is to replicate Darwin's dsymutil functionality
> based on LLVM. dsymutil is a DWARF linker. Darwin's linker (ld64) does
> not link the debug information, it leaves it in the object files in
> relocatable form, but embbeds a `debug map` into the executable that
> describes where to find the debug information and how to relocate it.
> When releasing/archiving a binary, dsymutil is called to link all the
> DWARF information into a `dsym bundle` that can distributed/stored
> along with the binary.
>
> With this commit, the LLVM based dsymutil is just able to parse the
> STABS debug maps embedded by ld64 in linked binaries (and not all of
> them, for example archives aren't supported yet).
>
> Note that the tool directory is called dsymutil, but the executable is
> currently called llvm-dsymutil. This discrepancy will disappear once
> the tool will be feature complete. At this point the executable will
> be renamed to dsymutil, but until then you do not want it to override the
system one.
>
> Differential Revision: http://reviews.llvm.org/D6242
>
> Added:
> llvm/trunk/test/tools/dsymutil/
> llvm/trunk/test/tools/dsymutil/Inputs/
> llvm/trunk/test/tools/dsymutil/Inputs/basic-lto.macho.x86_64 (with
props)
> llvm/trunk/test/tools/dsymutil/Inputs/basic-lto.macho.x86_64.o
> llvm/trunk/test/tools/dsymutil/Inputs/basic.macho.x86_64 (with
props)
> llvm/trunk/test/tools/dsymutil/Inputs/basic1.c
> llvm/trunk/test/tools/dsymutil/Inputs/basic1.macho.x86_64.o
> llvm/trunk/test/tools/dsymutil/Inputs/basic2.c
> llvm/trunk/test/tools/dsymutil/Inputs/basic2.macho.x86_64.o
> llvm/trunk/test/tools/dsymutil/Inputs/basic3.c
> llvm/trunk/test/tools/dsymutil/Inputs/basic3.macho.x86_64.o
> llvm/trunk/test/tools/dsymutil/debug-map-parsing.test
> llvm/trunk/tools/dsymutil/
> llvm/trunk/tools/dsymutil/CMakeLists.txt
> llvm/trunk/tools/dsymutil/DebugMap.cpp
> llvm/trunk/tools/dsymutil/DebugMap.h
> llvm/trunk/tools/dsymutil/DwarfLinker.cpp
> llvm/trunk/tools/dsymutil/LLVMBuild.txt
> - copied, changed from r224130, llvm/trunk/tools/LLVMBuild.txt
> llvm/trunk/tools/dsymutil/MachODebugMapParser.cpp
> llvm/trunk/tools/dsymutil/Makefile
> llvm/trunk/tools/dsymutil/dsymutil.cpp
> llvm/trunk/tools/dsymutil/dsymutil.h
> Modified:
> llvm/trunk/test/CMakeLists.txt
> llvm/trunk/test/lit.cfg
> llvm/trunk/tools/CMakeLists.txt
> llvm/trunk/tools/LLVMBuild.txt
> llvm/trunk/tools/Makefile
>
> Modified: llvm/trunk/test/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/CMakeLists.txt?rev
> =224134&r1=224133&r2=224134&view=diff
> ======================================================================
> ========
> --- llvm/trunk/test/CMakeLists.txt (original)
> +++ llvm/trunk/test/CMakeLists.txt Fri Dec 12 11:31:24 2014
> @@ -30,6 +30,7 @@ set(LLVM_TEST_DEPENDS
> llvm-cov
> llvm-diff
> llvm-dis
> + llvm-dsymutil
> llvm-dwarfdump
> llvm-extract
> llvm-link
>
> Modified: llvm/trunk/test/lit.cfg
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/lit.cfg?rev=224134
> &r1=224133&r2=224134&view=diff
> ======================================================================
> ========
> --- llvm/trunk/test/lit.cfg (original)
> +++ llvm/trunk/test/lit.cfg Fri Dec 12 11:31:24 2014
> @@ -229,6 +229,7 @@ for pattern in [r"\bbugpoint\b(?!-)",
> r"\bllvm-cov\b",
> r"\bllvm-diff\b",
> r"\bllvm-dis\b",
> + r"\bllvm-dsymutil\b",
> r"\bllvm-dwarfdump\b",
> r"\bllvm-extract\b",
> r"\bllvm-go\b",
>
> Added: llvm/trunk/test/tools/dsymutil/Inputs/basic-lto.macho.x86_64
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inp
> uts/basic-lto.macho.x86_64?rev=224134&view=auto
> ======================================================================
> ======== Binary files
> llvm/trunk/test/tools/dsymutil/Inputs/basic-lto.macho.x86_64 (added)
> and llvm/trunk/test/tools/dsymutil/Inputs/basic-lto.macho.x86_64 Fri
> Dec 12 11:31:24 2014 differ
>
> Propchange:
> llvm/trunk/test/tools/dsymutil/Inputs/basic-lto.macho.x86_64
>
----------------------------------------------------------------------------
--
> svn:executable = *
>
> Added: llvm/trunk/test/tools/dsymutil/Inputs/basic-lto.macho.x86_64.o
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inp
> uts/basic-lto.macho.x86_64.o?rev=224134&view=auto
> ======================================================================
> ======== Binary files
> llvm/trunk/test/tools/dsymutil/Inputs/basic-lto.macho.x86_64.o (added)
> and llvm/trunk/test/tools/dsymutil/Inputs/basic-lto.macho.x86_64.o Fri
> Dec 12 11:31:24 2014 differ
>
> Added: llvm/trunk/test/tools/dsymutil/Inputs/basic.macho.x86_64
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inp
> uts/basic.macho.x86_64?rev=224134&view=auto
> ======================================================================
> ======== Binary files
> llvm/trunk/test/tools/dsymutil/Inputs/basic.macho.x86_64 (added) and
> llvm/trunk/test/tools/dsymutil/Inputs/basic.macho.x86_64 Fri Dec 12
> 11:31:24 2014 differ
>
> Propchange: llvm/trunk/test/tools/dsymutil/Inputs/basic.macho.x86_64
>
----------------------------------------------------------------------------
--
> svn:executable = *
>
> Added: llvm/trunk/test/tools/dsymutil/Inputs/basic1.c
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inp
> uts/basic1.c?rev=224134&view=auto
> ======================================================================
> ========
> --- llvm/trunk/test/tools/dsymutil/Inputs/basic1.c (added)
> +++ llvm/trunk/test/tools/dsymutil/Inputs/basic1.c Fri Dec 12 11:31:24
> +++ 2014
> @@ -0,0 +1,25 @@
> +/* This is the main file used to produce the basic* objects that are
> + used for the dsymutil tests.
> +
> + These are compiled in a couple of different ways (always on a
> + Darwin system):
> + Basic compilation:
> + for FILE in basic1.c basic2.c basic3.c; do
> + clang -g -c $FILE -o ${FILE%.c}.macho.x86_64.o
> + done
> + clang basic1.macho.x86_64.o basic2.macho.x86_64.o
> + basic3.macho.x86_64.o -o basic.macho.x86_64 -Wl,-dead_strip
> +
> + LTO compilation:
> + for FILE in basic1.c basic2.c basic3.c; do
> + clang -g -c -flto $FILE -o ${FILE%.c}-lto.o
> + done
> + clang basic1-lto.o basic2-lto.o basic3-lto.o -o
basic-lto.macho.x86_64 -Wl,-object_path_lto,$PWD/basic-lto.macho.x86_64.o
-Wl,-dead_strip
> + rm basic1-lto.o basic2-lto.o basic3-lto.o
> +
> +*/
> +
> +int foo(int);
> +
> +int main(int argc, const char *argv[]) {
> + return foo(argc);
> +}
>
> Added: llvm/trunk/test/tools/dsymutil/Inputs/basic1.macho.x86_64.o
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inp
> uts/basic1.macho.x86_64.o?rev=224134&view=auto
> ======================================================================
> ======== Binary files
> llvm/trunk/test/tools/dsymutil/Inputs/basic1.macho.x86_64.o (added)
> and llvm/trunk/test/tools/dsymutil/Inputs/basic1.macho.x86_64.o Fri
> Dec 12 11:31:24 2014 differ
>
> Added: llvm/trunk/test/tools/dsymutil/Inputs/basic2.c
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inp
> uts/basic2.c?rev=224134&view=auto
> ======================================================================
> ========
> --- llvm/trunk/test/tools/dsymutil/Inputs/basic2.c (added)
> +++ llvm/trunk/test/tools/dsymutil/Inputs/basic2.c Fri Dec 12 11:31:24
> +++ 2014
> @@ -0,0 +1,22 @@
> +/* For compilation instructions see basic1.c. */
> +
> +static int baz = 42;
> +static int private_int;
> +extern volatile int val;
> +int unused_data = 1;
> +
> +int bar(int);
> +
> +void unused1() {
> + bar(baz);
> +}
> +
> +static int inc() {
> + return ++private_int;
> +}
> +
> +__attribute__((noinline))
> +int foo(int arg) {
> + return bar(arg+val) + inc() + baz++; }
> +
>
> Added: llvm/trunk/test/tools/dsymutil/Inputs/basic2.macho.x86_64.o
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inp
> uts/basic2.macho.x86_64.o?rev=224134&view=auto
> ======================================================================
> ======== Binary files
> llvm/trunk/test/tools/dsymutil/Inputs/basic2.macho.x86_64.o (added)
> and llvm/trunk/test/tools/dsymutil/Inputs/basic2.macho.x86_64.o Fri
> Dec 12 11:31:24 2014 differ
>
> Added: llvm/trunk/test/tools/dsymutil/Inputs/basic3.c
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inp
> uts/basic3.c?rev=224134&view=auto
> ======================================================================
> ========
> --- llvm/trunk/test/tools/dsymutil/Inputs/basic3.c (added)
> +++ llvm/trunk/test/tools/dsymutil/Inputs/basic3.c Fri Dec 12 11:31:24
> +++ 2014
> @@ -0,0 +1,20 @@
> +/* For compilation instructions see basic1.c. */
> +
> +volatile int val;
> +
> +extern int foo(int);
> +
> +int unused2() {
> + return foo(val);
> +}
> +
> +static int inc() {
> + return ++val;
> +}
> +
> +__attribute__((noinline))
> +int bar(int arg) {
> + if (arg > 42)
> + return inc();
> + return foo(val + arg);
> +}
>
> Added: llvm/trunk/test/tools/dsymutil/Inputs/basic3.macho.x86_64.o
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/Inp
> uts/basic3.macho.x86_64.o?rev=224134&view=auto
> ======================================================================
> ======== Binary files
> llvm/trunk/test/tools/dsymutil/Inputs/basic3.macho.x86_64.o (added)
> and llvm/trunk/test/tools/dsymutil/Inputs/basic3.macho.x86_64.o Fri
> Dec 12 11:31:24 2014 differ
>
> Added: llvm/trunk/test/tools/dsymutil/debug-map-parsing.test
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/dsymutil/deb
> ug-map-parsing.test?rev=224134&view=auto
> ======================================================================
> ========
> --- llvm/trunk/test/tools/dsymutil/debug-map-parsing.test (added)
> +++ llvm/trunk/test/tools/dsymutil/debug-map-parsing.test Fri Dec 12
> +++ 11:31:24 2014
> @@ -0,0 +1,48 @@
> +RUN: llvm-dsymutil -v -parse-only -oso-prepend-path=%p
> +%p/Inputs/basic.macho.x86_64 | FileCheck %s
> +RUN: llvm-dsymutil -v -parse-only -oso-prepend-path=%p
> +%p/Inputs/basic-lto.macho.x86_64 | FileCheck %s
> +--check-prefix=CHECK-LTO
> +RUN: llvm-dsymutil -v -parse-only %p/Inputs/basic.macho.x86_64 2>&1 |
> +FileCheck %s --check-prefix=NOT-FOUND
> +RUN: not llvm-dsymutil -v -parse-only %p/Inputs/inexistant 2>&1 |
> +FileCheck %s --check-prefix=NO-EXECUTABLE Check that We can parse the
debug map of the basic executable.
> +
> +CHECK-NOT: error
> +CHECK: DEBUG MAP:
> +CHECK: /Inputs/basic1.macho.x86_64.o:
> +CHECK: 0000000000000000 => 0000000100000ea0 _main
> +CHECK: /Inputs/basic2.macho.x86_64.o:
> +CHECK: 0000000000000310 => 0000000100001000 _baz
> +CHECK: 0000000000000020 => 0000000100000ed0 _foo
> +CHECK: 0000000000000070 => 0000000100000f20 _inc
> +CHECK: 0000000000000560 => 0000000100001008 _private_int
> +CHECK: /Inputs/basic3.macho.x86_64.o:
> +CHECK: 0000000000000020 => 0000000100000f40 _bar
> +CHECK: 0000000000000070 => 0000000100000f90 _inc
> +CHECK: 0000000000000004 => 0000000100001004 _val
> +CHECK: END DEBUG MAP
> +
> +
> +Check that we can parse the debug-map of the basic-lto executable
> +
> +CHECK-LTO-NOT: error
> +CHECK-LTO: DEBUG MAP:
> +CHECK-LTO: /Inputs/basic-lto.macho.x86_64.o:
> +CHECK-LTO: 0000000000000050 => 0000000100000f90 _bar
> +CHECK-LTO: 0000000000000658 => 0000000100001000 _baz
> +CHECK-LTO: 0000000000000010 => 0000000100000f50 _foo
> +CHECK-LTO: 0000000000000000 => 0000000100000f40 _main
> +CHECK-LTO: 00000000000008e8 => 0000000100001008 _private_int
> +CHECK-LTO: 00000000000008ec => 0000000100001004 _val
> +CHECK-LTO: END DEBUG MAP
> +
> +Check that we warn about missing object files (this presumes that the
> +files aren't present in the machine's /Inputs/ folder, which should be a
pretty safe bet).
> +
> +NOT-FOUND: cannot open{{.*}}"/Inputs/basic1.macho.x86_64.o": No such
> +file
> +NOT-FOUND: cannot open{{.*}}"/Inputs/basic2.macho.x86_64.o": No such
> +file
> +NOT-FOUND: cannot open{{.*}}"/Inputs/basic3.macho.x86_64.o": No such
> +file
> +NOT-FOUND: DEBUG MAP:
> +NOT-FOUND-NEXT: END DEBUG MAP
> +
> +Check that we correctly error out on invalid executatble.
> +
> +NO-EXECUTABLE: cannot parse{{.*}}/inexistant": No such file
> +NO-EXECUTABLE-NOT: DEBUG MAP
>
> Modified: llvm/trunk/tools/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/CMakeLists.txt?re
> v=224134&r1=224133&r2=224134&view=diff
> ======================================================================
> ========
> --- llvm/trunk/tools/CMakeLists.txt (original)
> +++ llvm/trunk/tools/CMakeLists.txt Fri Dec 12 11:31:24 2014
> @@ -36,6 +36,7 @@ add_llvm_tool_subdirectory(llvm-objdump)
> add_llvm_tool_subdirectory(llvm-readobj)
> add_llvm_tool_subdirectory(llvm-rtdyld)
> add_llvm_tool_subdirectory(llvm-dwarfdump)
> +add_llvm_tool_subdirectory(dsymutil)
> add_llvm_tool_subdirectory(llvm-vtabledump)
> if( LLVM_USE_INTEL_JITEVENTS )
> add_llvm_tool_subdirectory(llvm-jitlistener)
>
> Modified: llvm/trunk/tools/LLVMBuild.txt
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/LLVMBuild.txt?rev
> =224134&r1=224133&r2=224134&view=diff
> ======================================================================
> ========
> --- llvm/trunk/tools/LLVMBuild.txt (original)
> +++ llvm/trunk/tools/LLVMBuild.txt Fri Dec 12 11:31:24 2014
> @@ -16,7 +16,7 @@
>
> ;===------------------------------------------------------------------
> ------===;
>
> [common]
> -subdirectories = bugpoint llc lli llvm-ar llvm-as llvm-bcanalyzer
> llvm-cov llvm-diff llvm-dis llvm-dwarfdump llvm-extract
> llvm-jitlistener llvm-link llvm-lto llvm-mc llvm-nm llvm-objdump
> llvm-profdata llvm-rtdyld llvm-size macho-dump opt llvm-mcmarkup
> verify-uselistorder
> +subdirectories = bugpoint llc lli llvm-ar llvm-as llvm-bcanalyzer
> +llvm-cov llvm-diff llvm-dis llvm-dwarfdump llvm-extract
> +llvm-jitlistener llvm-link llvm-lto llvm-mc llvm-nm llvm-objdump
> +llvm-profdata llvm-rtdyld llvm-size macho-dump opt llvm-mcmarkup
> +verify-uselistorder dsymutil
>
> [component_0]
> type = Group
>
> Modified: llvm/trunk/tools/Makefile
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/Makefile?rev=2241
> 34&r1=224133&r2=224134&view=diff
> ======================================================================
> ========
> --- llvm/trunk/tools/Makefile (original)
> +++ llvm/trunk/tools/Makefile Fri Dec 12 11:31:24 2014
> @@ -33,7 +33,7 @@ PARALLEL_DIRS := opt llvm-as llvm-dis ll
> macho-dump llvm-objdump llvm-readobj llvm-rtdyld \
> llvm-dwarfdump llvm-cov llvm-size llvm-stress
llvm-mcmarkup \
> llvm-profdata llvm-symbolizer obj2yaml yaml2obj
llvm-c-test \
> - llvm-vtabledump verify-uselistorder
> + llvm-vtabledump verify-uselistorder dsymutil
>
> # If Intel JIT Events support is configured, build an extra tool to test
it.
> ifeq ($(USE_INTEL_JITEVENTS), 1)
>
> Added: llvm/trunk/tools/dsymutil/CMakeLists.txt
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/CMakeLis
> ts.txt?rev=224134&view=auto
> ======================================================================
> ========
> --- llvm/trunk/tools/dsymutil/CMakeLists.txt (added)
> +++ llvm/trunk/tools/dsymutil/CMakeLists.txt Fri Dec 12 11:31:24 2014
> @@ -0,0 +1,12 @@
> +set(LLVM_LINK_COMPONENTS
> + Object
> + Support
> + )
> +
> +add_llvm_tool(llvm-dsymutil
> + dsymutil.cpp
> + DebugMap.cpp
> + DwarfLinker.cpp
> + MachODebugMapParser.cpp
> + )
> +
>
> Added: llvm/trunk/tools/dsymutil/DebugMap.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/DebugMap
> .cpp?rev=224134&view=auto
> ======================================================================
> ========
> --- llvm/trunk/tools/dsymutil/DebugMap.cpp (added)
> +++ llvm/trunk/tools/dsymutil/DebugMap.cpp Fri Dec 12 11:31:24 2014
> @@ -0,0 +1,81 @@
> +//===- tools/dsymutil/DebugMap.cpp - Generic debug map representation
> +-----===// //
> +// The LLVM Linker
> +//
> +// This file is distributed under the University of Illinois Open
> +Source // License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------
> +------===//
> +#include "DebugMap.h"
> +
> +#include "llvm/ADT/iterator_range.h"
> +#include "llvm/ADT/STLExtras.h"
> +#include "llvm/Support/DataTypes.h"
> +#include "llvm/Support/Format.h"
> +#include "llvm/Support/raw_ostream.h"
> +#include <algorithm>
> +
> +namespace llvm {
> +namespace dsymutil {
> +
> +using namespace llvm::object;
> +
> +DebugMapObject::DebugMapObject(StringRef ObjectFilename)
> + : Filename(ObjectFilename) {}
> +
> +bool DebugMapObject::addSymbol(StringRef Name, uint64_t ObjectAddress,
> + uint64_t LinkedAddress) {
> + auto InsertResult = Symbols.insert(
> + std::make_pair(Name, SymbolMapping(ObjectAddress,
> +LinkedAddress)));
> + return InsertResult.second;
> +}
> +
> +void DebugMapObject::print(raw_ostream &OS) const {
> + OS << getObjectFilename() << ":\n";
> + // Sort the symbols in alphabetical order, like llvm-nm (and to get
> + // deterministic output for testing).
> + typedef std::pair<StringRef, SymbolMapping> Entry;
> + std::vector<Entry> Entries;
> + Entries.reserve(Symbols.getNumItems());
> + for (const auto &Sym : make_range(Symbols.begin(), Symbols.end()))
> + Entries.push_back(std::make_pair(Sym.getKey(), Sym.getValue()));
> + std::sort(
> + Entries.begin(), Entries.end(),
> + [](const Entry &LHS, const Entry &RHS) { return LHS.first <
> +RHS.first; });
> + for (const auto &Sym : Entries) {
> + OS << format("\t%016" PRIx64 " => %016" PRIx64 "\t%s\n",
> + Sym.second.ObjectAddress, Sym.second.BinaryAddress,
> + Sym.first.data());
> + }
> + OS << '\n';
> +}
> +
> +#ifndef NDEBUG
> +void DebugMapObject::dump() const { print(errs()); } #endif
> +
> +DebugMapObject &DebugMap::addDebugMapObject(StringRef ObjectFilePath)
> +{
> + Objects.emplace_back(new DebugMapObject(ObjectFilePath));
> + return *Objects.back();
> +}
> +
> +const DebugMapObject::SymbolMapping *
> +DebugMapObject::lookupSymbol(StringRef SymbolName) const {
> + StringMap<SymbolMapping>::const_iterator Sym =
> +Symbols.find(SymbolName);
> + if (Sym == Symbols.end())
> + return nullptr;
> + return &Sym->getValue();
> +}
> +
> +void DebugMap::print(raw_ostream &OS) const {
> + OS << "DEBUG MAP: object addr => executable addr\tsymbol name\n";
> + for (const auto &Obj : objects())
> + Obj->print(OS);
> + OS << "END DEBUG MAP\n";
> +}
> +
> +#ifndef NDEBUG
> +void DebugMap::dump() const { print(errs()); } #endif } }
>
> Added: llvm/trunk/tools/dsymutil/DebugMap.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/DebugMap
> .h?rev=224134&view=auto
> ======================================================================
> ========
> --- llvm/trunk/tools/dsymutil/DebugMap.h (added)
> +++ llvm/trunk/tools/dsymutil/DebugMap.h Fri Dec 12 11:31:24 2014
> @@ -0,0 +1,128 @@
> +//===- tools/dsymutil/DebugMap.h - Generic debug map representation
> +-------===// //
> +// The LLVM Linker
> +//
> +// This file is distributed under the University of Illinois Open
> +Source // License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------
> +------===//
> +///
> +/// \file
> +///
> +/// This file contains the class declaration of the DebugMap ///
> +entity. A DebugMap lists all the object files linked together to ///
> +produce an executable along with the linked address of all the ///
> +atoms used in these object files.
> +/// The DebugMap is an input to the DwarfLinker class that will ///
> +extract the Dwarf debug information from the referenced object ///
> +files and link their usefull debug info together.
> +///
> +//===----------------------------------------------------------------
> +------===// #ifndef LLVM_TOOLS_DSYMUTIL_DEBUGMAP_H #define
> +LLVM_TOOLS_DSYMUTIL_DEBUGMAP_H
> +
> +#include "llvm/ADT/StringMap.h"
> +#include "llvm/Object/ObjectFile.h"
> +#include "llvm/Support/ErrorOr.h"
> +#include "llvm/Support/Format.h"
> +#include "llvm/ADT/iterator_range.h"
> +#include <vector>
> +
> +namespace llvm {
> +class raw_ostream;
> +
> +namespace dsymutil {
> +class DebugMapObject;
> +
> +/// \brief The DebugMap object stores the list of object files to ///
> +query for debug information along with the mapping between the ///
> +symbols' addresses in the object file to their linked address in ///
> +the linked binary.
> +///
> +/// A DebugMap producer could look like this:
> +/// DebugMap *DM = new DebugMap();
> +/// for (const auto &Obj: LinkedObjects) {
> +/// DebugMapObject &DMO = DM->addDebugMapObject(Obj.getPath());
> +/// for (const auto &Sym: Obj.getLinkedSymbols())
> +/// DMO.addSymbol(Sym.getName(), Sym.getObjectFileAddress(),
> +/// Sym.getBinaryAddress());
> +/// }
> +///
> +/// A DebugMap consumer can then use the map to link the debug ///
> +information. For example something along the lines of:
> +/// for (const auto &DMO: DM->objects()) {
> +/// auto Obj = createBinary(DMO.getObjectFilename());
> +/// for (auto &DIE: Obj.getDwarfDIEs()) {
> +/// if (SymbolMapping *Sym = DMO.lookup(DIE.getName()))
> +/// DIE.relocate(Sym->ObjectAddress, Sym->BinaryAddress);
> +/// else
> +/// DIE.discardSubtree();
> +/// }
> +/// }
> +class DebugMap {
> + typedef std::vector<std::unique_ptr<DebugMapObject>>
> +ObjectContainer;
> + ObjectContainer Objects;
> +
> +public:
> + typedef ObjectContainer::const_iterator const_iterator;
> +
> + iterator_range<const_iterator> objects() const {
> + return make_range(begin(), end()); }
> +
> + const_iterator begin() const { return Objects.begin(); }
> +
> + const_iterator end() const { return Objects.end(); }
> +
> + /// This function adds an DebugMapObject to the list owned by this
> + /// debug map.
> + DebugMapObject &addDebugMapObject(StringRef ObjectFilePath);
> +
> + void print(raw_ostream &OS) const;
> +
> +#ifndef NDEBUG
> + void dump() const;
> +#endif
> +};
> +
> +/// \brief The DebugMapObject represents one object file described by
> +/// the DebugMap. It contains a list of mappings between addresses in
> +/// the object file and in the linked binary for all the linked atoms
> +/// in this object file.
> +class DebugMapObject {
> +public:
> + struct SymbolMapping {
> + uint64_t ObjectAddress;
> + uint64_t BinaryAddress;
> + SymbolMapping(uint64_t ObjectAddress, uint64_t BinaryAddress)
> + : ObjectAddress(ObjectAddress), BinaryAddress(BinaryAddress)
> +{}
> + };
> +
> + /// \brief Adds a symbol mapping to this DebugMapObject.
> + /// \returns false if the symbol was already registered. The
> + request /// is discarded in this case.
> + bool addSymbol(llvm::StringRef SymName, uint64_t ObjectAddress,
> + uint64_t LinkedAddress);
> +
> + /// \bried Lookup a symbol mapping.
> + /// \returns null if the symbol isn't found.
> + const SymbolMapping *lookupSymbol(StringRef SymbolName) const;
> +
> + llvm::StringRef getObjectFilename() const { return Filename; }
> +
> + void print(raw_ostream &OS) const;
> +#ifndef NDEBUG
> + void dump() const;
> +#endif
> +private:
> + friend class DebugMap;
> + /// DebugMapObjects can only be constructed by the owning DebugMap.
> + DebugMapObject(StringRef ObjectFilename);
> +
> + std::string Filename;
> + StringMap<SymbolMapping> Symbols;
> +};
> +}
> +}
> +
> +#endif // LLVM_TOOLS_DSYMUTIL_DEBUGMAP_H
>
> Added: llvm/trunk/tools/dsymutil/DwarfLinker.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/DwarfLin
> ker.cpp?rev=224134&view=auto
> ======================================================================
> ========
> --- llvm/trunk/tools/dsymutil/DwarfLinker.cpp (added)
> +++ llvm/trunk/tools/dsymutil/DwarfLinker.cpp Fri Dec 12 11:31:24 2014
> @@ -0,0 +1,20 @@
> +//===- tools/dsymutil/DwarfLinker.cpp - Dwarf debug info linker
> +-----------===// //
> +// The LLVM Linker
> +//
> +// This file is distributed under the University of Illinois Open
> +Source // License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------
> +------===//
> +#include "DebugMap.h"
> +#include "dsymutil.h"
> +
> +namespace llvm {
> +namespace dsymutil {
> +
> +bool linkDwarf(StringRef OutputFilename, const DebugMap &DM) {
> + // Do nothing for now.
> + return true;
> +}
> +}
> +}
>
> Copied: llvm/trunk/tools/dsymutil/LLVMBuild.txt (from r224130,
> llvm/trunk/tools/LLVMBuild.txt)
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/LLVMBuil
> d.txt?p2=llvm/trunk/tools/dsymutil/LLVMBuild.txt&p1=llvm/trunk/tools/L
> LVMBuild.txt&r1=224130&r2=224134&rev=224134&view=diff
> ======================================================================
> ========
> --- llvm/trunk/tools/LLVMBuild.txt (original)
> +++ llvm/trunk/tools/dsymutil/LLVMBuild.txt Fri Dec 12 11:31:24 2014
> @@ -1,4 +1,4 @@
> -;===- ./tools/LLVMBuild.txt ------------------------------------*-
> Conf -*--===;
> +;===- ./tools/dsymutil/LLVMBuild.txt ---------------------*- Conf
> +-*--===;
> ;
> ; The LLVM Compiler Infrastructure
> ;
> @@ -15,10 +15,8 @@
> ;
>
> ;===------------------------------------------------------------------
> ------===;
>
> -[common]
> -subdirectories = bugpoint llc lli llvm-ar llvm-as llvm-bcanalyzer
> llvm-cov llvm-diff llvm-dis llvm-dwarfdump llvm-extract
> llvm-jitlistener llvm-link llvm-lto llvm-mc llvm-nm llvm-objdump
> llvm-profdata llvm-rtdyld llvm-size macho-dump opt llvm-mcmarkup
> verify-uselistorder
> -
> [component_0]
> -type = Group
> -name = Tools
> -parent = $ROOT
> +type = Tool
> +name = llvm-dsymutil
> +parent = Tools
> +required_libraries = Object Support
>
> Added: llvm/trunk/tools/dsymutil/MachODebugMapParser.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/MachODeb
> ugMapParser.cpp?rev=224134&view=auto
> ======================================================================
> ========
> --- llvm/trunk/tools/dsymutil/MachODebugMapParser.cpp (added)
> +++ llvm/trunk/tools/dsymutil/MachODebugMapParser.cpp Fri Dec 12
> +++ 11:31:24 2014
> @@ -0,0 +1,247 @@
> +//===- tools/dsymutil/MachODebugMapParser.cpp - Parse STABS debug
> +maps ----===// //
> +// The LLVM Linker
> +//
> +// This file is distributed under the University of Illinois Open
> +Source // License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------
> +------===//
> +
> +#include "DebugMap.h"
> +#include "dsymutil.h"
> +#include "llvm/Object/MachO.h"
> +#include "llvm/Support/Path.h"
> +#include "llvm/Support/raw_ostream.h"
> +
> +namespace {
> +using namespace llvm;
> +using namespace llvm::dsymutil;
> +using namespace llvm::object;
> +
> +class MachODebugMapParser {
> +public:
> + MachODebugMapParser(StringRef BinaryPath, StringRef PathPrefix = "")
> + : BinaryPath(BinaryPath), PathPrefix(PathPrefix) {}
> +
> + /// \brief Parses and returns the DebugMap of the input binary.
> + /// \returns an error in case the provided BinaryPath doesn't exist
> + /// or isn't of a supported type.
> + ErrorOr<std::unique_ptr<DebugMap>> parse();
> +
> +private:
> + std::string BinaryPath;
> + std::string PathPrefix;
> +
> + /// OwningBinary constructed from the BinaryPath.
> + object::OwningBinary<object::MachOObjectFile> MainOwningBinary;
> + /// Map of the binary symbol addresses.
> + StringMap<uint64_t> MainBinarySymbolAddresses; /// The constructed
> + DebugMap.
> + std::unique_ptr<DebugMap> Result;
> +
> + /// Handle to the currently processed object file.
> + object::OwningBinary<object::MachOObjectFile> CurrentObjectFile;
> + /// Map of the currently processed object file symbol addresses.
> + StringMap<uint64_t> CurrentObjectAddresses; /// Element of the
> + debug map corresponfing to the current object file.
> + DebugMapObject *CurrentDebugMapObject;
> +
> + void switchToNewDebugMapObject(StringRef Filename); void
> + resetParserState(); uint64_t getMainBinarySymbolAddress(StringRef
> + Name); void loadMainBinarySymbols(); void
> + loadCurrentObjectFileSymbols(); void
> + handleStabSymbolTableEntry(uint32_t StringIndex, uint8_t Type,
> + uint8_t SectionIndex, uint16_t Flags,
> + uint64_t Value);
> +
> + template <typename STEType> void handleStabDebugMapEntry(const STEType
&STE) {
> + handleStabSymbolTableEntry(STE.n_strx, STE.n_type, STE.n_sect,
STE.n_desc,
> + STE.n_value);
> + }
> +};
> +
> +static void Warning(const Twine &Msg) { errs() << "warning: " + Msg +
> +"\n"; } }
> +
> +static ErrorOr<OwningBinary<MachOObjectFile>>
> +createMachOBinary(StringRef File) {
> + auto MemBufOrErr = MemoryBuffer::getFile(File);
> + if (auto Error = MemBufOrErr.getError())
> + return Error;
> +
> + MemoryBufferRef BufRef = (*MemBufOrErr)->getMemBufferRef();
> + auto MachOOrErr = ObjectFile::createMachOObjectFile(BufRef);
> + if (auto Error = MachOOrErr.getError())
> + return Error;
> +
> + return OwningBinary<MachOObjectFile>(std::move(*MachOOrErr),
> + std::move(*MemBufOrErr)); }
> +
> +/// Reset the parser state coresponding to the current object ///
> +file. This is to be called after an object file is finished ///
> +processing.
> +void MachODebugMapParser::resetParserState() {
> + CurrentObjectFile = OwningBinary<object::MachOObjectFile>();
> + CurrentObjectAddresses.clear();
> + CurrentDebugMapObject = nullptr;
> +}
> +
> +/// Create a new DebugMapObject. This function resets the state of
> +the /// parser that was referring to the last object file and sets
> +/// everything up to add symbols to the new one.
> +void MachODebugMapParser::switchToNewDebugMapObject(StringRef
> +Filename) {
> + resetParserState();
> +
> + SmallString<80> Path(PathPrefix);
> + sys::path::append(Path, Filename);
> +
> + auto MachOOrError = createMachOBinary(Path); if (auto Error =
> + MachOOrError.getError()) {
> + Warning(Twine("cannot open debug object \"") + Path.str() + "\": " +
> + Error.message() + "\n");
> + return;
> + }
> +
> + CurrentObjectFile = std::move(*MachOOrError);
> + loadCurrentObjectFileSymbols();
> + CurrentDebugMapObject = &Result->addDebugMapObject(Path); }
> +
> +/// This main parsing routine tries to open the main binary and if
> +/// successful iterates over the STAB entries. The real parsing is
> +/// done in handleStabSymbolTableEntry.
> +ErrorOr<std::unique_ptr<DebugMap>> MachODebugMapParser::parse() {
> + auto MainBinaryOrError = createMachOBinary(BinaryPath);
> + if (auto Error = MainBinaryOrError.getError())
> + return Error;
> +
> + MainOwningBinary = std::move(*MainBinaryOrError);
> + loadMainBinarySymbols(); Result = make_unique<DebugMap>(); const
> + auto &MainBinary = *MainOwningBinary.getBinary(); for (const
> + SymbolRef &Symbol : MainBinary.symbols()) {
> + const DataRefImpl &DRI = Symbol.getRawDataRefImpl();
> + if (MainBinary.is64Bit())
> + handleStabDebugMapEntry(MainBinary.getSymbol64TableEntry(DRI));
> + else
> + handleStabDebugMapEntry(MainBinary.getSymbolTableEntry(DRI));
> + }
> +
> + resetParserState();
> + return std::move(Result);
> +}
> +
> +/// Interpret the STAB entries to fill the DebugMap.
> +void MachODebugMapParser::handleStabSymbolTableEntry(uint32_t
StringIndex,
> + uint8_t Type,
> + uint8_t
SectionIndex,
> + uint16_t Flags,
> + uint64_t Value)
> +{
> + if (!(Type & MachO::N_STAB))
> + return;
> +
> + const MachOObjectFile &MachOBinary = *MainOwningBinary.getBinary();
> + const char *Name =
> + &MachOBinary.getStringTableData().data()[StringIndex];
> +
> + // An N_OSO entry represents the start of a new object file
description.
> + if (Type == MachO::N_OSO)
> + return switchToNewDebugMapObject(Name);
> +
> + // If the last N_OSO object file wasn't found, //
> + CurrentDebugMapObject will be null. Do not update anything // until
> + we find the next valid N_OSO entry.
> + if (!CurrentDebugMapObject)
> + return;
> +
> + switch (Type) {
> + case MachO::N_GSYM:
> + // This is a global variable. We need to query the main binary
> + // symbol table to find its address as it might not be in the
> + // debug map (for common symbols).
> + Value = getMainBinarySymbolAddress(Name);
> + if (Value == UnknownAddressOrSize)
> + return;
> + break;
> + case MachO::N_FUN:
> + // Functions are scopes in STABS. They have an end marker that we
> + // need to ignore.
> + if (Name[0] == '\0')
> + return;
> + break;
> + case MachO::N_STSYM:
> + break;
> + default:
> + return;
> + }
> +
> + auto ObjectSymIt = CurrentObjectAddresses.find(Name);
> + if (ObjectSymIt == CurrentObjectAddresses.end())
> + return Warning("could not find object file symbol for symbol " +
> + Twine(Name));
> + if (!CurrentDebugMapObject->addSymbol(Name, ObjectSymIt->getValue(),
Value))
> + return Warning(Twine("failed to insert symbol '") + Name +
> + "' in the debug map."); }
> +
> +/// Load the current object file symbols into CurrentObjectAddresses.
> +void MachODebugMapParser::loadCurrentObjectFileSymbols() {
> + CurrentObjectAddresses.clear();
> + const auto &Binary = *CurrentObjectFile.getBinary();
> +
> + for (auto Sym : Binary.symbols()) {
> + StringRef Name;
> + uint64_t Addr;
> + if (Sym.getAddress(Addr) || Addr == UnknownAddressOrSize ||
> + Sym.getName(Name))
> + continue;
> + CurrentObjectAddresses[Name] = Addr;
> + }
> +}
> +
> +/// Lookup a symbol address in the main binary symbol table. The ///
> +parser only needs to query common symbols, thus not every symbol's
> +/// address is available through this function.
> +uint64_t MachODebugMapParser::getMainBinarySymbolAddress(StringRef
> +Name) {
> + auto Sym = MainBinarySymbolAddresses.find(Name);
> + if (Sym == MainBinarySymbolAddresses.end())
> + return UnknownAddressOrSize;
> + return Sym->second;
> +}
> +
> +/// Load the interesting main binary symbols' addresses into ///
> +MainBinarySymbolAddresses.
> +void MachODebugMapParser::loadMainBinarySymbols() {
> + const MachOObjectFile &Binary = *MainOwningBinary.getBinary();
> + section_iterator Section = Binary.section_end();
> + for (const auto &Sym : Binary.symbols()) {
> + SymbolRef::Type Type;
> + // Skip undefined and STAB entries.
> + if (Sym.getType(Type) || (Type & SymbolRef::ST_Debug) ||
> + (Type & SymbolRef::ST_Unknown))
> + continue;
> + StringRef Name;
> + uint64_t Addr;
> + // The only symbols of interest are the global variables. These
> + // are the only ones that need to be queried because the address
> + // of common data won't be described in the debug map. All other
> + // addresses should be fetched for the debug map.
> + if (Sym.getAddress(Addr) || Addr == UnknownAddressOrSize ||
> + !(Sym.getFlags() & SymbolRef::SF_Global) ||
Sym.getSection(Section) ||
> + Section->isText() || Sym.getName(Name) || Name.size() == 0 ||
> + Name[0] == '\0')
> + continue;
> + MainBinarySymbolAddresses[Name] = Addr;
> + }
> +}
> +
> +namespace llvm {
> +namespace dsymutil {
> +llvm::ErrorOr<std::unique_ptr<DebugMap>> parseDebugMap(StringRef
InputFile,
> + StringRef
> +PrependPath) {
> + MachODebugMapParser Parser(InputFile, PrependPath);
> + return Parser.parse();
> +}
> +}
> +}
>
> Added: llvm/trunk/tools/dsymutil/Makefile
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/Makefile
> ?rev=224134&view=auto
> ======================================================================
> ========
> --- llvm/trunk/tools/dsymutil/Makefile (added)
> +++ llvm/trunk/tools/dsymutil/Makefile Fri Dec 12 11:31:24 2014
> @@ -0,0 +1,17 @@
> +##===- tools/dsymutil/Makefile -----------------------------*-
> +Makefile -*-===## #
> +# The LLVM Compiler Infrastructure
> +#
> +# This file is distributed under the University of Illinois Open
> +Source # License. See LICENSE.TXT for details.
> +#
> +##===----------------------------------------------------------------
> +------===##
> +
> +LEVEL := ../..
> +TOOLNAME := llvm-dsymutil
> +LINK_COMPONENTS := Object Support
> +
> +# This tool has no plugins, optimize startup time.
> +TOOL_NO_EXPORTS := 1
> +
> +include $(LEVEL)/Makefile.common
>
> Added: llvm/trunk/tools/dsymutil/dsymutil.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/dsymutil
> .cpp?rev=224134&view=auto
> ======================================================================
> ========
> --- llvm/trunk/tools/dsymutil/dsymutil.cpp (added)
> +++ llvm/trunk/tools/dsymutil/dsymutil.cpp Fri Dec 12 11:31:24 2014
> @@ -0,0 +1,73 @@
> +//===-- dsymutil.cpp - Debug info dumping utility for llvm
> +----------------===// //
> +// The LLVM Compiler Infrastructure
> +//
> +// This file is distributed under the University of Illinois Open
> +Source // License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------
> +------===//
> +//
> +// This program is a utility that aims to be a dropin replacement for
> +// Darwin's dsymutil.
> +//
> +//===----------------------------------------------------------------
> +------===//
> +
> +#include "DebugMap.h"
> +#include "dsymutil.h"
> +
> +#include "llvm/Support/ManagedStatic.h"
> +#include "llvm/Support/PrettyStackTrace.h"
> +#include "llvm/Support/Options.h"
> +#include "llvm/Support/raw_ostream.h"
> +#include "llvm/Support/Signals.h"
> +
> +#include <string>
> +
> +using namespace llvm::dsymutil;
> +
> +namespace {
> +using namespace llvm::cl;
> +
> +static opt<std::string> InputFile(Positional, desc("<input file>"),
> + init("a.out"));
> +
> +static opt<std::string> OsoPrependPath("oso-prepend-path",
> + desc("Specify a directory to
prepend "
> + "to the paths of object
files."),
> + value_desc("path"));
> +
> +static opt<bool> Verbose("v", desc("Verbosity level"), init(false));
> +
> +static opt<bool>
> + ParseOnly("parse-only",
> + desc("Only parse the debug map, do not actaully link "
> + "the DWARF."),
> + init(false));
> +}
> +
> +int main(int argc, char **argv) {
> + llvm::sys::PrintStackTraceOnErrorSignal();
> + llvm::PrettyStackTraceProgram StackPrinter(argc, argv);
> + llvm::llvm_shutdown_obj Shutdown;
> +
> + llvm::cl::ParseCommandLineOptions(argc, argv, "llvm dsymutil\n");
> + auto DebugMapPtrOrErr = parseDebugMap(InputFile, OsoPrependPath);
> +
> + if (auto EC = DebugMapPtrOrErr.getError()) {
> + llvm::errs() << "error: cannot parse the debug map for \"" <<
InputFile
> + << "\": " << EC.message() << '\n';
> + return 1;
> + }
> +
> + if (Verbose)
> + (*DebugMapPtrOrErr)->print(llvm::outs());
> +
> + if (ParseOnly)
> + return 0;
> +
> + std::string OutputBasename(InputFile); if (OutputBasename == "-")
> + OutputBasename = "a.out";
> +
> + return !linkDwarf(OutputBasename + ".dwarf", **DebugMapPtrOrErr); }
>
> Added: llvm/trunk/tools/dsymutil/dsymutil.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/dsymutil/dsymutil
> .h?rev=224134&view=auto
> ======================================================================
> ========
> --- llvm/trunk/tools/dsymutil/dsymutil.h (added)
> +++ llvm/trunk/tools/dsymutil/dsymutil.h Fri Dec 12 11:31:24 2014
> @@ -0,0 +1,37 @@
> +//===- tools/dsymutil/dsymutil.h - dsymutil high-level functionality
> +------===// //
> +// The LLVM Linker
> +//
> +// This file is distributed under the University of Illinois Open
> +Source // License. See LICENSE.TXT for details.
> +//
> +//===----------------------------------------------------------------
> +------===//
> +///
> +/// \file
> +///
> +/// This file contains the class declaration for the code that parses
> +STABS /// debug maps that are embedded in the binaries symbol tables.
> +///
> +//===----------------------------------------------------------------
> +------===// #ifndef LLVM_TOOLS_DSYMUTIL_DSYMUTIL_H #define
> +LLVM_TOOLS_DSYMUTIL_DSYMUTIL_H
> +
> +#include "DebugMap.h"
> +#include "llvm/ADT/StringRef.h"
> +#include "llvm/Support/ErrorOr.h"
> +#include <memory>
> +
> +namespace llvm {
> +namespace dsymutil {
> +/// \brief Extract the DebugMap from the given file.
> +/// The file has to be a MachO object file.
> +llvm::ErrorOr<std::unique_ptr<DebugMap>>
> +parseDebugMap(StringRef InputFile, StringRef PrependPath = "");
> +
> +/// \brief Link the Dwarf debuginfo as directed by the passed
> +DebugMap /// \p DM into a DwarfFile named \p OutputFilename.
> +/// \returns false if the link failed.
> +bool linkDwarf(StringRef OutputFilename, const DebugMap &DM); } }
> +#endif // LLVM_TOOLS_DSYMUTIL_DSYMUTIL_H
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
_______________________________________________
llvm-commits mailing list
llvm-commits at cs.uiuc.edu
http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list