From: Saleem Abdulrasool Date: Sun, 25 May 2014 21:37:59 +0000 (+0000) Subject: tools: avoid use of std::function X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=d29bdc72bbefc938a23b51ac4282548d6e36d317;p=oota-llvm.git tools: avoid use of std::function Remove the use of the std::function and replace the capturing lambda with a non-capturing one, opting to pass the user data down to the context. This is needed as std::function is not yet available on all hosted platforms (it requires RTTI, which breaks on Windows). Thanks to Nico Rieck for pointing this out! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209607 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/tools/llvm-readobj/COFFDumper.cpp b/tools/llvm-readobj/COFFDumper.cpp index 7b9595f84c5..91f2a57dccf 100644 --- a/tools/llvm-readobj/COFFDumper.cpp +++ b/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(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/tools/llvm-readobj/Win64EHDumper.cpp b/tools/llvm-readobj/Win64EHDumper.cpp index 449df001cc9..c64d362469b 100644 --- a/tools/llvm-readobj/Win64EHDumper.cpp +++ b/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/tools/llvm-readobj/Win64EHDumper.h b/tools/llvm-readobj/Win64EHDumper.h index d0c129c68b8..2eac81048b4 100644 --- a/tools/llvm-readobj/Win64EHDumper.h +++ b/tools/llvm-readobj/Win64EHDumper.h @@ -13,8 +13,6 @@ #include "StreamWriter.h" #include "llvm/Support/Win64EH.h" -#include - namespace llvm { namespace object { class COFFObjectFile; @@ -28,15 +26,17 @@ class Dumper { raw_ostream &OS; public: - typedef std::function 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: