diff --git a/llvm/tools/llvm-readobj/COFFDumper.cpp b/llvm/tools/llvm-readobj/COFFDumper.cpp index 7b9595f84c5b..91f2a57dccfc 100644 --- a/llvm/tools/llvm-readobj/COFFDumper.cpp +++ b/llvm/tools/llvm-readobj/COFFDumper.cpp @@ -849,11 +849,12 @@ void COFFDumper::printUnwindInfo() { case COFF::IMAGE_FILE_MACHINE_AMD64: { Win64EH::Dumper Dumper(W); Win64EH::Dumper::SymbolResolver Resolver = - [this](const object::coff_section *Section, uint64_t Offset, - SymbolRef &Symbol) -> error_code { - return this->resolveSymbol(Section, Offset, Symbol); + [](const object::coff_section *Section, uint64_t Offset, + SymbolRef &Symbol, void *user_data) -> error_code { + COFFDumper *Dumper = reinterpret_cast<COFFDumper*>(user_data); + return Dumper->resolveSymbol(Section, Offset, Symbol); }; - Win64EH::Dumper::Context Ctx(*Obj, Resolver); + Win64EH::Dumper::Context Ctx(*Obj, Resolver, this); Dumper.printData(Ctx); break; } diff --git a/llvm/tools/llvm-readobj/Win64EHDumper.cpp b/llvm/tools/llvm-readobj/Win64EHDumper.cpp index 449df001cc97..c64d362469bf 100644 --- a/llvm/tools/llvm-readobj/Win64EHDumper.cpp +++ b/llvm/tools/llvm-readobj/Win64EHDumper.cpp @@ -120,7 +120,8 @@ static std::string formatSymbol(const Dumper::Context &Ctx, StringRef Name; SymbolRef Symbol; - if (Ctx.ResolveSymbol(Section, Offset, Symbol) || Symbol.getName(Name)) { + if (Ctx.ResolveSymbol(Section, Offset, Symbol, Ctx.UserData) || + Symbol.getName(Name)) { OS << format(" (0x%" PRIX64 ")", Offset); return OS.str(); } @@ -139,7 +140,7 @@ static error_code resolveRelocation(const Dumper::Context &Ctx, const coff_section *&ResolvedSection, uint64_t &ResolvedAddress) { SymbolRef Symbol; - if (error_code EC = Ctx.ResolveSymbol(Section, Offset, Symbol)) + if (error_code EC = Ctx.ResolveSymbol(Section, Offset, Symbol, Ctx.UserData)) return EC; if (error_code EC = Symbol.getAddress(ResolvedAddress)) diff --git a/llvm/tools/llvm-readobj/Win64EHDumper.h b/llvm/tools/llvm-readobj/Win64EHDumper.h index d0c129c68b80..2eac81048b4f 100644 --- a/llvm/tools/llvm-readobj/Win64EHDumper.h +++ b/llvm/tools/llvm-readobj/Win64EHDumper.h @@ -13,8 +13,6 @@ #include "StreamWriter.h" #include "llvm/Support/Win64EH.h" -#include <functional> - namespace llvm { namespace object { class COFFObjectFile; @@ -28,15 +26,17 @@ class Dumper { raw_ostream &OS; public: - typedef std::function<error_code(const object::coff_section *, uint64_t, - object::SymbolRef &)> SymbolResolver; + typedef error_code (*SymbolResolver)(const object::coff_section *, uint64_t, + object::SymbolRef &, void *); struct Context { const object::COFFObjectFile &COFF; SymbolResolver ResolveSymbol; + void *UserData; - Context(const object::COFFObjectFile &COFF, SymbolResolver Resolver) - : COFF(COFF), ResolveSymbol(Resolver) {} + Context(const object::COFFObjectFile &COFF, SymbolResolver Resolver, + void *UserData) + : COFF(COFF), ResolveSymbol(Resolver), UserData(UserData) {} }; private: