From: Alexey Lapshin Date: Thu, 27 Feb 2020 14:53:00 +0000 (+0300) Subject: [Debuginfo][NFC] Unify error reporting routines inside DebugInfoDWARF. X-Git-Tag: llvmorg-12-init~13466 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=f943443e65115c83648f1185adedb3d333f8619f;p=platform%2Fupstream%2Fllvm.git [Debuginfo][NFC] Unify error reporting routines inside DebugInfoDWARF. Summary: Error reporting in DebugInfoDWARF library currently done in three ways : 1. Direct calls to WithColor::error()/WithColor::warning() 2. ErrorPolicy defaultErrorHandler(Error E); 3. void dumpWarning(Error Warning); additionally, other locations could have more variations: lld/ELF/SyntheticSection.cpp if (Error e = cu->tryExtractDIEsIfNeeded(false)) { error(toString(sec) + ": " + toString(std::move(e))); DebugInfo/DWARF/DWARFUnit.cpp if (Error e = tryExtractDIEsIfNeeded(CUDieOnly)) WithColor::error() << toString(std::move(e)); Thus error reporting could look inconsistent. To have a consistent error messages it is necessary to have a possibility to redefine error reporting functions. This patch creates two handlers and allows to redefine them. It also patches all places inside DebugInfoDWARF to use these handlers. The intention is always to use following handlers for error reporting purposes inside DebugInfoDWARF: DebugInfo/DWARF/DWARFContext.h std::function RecoverableErrorHandler = WithColor::defaultErrorHandler; std::function WarningHandler = WithColor::defaultWarningHandler; This is last patch from series of patches: D74481, D74635, D75118. Reviewers: jhenderson, dblaikie, probinson, aprantl, JDevlieghere Reviewed By: jhenderson Subscribers: grimar, hiraditya, llvm-commits Tags: #llvm, #debug-info Differential Revision: https://reviews.llvm.org/D74308 --- diff --git a/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h b/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h index d001366..4f2130c 100644 --- a/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h +++ b/llvm/include/llvm/DebugInfo/DWARF/DWARFContext.h @@ -106,7 +106,11 @@ class DWARFContext : public DIContext { public: DWARFContext(std::unique_ptr DObj, - std::string DWPName = ""); + std::string DWPName = "", + std::function RecoverableErrorHandler = + WithColor::defaultErrorHandler, + std::function WarningHandler = + WithColor::defaultWarningHandler); ~DWARFContext(); DWARFContext(DWARFContext &) = delete; @@ -350,12 +354,19 @@ public: static std::unique_ptr create(const object::ObjectFile &Obj, const LoadedObjectInfo *L = nullptr, - function_ref HandleError = WithColor::defaultErrorHandler, - std::string DWPName = ""); + std::string DWPName = "", + std::function RecoverableErrorHandler = + WithColor::defaultErrorHandler, + std::function WarningHandler = + WithColor::defaultWarningHandler); static std::unique_ptr create(const StringMap> &Sections, - uint8_t AddrSize, bool isLittleEndian = sys::IsLittleEndianHost); + uint8_t AddrSize, bool isLittleEndian = sys::IsLittleEndianHost, + std::function RecoverableErrorHandler = + WithColor::defaultErrorHandler, + std::function WarningHandler = + WithColor::defaultWarningHandler); /// Loads register info for the architecture of the provided object file. /// Improves readability of dumped DWARF expressions. Requires the caller to diff --git a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp index 0ce69da..d08f1e0 100644 --- a/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp +++ b/llvm/lib/DebugInfo/DWARF/DWARFContext.cpp @@ -65,8 +65,12 @@ using FileLineInfoKind = DILineInfoSpecifier::FileLineInfoKind; using FunctionNameKind = DILineInfoSpecifier::FunctionNameKind; DWARFContext::DWARFContext(std::unique_ptr DObj, - std::string DWPName) - : DIContext(CK_DWARF), DWPName(std::move(DWPName)), DObj(std::move(DObj)) {} + std::string DWPName, + std::function RecoverableErrorHandler, + std::function WarningHandler) + : DIContext(CK_DWARF), DWPName(std::move(DWPName)), + RecoverableErrorHandler(RecoverableErrorHandler), + WarningHandler(WarningHandler), DObj(std::move(DObj)) {} DWARFContext::~DWARFContext() = default; @@ -1885,18 +1889,25 @@ public: std::unique_ptr DWARFContext::create(const object::ObjectFile &Obj, const LoadedObjectInfo *L, - function_ref HandleError, - std::string DWPName) { - auto DObj = std::make_unique(Obj, L, HandleError); - return std::make_unique(std::move(DObj), std::move(DWPName)); + std::string DWPName, + std::function RecoverableErrorHandler, + std::function WarningHandler) { + auto DObj = + std::make_unique(Obj, L, RecoverableErrorHandler); + return std::make_unique(std::move(DObj), std::move(DWPName), + RecoverableErrorHandler, + WarningHandler); } std::unique_ptr DWARFContext::create(const StringMap> &Sections, - uint8_t AddrSize, bool isLittleEndian) { + uint8_t AddrSize, bool isLittleEndian, + std::function RecoverableErrorHandler, + std::function WarningHandler) { auto DObj = std::make_unique(Sections, AddrSize, isLittleEndian); - return std::make_unique(std::move(DObj), ""); + return std::make_unique( + std::move(DObj), "", RecoverableErrorHandler, WarningHandler); } Error DWARFContext::loadRegisterInfo(const object::ObjectFile &Obj) { diff --git a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp index 03c0ee9..19a07f9 100644 --- a/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp +++ b/llvm/lib/DebugInfo/Symbolize/Symbolize.cpp @@ -563,8 +563,7 @@ LLVMSymbolizer::getOrCreateModuleInfo(const std::string &ModuleName) { } } if (!Context) - Context = DWARFContext::create( - *Objects.second, nullptr, WithColor::defaultErrorHandler, Opts.DWPName); + Context = DWARFContext::create(*Objects.second, nullptr, Opts.DWPName); return createModuleInfo(Objects.first, std::move(Context), ModuleName); } diff --git a/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp b/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp index b2db87ad..1e7149e 100644 --- a/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp +++ b/llvm/unittests/DebugInfo/DWARF/DWARFDebugInfoTest.cpp @@ -2532,7 +2532,7 @@ TEST(DWARFDebugInfo, TestErrorReporting) { // DWARFContext parses whole file and finds the two errors we expect. int Errors = 0; std::unique_ptr Ctx1 = - DWARFContext::create(**Obj, nullptr, [&](Error E) { + DWARFContext::create(**Obj, nullptr, "", [&](Error E) { ++Errors; consumeError(std::move(E)); });