From: Alexey Samsonov Date: Tue, 24 Dec 2013 19:33:22 +0000 (+0000) Subject: llvm-symbolizer: add --obj flag to specify a single object file that should be symbol... X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=42c9ecb7a4c1fa61593cba5a025272fb933616b5;p=oota-llvm.git llvm-symbolizer: add --obj flag to specify a single object file that should be symbolized. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@197988 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/docs/CommandGuide/llvm-symbolizer.rst b/docs/CommandGuide/llvm-symbolizer.rst index e03be9b1987..dfbdb3ac434 100644 --- a/docs/CommandGuide/llvm-symbolizer.rst +++ b/docs/CommandGuide/llvm-symbolizer.rst @@ -10,7 +10,9 @@ DESCRIPTION ----------- :program:`llvm-symbolizer` reads object file names and addresses from standard -input and prints corresponding source code locations to standard output. This +input and prints corresponding source code locations to standard output. +If object file is specified in command line, :program:`llvm-symbolizer` reads +only addresses from standard input. This program uses debug info sections and symbol table in the object files. EXAMPLE @@ -45,10 +47,22 @@ EXAMPLE _main /tmp/source_x86_64.cc:8 + $ cat addr2.txt + 0x4004f4 + 0x401000 + $ llvm-symbolizer -obj=a.out < addr2.txt + main + /tmp/a.cc:4 + + foo(int) + /tmp/a.cc:12 OPTIONS ------- +.. option:: -obj + Path to object file to be symbolized. + .. option:: -functions Print function names as well as source file/line locations. Defaults to true. diff --git a/test/DebugInfo/llvm-symbolizer.test b/test/DebugInfo/llvm-symbolizer.test index a8799cfa546..897cc3e0d5d 100644 --- a/test/DebugInfo/llvm-symbolizer.test +++ b/test/DebugInfo/llvm-symbolizer.test @@ -57,3 +57,12 @@ RUN: llvm-symbolizer < %t.input3 | FileCheck %s --check-prefix=UNKNOWN-ARCH UNKNOWN-ARCH-NOT: main UNKNOWN-ARCH: ?? UNKNOWN-ARCH-NOT: main + +RUN: echo "0x400559" > %t.input4 +RUN: echo "0x400436" >> %t.input4 +RUN: llvm-symbolizer --obj %p/Inputs/dwarfdump-test.elf-x86-64 < %t.input4 \ +RUN: | FileCheck %s --check-prefix=BINARY + +BINARY: main +BINARY-NEXT: /tmp/dbginfo{{[/\\]}}dwarfdump-test.cc:16 +BINARY: _start diff --git a/tools/llvm-symbolizer/llvm-symbolizer.cpp b/tools/llvm-symbolizer/llvm-symbolizer.cpp index c32e9494ea3..83f5c5ea88b 100644 --- a/tools/llvm-symbolizer/llvm-symbolizer.cpp +++ b/tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -51,6 +51,11 @@ static cl::opt ClDefaultArch("default-arch", cl::init(""), cl::desc("Default architecture " "(for multi-arch objects)")); +static cl::opt +ClBinaryName("obj", cl::init(""), + cl::desc("Path to object file to be symbolized (if not provided, " + "object file should be specified for each input line)")); + static bool parseCommand(bool &IsData, std::string &ModuleName, uint64_t &ModuleOffset) { const char *kDataCmd = "DATA "; @@ -62,7 +67,6 @@ static bool parseCommand(bool &IsData, std::string &ModuleName, return false; IsData = false; ModuleName = ""; - std::string ModuleOffsetStr = ""; char *pos = InputString; if (strncmp(pos, kDataCmd, strlen(kDataCmd)) == 0) { IsData = true; @@ -74,26 +78,29 @@ static bool parseCommand(bool &IsData, std::string &ModuleName, // If no cmd, assume it's CODE. IsData = false; } - // Skip delimiters and parse input filename. - pos += strspn(pos, kDelimiters); - if (*pos == '"' || *pos == '\'') { - char quote = *pos; - pos++; - char *end = strchr(pos, quote); - if (end == 0) - return false; - ModuleName = std::string(pos, end - pos); - pos = end + 1; + // Skip delimiters and parse input filename (if needed). + if (ClBinaryName == "") { + pos += strspn(pos, kDelimiters); + if (*pos == '"' || *pos == '\'') { + char quote = *pos; + pos++; + char *end = strchr(pos, quote); + if (end == 0) + return false; + ModuleName = std::string(pos, end - pos); + pos = end + 1; + } else { + int name_length = strcspn(pos, kDelimiters); + ModuleName = std::string(pos, name_length); + pos += name_length; + } } else { - int name_length = strcspn(pos, kDelimiters); - ModuleName = std::string(pos, name_length); - pos += name_length; + ModuleName = ClBinaryName; } // Skip delimiters and parse module offset. pos += strspn(pos, kDelimiters); int offset_length = strcspn(pos, kDelimiters); - ModuleOffsetStr = std::string(pos, offset_length); - if (StringRef(ModuleOffsetStr).getAsInteger(0, ModuleOffset)) + if (StringRef(pos, offset_length).getAsInteger(0, ModuleOffset)) return false; return true; } @@ -104,7 +111,7 @@ int main(int argc, char **argv) { PrettyStackTraceProgram X(argc, argv); llvm_shutdown_obj Y; // Call llvm_shutdown() on exit. - cl::ParseCommandLineOptions(argc, argv, "llvm symbolizer for compiler-rt\n"); + cl::ParseCommandLineOptions(argc, argv, "llvm-symbolizer\n"); LLVMSymbolizer::Options Opts(ClUseSymbolTable, ClPrintFunctions, ClPrintInlining, ClDemangle, ClDefaultArch); LLVMSymbolizer Symbolizer(Opts);