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
This commit is contained in:
Saleem Abdulrasool 2014-05-25 21:37:59 +00:00
parent b6a667f033
commit d29bdc72bb
3 changed files with 14 additions and 12 deletions

View File

@ -849,11 +849,12 @@ void COFFDumper::printUnwindInfo() {
case COFF::IMAGE_FILE_MACHINE_AMD64: { case COFF::IMAGE_FILE_MACHINE_AMD64: {
Win64EH::Dumper Dumper(W); Win64EH::Dumper Dumper(W);
Win64EH::Dumper::SymbolResolver Resolver = Win64EH::Dumper::SymbolResolver Resolver =
[this](const object::coff_section *Section, uint64_t Offset, [](const object::coff_section *Section, uint64_t Offset,
SymbolRef &Symbol) -> error_code { SymbolRef &Symbol, void *user_data) -> error_code {
return this->resolveSymbol(Section, Offset, Symbol); 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); Dumper.printData(Ctx);
break; break;
} }

View File

@ -120,7 +120,8 @@ static std::string formatSymbol(const Dumper::Context &Ctx,
StringRef Name; StringRef Name;
SymbolRef Symbol; 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); OS << format(" (0x%" PRIX64 ")", Offset);
return OS.str(); return OS.str();
} }
@ -139,7 +140,7 @@ static error_code resolveRelocation(const Dumper::Context &Ctx,
const coff_section *&ResolvedSection, const coff_section *&ResolvedSection,
uint64_t &ResolvedAddress) { uint64_t &ResolvedAddress) {
SymbolRef Symbol; SymbolRef Symbol;
if (error_code EC = Ctx.ResolveSymbol(Section, Offset, Symbol)) if (error_code EC = Ctx.ResolveSymbol(Section, Offset, Symbol, Ctx.UserData))
return EC; return EC;
if (error_code EC = Symbol.getAddress(ResolvedAddress)) if (error_code EC = Symbol.getAddress(ResolvedAddress))

View File

@ -13,8 +13,6 @@
#include "StreamWriter.h" #include "StreamWriter.h"
#include "llvm/Support/Win64EH.h" #include "llvm/Support/Win64EH.h"
#include <functional>
namespace llvm { namespace llvm {
namespace object { namespace object {
class COFFObjectFile; class COFFObjectFile;
@ -28,15 +26,17 @@ class Dumper {
raw_ostream &OS; raw_ostream &OS;
public: public:
typedef std::function<error_code(const object::coff_section *, uint64_t, typedef error_code (*SymbolResolver)(const object::coff_section *, uint64_t,
object::SymbolRef &)> SymbolResolver; object::SymbolRef &, void *);
struct Context { struct Context {
const object::COFFObjectFile &COFF; const object::COFFObjectFile &COFF;
SymbolResolver ResolveSymbol; SymbolResolver ResolveSymbol;
void *UserData;
Context(const object::COFFObjectFile &COFF, SymbolResolver Resolver) Context(const object::COFFObjectFile &COFF, SymbolResolver Resolver,
: COFF(COFF), ResolveSymbol(Resolver) {} void *UserData)
: COFF(COFF), ResolveSymbol(Resolver), UserData(UserData) {}
}; };
private: private: