diff --git a/llvm/include/llvm/DebugInfo/Symbolize/DIPrinter.h b/llvm/include/llvm/DebugInfo/Symbolize/DIPrinter.h --- a/llvm/include/llvm/DebugInfo/Symbolize/DIPrinter.h +++ b/llvm/include/llvm/DebugInfo/Symbolize/DIPrinter.h @@ -51,8 +51,7 @@ StringRef Command) = 0; virtual bool printError(const Request &Request, - const ErrorInfoBase &ErrorInfo, - StringRef ErrorBanner) = 0; + const ErrorInfoBase &ErrorInfo) = 0; virtual void listBegin() = 0; virtual void listEnd() = 0; @@ -66,10 +65,12 @@ int SourceContextLines; }; +using ErrorHandler = function_ref; + class PlainPrinterBase : public DIPrinter { protected: raw_ostream &OS; - raw_ostream &ES; + ErrorHandler ErrHandler; PrinterConfig Config; void print(const DILineInfo &Info, bool Inlined); @@ -85,8 +86,8 @@ void printHeader(uint64_t Address); public: - PlainPrinterBase(raw_ostream &OS, raw_ostream &ES, PrinterConfig &Config) - : OS(OS), ES(ES), Config(Config) {} + PlainPrinterBase(raw_ostream &OS, ErrorHandler EH, PrinterConfig &Config) + : OS(OS), ErrHandler(EH), Config(Config) {} void print(const Request &Request, const DILineInfo &Info) override; void print(const Request &Request, const DIInliningInfo &Info) override; @@ -96,8 +97,8 @@ void printInvalidCommand(const Request &Request, StringRef Command) override; - bool printError(const Request &Request, const ErrorInfoBase &ErrorInfo, - StringRef ErrorBanner) override; + bool printError(const Request &Request, + const ErrorInfoBase &ErrorInfo) override; void listBegin() override {} void listEnd() override {} @@ -110,8 +111,8 @@ void printFooter() override; public: - LLVMPrinter(raw_ostream &OS, raw_ostream &ES, PrinterConfig &Config) - : PlainPrinterBase(OS, ES, Config) {} + LLVMPrinter(raw_ostream &OS, ErrorHandler EH, PrinterConfig &Config) + : PlainPrinterBase(OS, EH, Config) {} }; class GNUPrinter : public PlainPrinterBase { @@ -119,8 +120,9 @@ void printSimpleLocation(StringRef Filename, const DILineInfo &Info) override; public: - GNUPrinter(raw_ostream &OS, raw_ostream &ES, PrinterConfig &Config) - : PlainPrinterBase(OS, ES, Config) {} + GNUPrinter(raw_ostream &OS, ErrorHandler EH, PrinterConfig &Config) + : PlainPrinterBase(OS, EH, Config) {} + }; class JSONPrinter : public DIPrinter { @@ -147,8 +149,8 @@ void printInvalidCommand(const Request &Request, StringRef Command) override; - bool printError(const Request &Request, const ErrorInfoBase &ErrorInfo, - StringRef ErrorBanner) override; + bool printError(const Request &Request, + const ErrorInfoBase &ErrorInfo) override; void listBegin() override; void listEnd() override; diff --git a/llvm/lib/DebugInfo/Symbolize/DIPrinter.cpp b/llvm/lib/DebugInfo/Symbolize/DIPrinter.cpp --- a/llvm/lib/DebugInfo/Symbolize/DIPrinter.cpp +++ b/llvm/lib/DebugInfo/Symbolize/DIPrinter.cpp @@ -266,11 +266,8 @@ } bool PlainPrinterBase::printError(const Request &Request, - const ErrorInfoBase &ErrorInfo, - StringRef ErrorBanner) { - ES << ErrorBanner; - ErrorInfo.log(ES); - ES << '\n'; + const ErrorInfoBase &ErrorInfo) { + ErrHandler(ErrorInfo, Request.ModuleName); // Print an empty struct too. return true; } @@ -374,13 +371,11 @@ StringRef Command) { printError(Request, StringError("unable to parse arguments: " + Command, - std::make_error_code(std::errc::invalid_argument)), - ""); + std::make_error_code(std::errc::invalid_argument))); } bool JSONPrinter::printError(const Request &Request, - const ErrorInfoBase &ErrorInfo, - StringRef ErrorBanner) { + const ErrorInfoBase &ErrorInfo) { json::Object Json = toJSON(Request, ErrorInfo.message()); if (ObjectList) ObjectList->push_back(std::move(Json)); diff --git a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp --- a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp +++ b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp @@ -632,8 +632,7 @@ std::string Path; if (!getOrFindDebugBinary(BuildID, Path)) { return createStringError(errc::no_such_file_or_directory, - Twine("could not find build ID '") + - toHex(BuildID) + "'"); + "could not find build ID"); } return getOrCreateModuleInfo(Path); } diff --git a/llvm/test/DebugInfo/Symbolize/ELF/symtab-file2.yaml b/llvm/test/DebugInfo/Symbolize/ELF/symtab-file2.yaml --- a/llvm/test/DebugInfo/Symbolize/ELF/symtab-file2.yaml +++ b/llvm/test/DebugInfo/Symbolize/ELF/symtab-file2.yaml @@ -49,7 +49,7 @@ # RUN: yaml2obj --docnum=2 %s -o %t2 # RUN: llvm-symbolizer --obj=%t2 0 0 2>&1 | FileCheck %s --check-prefix=CHECK2 -# CHECK2: error reading file: st_name (0xffff) is past the end of the string table of size +# CHECK2: llvm-symbolizer{{.*}}: error: '{{.*}}symtab-file2.yaml.tmp2': st_name (0xffff) is past the end of the string table of size # CHECK2-NEXT: ?? # CHECK2-NEXT: ??:0:0 # CHECK2-EMPTY: diff --git a/llvm/test/DebugInfo/symbolize-missing-file.test b/llvm/test/DebugInfo/symbolize-missing-file.test --- a/llvm/test/DebugInfo/symbolize-missing-file.test +++ b/llvm/test/DebugInfo/symbolize-missing-file.test @@ -1,3 +1,3 @@ RUN: llvm-symbolizer --obj=unexisting-file 0x1234 2>&1 | FileCheck -DMSG=%errc_ENOENT %s -CHECK: LLVMSymbolizer: error reading file: [[MSG]] +CHECK: llvm-symbolizer{{.*}}: error: 'unexisting-file': [[MSG]] diff --git a/llvm/test/tools/llvm-symbolizer/debuginfod-missing-build-id.test b/llvm/test/tools/llvm-symbolizer/debuginfod-missing-build-id.test --- a/llvm/test/tools/llvm-symbolizer/debuginfod-missing-build-id.test +++ b/llvm/test/tools/llvm-symbolizer/debuginfod-missing-build-id.test @@ -7,4 +7,4 @@ STDOUT: ?? STDOUT: ??:0:0 -STDERR-COUNT-2: LLVMSymbolizer: error reading file: could not find build ID 'ABAD' +STDERR-COUNT-2: llvm-symbolizer{{.*}}: error: 'ABAD': could not find build ID diff --git a/llvm/test/tools/llvm-symbolizer/output-style-inlined.test b/llvm/test/tools/llvm-symbolizer/output-style-inlined.test --- a/llvm/test/tools/llvm-symbolizer/output-style-inlined.test +++ b/llvm/test/tools/llvm-symbolizer/output-style-inlined.test @@ -37,13 +37,13 @@ RUN: llvm-symbolizer --output-style=LLVM --obj=%p/Inputs/not.exist 0x1 0x2 --no-inlines 2>&1 \ RUN: | FileCheck %s --check-prefix=NOT-EXIST-LLVM -DMSG=%errc_ENOENT -# NOT-EXIST-GNU: LLVMSymbolizer: error reading file: [[MSG]] +# NOT-EXIST-GNU: llvm-symbolizer{{.*}}: error: '{{.*}}Inputs/not.exist': [[MSG]] # NOT-EXIST-GNU-NEXT: ?? # NOT-EXIST-GNU-NEXT: ??:0 # NOT-EXIST-GNU-NEXT: ?? # NOT-EXIST-GNU-NEXT: ??:0 -# NOT-EXIST-LLVM: LLVMSymbolizer: error reading file: [[MSG]] +# NOT-EXIST-LLVM: llvm-symbolizer{{.*}}: error: '{{.*}}Inputs/not.exist': [[MSG]] # NOT-EXIST-LLVM-NEXT: ?? # NOT-EXIST-LLVM-NEXT: ??:0:0 # NOT-EXIST-LLVM-EMPTY: diff --git a/llvm/test/tools/llvm-symbolizer/pdb/missing_pdb.test b/llvm/test/tools/llvm-symbolizer/pdb/missing_pdb.test --- a/llvm/test/tools/llvm-symbolizer/pdb/missing_pdb.test +++ b/llvm/test/tools/llvm-symbolizer/pdb/missing_pdb.test @@ -4,7 +4,7 @@ llvm-symbolizer should print one error and two unknown line info records. -ERROR: LLVMSymbolizer: error reading file: {{.*}}: [[MSG]] +ERROR: llvm-symbolizer{{.*}}: error: '{{.*}}missing_pdb.pdb': [[MSG]] ERROR-NOT: error reading file CHECK: ?? diff --git a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp --- a/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp +++ b/llvm/tools/llvm-symbolizer/llvm-symbolizer.cpp @@ -36,6 +36,7 @@ #include "llvm/Support/InitLLVM.h" #include "llvm/Support/Path.h" #include "llvm/Support/StringSaver.h" +#include "llvm/Support/WithColor.h" #include "llvm/Support/raw_ostream.h" #include #include @@ -83,6 +84,16 @@ }; } // namespace +static std::string ToolName; + +static void printError(const ErrorInfoBase &EI, StringRef Path) { + WithColor::error(errs(), ToolName); + if (!EI.isA()) + errs() << "'" << Path << "': "; + EI.log(errs()); + errs() << '\n'; +} + template static void print(const Request &Request, Expected &ResOrErr, DIPrinter &Printer) { @@ -96,8 +107,7 @@ bool PrintEmpty = true; handleAllErrors(std::move(ResOrErr.takeError()), [&](const ErrorInfoBase &EI) { - PrintEmpty = Printer.printError( - Request, EI, "LLVMSymbolizer: error reading file: "); + PrintEmpty = Printer.printError(Request, EI); }); if (PrintEmpty) @@ -378,7 +388,8 @@ InitLLVM X(argc, argv); sys::InitializeCOMRAII COM(sys::COMThreadingMode::MultiThreaded); - bool IsAddr2Line = sys::path::stem(argv[0]).contains("addr2line"); + ToolName = argv[0]; + bool IsAddr2Line = sys::path::stem(ToolName).contains("addr2line"); BumpPtrAllocator A; StringSaver Saver(A); SymbolizerOptTable Tbl; @@ -461,11 +472,11 @@ std::unique_ptr Printer; if (Style == OutputStyle::GNU) - Printer = std::make_unique(outs(), errs(), Config); + Printer = std::make_unique(outs(), printError, Config); else if (Style == OutputStyle::JSON) Printer = std::make_unique(outs(), Config); else - Printer = std::make_unique(outs(), errs(), Config); + Printer = std::make_unique(outs(), printError, Config); std::vector InputAddresses = Args.getAllArgValues(OPT_INPUT); if (InputAddresses.empty()) {