summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/CommandGuide/llvm-symbolizer.rst16
-rw-r--r--test/DebugInfo/llvm-symbolizer.test9
-rw-r--r--tools/llvm-symbolizer/llvm-symbolizer.cpp41
3 files changed, 48 insertions, 18 deletions
diff --git a/docs/CommandGuide/llvm-symbolizer.rst b/docs/CommandGuide/llvm-symbolizer.rst
index e03be9b198..dfbdb3ac43 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 a8799cfa54..897cc3e0d5 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 c32e9494ea..83f5c5ea88 100644
--- a/tools/llvm-symbolizer/llvm-symbolizer.cpp
+++ b/tools/llvm-symbolizer/llvm-symbolizer.cpp
@@ -51,6 +51,11 @@ static cl::opt<std::string> ClDefaultArch("default-arch", cl::init(""),
cl::desc("Default architecture "
"(for multi-arch objects)"));
+static cl::opt<std::string>
+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);