summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/test/tools/llvm-symbolizer/basic.s19
-rw-r--r--llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp80
2 files changed, 63 insertions, 36 deletions
diff --git a/llvm/test/tools/llvm-symbolizer/basic.s b/llvm/test/tools/llvm-symbolizer/basic.s
new file mode 100644
index 00000000000..0ee3084d80a
--- /dev/null
+++ b/llvm/test/tools/llvm-symbolizer/basic.s
@@ -0,0 +1,19 @@
+# REQUIRES: x86-registered-target
+
+foo:
+ .space 10
+ nop
+ nop
+
+# RUN: llvm-mc -filetype=obj -triple=x86_64-pc-linux %s -o %t.o -g
+
+# Check input addresses specified on stdin.
+# RUN: echo -e "0xa\n0xb" | llvm-symbolizer --obj=%t.o | FileCheck %s
+# RUN: echo -e "10\n11" | llvm-symbolizer --obj=%t.o | FileCheck %s
+
+# Check input addresses specified on the command-line.
+# RUN: llvm-symbolizer 0xa 0xb --obj=%t.o | FileCheck %s
+# RUN: llvm-symbolizer 10 11 --obj=%t.o | FileCheck %s
+
+# CHECK: basic.s:5:0
+# CHECK: basic.s:6:0
diff --git a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
index 6d40a540350..891f1127d61 100644
--- a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
+++ b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp
@@ -90,6 +90,10 @@ static cl::opt<int> ClPrintSourceContextLines(
static cl::opt<bool> ClVerbose("verbose", cl::init(false),
cl::desc("Print verbose line info"));
+static cl::list<std::string> ClInputAddresses(cl::Positional,
+ cl::desc("<input addresses>..."),
+ cl::ZeroOrMore);
+
template<typename T>
static bool error(Expected<T> &ResOrErr) {
if (ResOrErr)
@@ -137,6 +141,38 @@ static bool parseCommand(StringRef InputString, bool &IsData,
return !StringRef(pos, offset_length).getAsInteger(0, ModuleOffset);
}
+static void symbolizeInput(StringRef InputString, LLVMSymbolizer &Symbolizer,
+ DIPrinter &Printer) {
+ bool IsData = false;
+ std::string ModuleName;
+ uint64_t ModuleOffset = 0;
+ if (!parseCommand(StringRef(InputString), IsData, ModuleName, ModuleOffset)) {
+ outs() << InputString;
+ return;
+ }
+
+ if (ClPrintAddress) {
+ outs() << "0x";
+ outs().write_hex(ModuleOffset);
+ StringRef Delimiter = ClPrettyPrint ? ": " : "\n";
+ outs() << Delimiter;
+ }
+ if (IsData) {
+ auto ResOrErr = Symbolizer.symbolizeData(ModuleName, ModuleOffset);
+ Printer << (error(ResOrErr) ? DIGlobal() : ResOrErr.get());
+ } else if (ClPrintInlining) {
+ auto ResOrErr =
+ Symbolizer.symbolizeInlinedCode(ModuleName, ModuleOffset, ClDwpName);
+ Printer << (error(ResOrErr) ? DIInliningInfo() : ResOrErr.get());
+ } else {
+ auto ResOrErr =
+ Symbolizer.symbolizeCode(ModuleName, ModuleOffset, ClDwpName);
+ Printer << (error(ResOrErr) ? DILineInfo() : ResOrErr.get());
+ }
+ outs() << "\n";
+ outs().flush();
+}
+
int main(int argc, char **argv) {
InitLLVM X(argc, argv);
@@ -159,43 +195,15 @@ int main(int argc, char **argv) {
DIPrinter Printer(outs(), ClPrintFunctions != FunctionNameKind::None,
ClPrettyPrint, ClPrintSourceContextLines, ClVerbose);
- const int kMaxInputStringLength = 1024;
- char InputString[kMaxInputStringLength];
+ if (ClInputAddresses.empty()) {
+ const int kMaxInputStringLength = 1024;
+ char InputString[kMaxInputStringLength];
- while (true) {
- if (!fgets(InputString, sizeof(InputString), stdin))
- break;
-
- bool IsData = false;
- std::string ModuleName;
- uint64_t ModuleOffset = 0;
- if (!parseCommand(StringRef(InputString), IsData, ModuleName,
- ModuleOffset)) {
- outs() << InputString;
- continue;
- }
-
- if (ClPrintAddress) {
- outs() << "0x";
- outs().write_hex(ModuleOffset);
- StringRef Delimiter = ClPrettyPrint ? ": " : "\n";
- outs() << Delimiter;
- }
- if (IsData) {
- auto ResOrErr = Symbolizer.symbolizeData(ModuleName, ModuleOffset);
- Printer << (error(ResOrErr) ? DIGlobal() : ResOrErr.get());
- } else if (ClPrintInlining) {
- auto ResOrErr =
- Symbolizer.symbolizeInlinedCode(ModuleName, ModuleOffset, ClDwpName);
- Printer << (error(ResOrErr) ? DIInliningInfo()
- : ResOrErr.get());
- } else {
- auto ResOrErr =
- Symbolizer.symbolizeCode(ModuleName, ModuleOffset, ClDwpName);
- Printer << (error(ResOrErr) ? DILineInfo() : ResOrErr.get());
- }
- outs() << "\n";
- outs().flush();
+ while (fgets(InputString, sizeof(InputString), stdin))
+ symbolizeInput(InputString, Symbolizer, Printer);
+ } else {
+ for (StringRef Address : ClInputAddresses)
+ symbolizeInput(Address, Symbolizer, Printer);
}
return 0;
OpenPOWER on IntegriCloud