mirror of
https://github.com/RPCSX/llvm.git
synced 2025-04-11 20:52:31 +00:00
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:
parent
b6a667f033
commit
d29bdc72bb
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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))
|
||||||
|
@ -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:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user