diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp --- a/llvm/tools/llvm-readobj/COFFDumper.cpp +++ b/llvm/tools/llvm-readobj/COFFDumper.cpp @@ -77,7 +77,8 @@ public: friend class COFFObjectDumpDelegate; COFFDumper(const llvm::object::COFFObjectFile *Obj, ScopedPrinter &Writer) - : ObjDumper(Writer), Obj(Obj), Writer(Writer), Types(100) {} + : ObjDumper(Writer, Obj->getFileName()), Obj(Obj), Writer(Writer), + Types(100) {} void printFileHeaders() override; void printSectionHeaders() override; diff --git a/llvm/tools/llvm-readobj/ELFDumper.cpp b/llvm/tools/llvm-readobj/ELFDumper.cpp --- a/llvm/tools/llvm-readobj/ELFDumper.cpp +++ b/llvm/tools/llvm-readobj/ELFDumper.cpp @@ -64,7 +64,6 @@ #include #include #include -#include #include using namespace llvm; @@ -355,8 +354,6 @@ }; mutable SmallVector, 16> VersionMap; - std::unordered_set Warnings; - std::string describe(const Elf_Shdr &Sec) const; public: @@ -435,9 +432,6 @@ Expected> getRelocationTarget(const Relocation &R, const Elf_Shdr *SymTab) const; - - std::function WarningHandler; - void reportUniqueWarning(Error Err) const; }; template @@ -956,14 +950,6 @@ const Twine &Label, unsigned EntriesNum); }; -template -void ELFDumper::reportUniqueWarning(Error Err) const { - handleAllErrors(std::move(Err), [&](const ErrorInfoBase &EI) { - cantFail(WarningHandler(EI.message()), - "WarningHandler should always return ErrorSuccess"); - }); -} - template void DumpStyle::reportUniqueWarning(Error Err) const { this->dumper().reportUniqueWarning(std::move(Err)); @@ -2020,16 +2006,9 @@ template ELFDumper::ELFDumper(const object::ELFObjectFile &O, ScopedPrinter &Writer) - : ObjDumper(Writer), ObjF(O), Obj(*O.getELFFile()), DynRelRegion(O), - DynRelaRegion(O), DynRelrRegion(O), DynPLTRelRegion(O), DynamicTable(O) { - // Dumper reports all non-critical errors as warnings. - // It does not print the same warning more than once. - WarningHandler = [this](const Twine &Msg) { - if (Warnings.insert(Msg.str()).second) - reportWarning(createError(Msg), ObjF.getFileName()); - return Error::success(); - }; - + : ObjDumper(Writer, O.getFileName()), ObjF(O), Obj(*O.getELFFile()), + DynRelRegion(O), DynRelaRegion(O), DynRelrRegion(O), DynPLTRelRegion(O), + DynamicTable(O) { if (opts::Output == opts::GNU) ELFDumperStyle.reset(new GNUStyle(Writer, *this)); else diff --git a/llvm/tools/llvm-readobj/MachODumper.cpp b/llvm/tools/llvm-readobj/MachODumper.cpp --- a/llvm/tools/llvm-readobj/MachODumper.cpp +++ b/llvm/tools/llvm-readobj/MachODumper.cpp @@ -27,7 +27,7 @@ class MachODumper : public ObjDumper { public: MachODumper(const MachOObjectFile *Obj, ScopedPrinter &Writer) - : ObjDumper(Writer), Obj(Obj) {} + : ObjDumper(Writer, Obj->getFileName()), Obj(Obj) {} void printFileHeaders() override; void printSectionHeaders() override; diff --git a/llvm/tools/llvm-readobj/ObjDumper.h b/llvm/tools/llvm-readobj/ObjDumper.h --- a/llvm/tools/llvm-readobj/ObjDumper.h +++ b/llvm/tools/llvm-readobj/ObjDumper.h @@ -16,6 +16,8 @@ #include "llvm/Object/ObjectFile.h" #include "llvm/Support/CommandLine.h" +#include + namespace llvm { namespace object { class COFFImportFile; @@ -32,7 +34,7 @@ class ObjDumper { public: - ObjDumper(ScopedPrinter &Writer); + ObjDumper(ScopedPrinter &Writer, StringRef ObjName); virtual ~ObjDumper(); virtual bool canDumpContent() { return true; } @@ -109,6 +111,9 @@ void printSectionsAsHex(const object::ObjectFile &Obj, ArrayRef Sections); + std::function WarningHandler; + void reportUniqueWarning(Error Err) const; + protected: ScopedPrinter &W; @@ -117,6 +122,8 @@ virtual void printDynamicSymbols() {} virtual void printProgramHeaders() {} virtual void printSectionMapping() {} + + std::unordered_set Warnings; }; std::unique_ptr createCOFFDumper(const object::COFFObjectFile &Obj, diff --git a/llvm/tools/llvm-readobj/ObjDumper.cpp b/llvm/tools/llvm-readobj/ObjDumper.cpp --- a/llvm/tools/llvm-readobj/ObjDumper.cpp +++ b/llvm/tools/llvm-readobj/ObjDumper.cpp @@ -26,9 +26,23 @@ return createStringError(object::object_error::parse_failed, Msg); } -ObjDumper::ObjDumper(ScopedPrinter &Writer) : W(Writer) {} +ObjDumper::ObjDumper(ScopedPrinter &Writer, StringRef ObjName) : W(Writer) { + // Dumper reports all non-critical errors as warnings. + // It does not print the same warning more than once. + WarningHandler = [=](const Twine &Msg) { + if (Warnings.insert(Msg.str()).second) + reportWarning(createError(Msg), ObjName); + return Error::success(); + }; +} + +ObjDumper::~ObjDumper() {} -ObjDumper::~ObjDumper() { +void ObjDumper::reportUniqueWarning(Error Err) const { + handleAllErrors(std::move(Err), [&](const ErrorInfoBase &EI) { + cantFail(WarningHandler(EI.message()), + "WarningHandler should always return ErrorSuccess"); + }); } static void printAsPrintable(raw_ostream &W, const uint8_t *Start, size_t Len) { diff --git a/llvm/tools/llvm-readobj/WasmDumper.cpp b/llvm/tools/llvm-readobj/WasmDumper.cpp --- a/llvm/tools/llvm-readobj/WasmDumper.cpp +++ b/llvm/tools/llvm-readobj/WasmDumper.cpp @@ -57,7 +57,7 @@ class WasmDumper : public ObjDumper { public: WasmDumper(const WasmObjectFile *Obj, ScopedPrinter &Writer) - : ObjDumper(Writer), Obj(Obj) {} + : ObjDumper(Writer, Obj->getFileName()), Obj(Obj) {} void printFileHeaders() override; void printSectionHeaders() override; diff --git a/llvm/tools/llvm-readobj/XCOFFDumper.cpp b/llvm/tools/llvm-readobj/XCOFFDumper.cpp --- a/llvm/tools/llvm-readobj/XCOFFDumper.cpp +++ b/llvm/tools/llvm-readobj/XCOFFDumper.cpp @@ -24,7 +24,7 @@ public: XCOFFDumper(const XCOFFObjectFile &Obj, ScopedPrinter &Writer) - : ObjDumper(Writer), Obj(Obj) {} + : ObjDumper(Writer, Obj.getFileName()), Obj(Obj) {} void printFileHeaders() override; void printSectionHeaders() override;