diff options
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/test/tools/llvm-symbolizer/basic.s | 19 | ||||
-rw-r--r-- | llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp | 80 |
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; |