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)
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);
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;