1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2025-01-31 12:41:49 +01:00

Fix move-only type issues in Interpreter with MSVC

MSVC 2012 cannot infer any move special members, but it will call them
if available. MSVC 2013 cannot infer move assignment. Therefore,
explicitly implement the special members for the ExecutionContext class
and its contained types.

llvm-svn: 217887
This commit is contained in:
Reid Kleckner 2014-09-16 17:28:15 +00:00
parent adc8e63b0f
commit 4e285135f7

View File

@ -41,18 +41,13 @@ class AllocaHolder {
public:
AllocaHolder() {}
// Make this type move-only.
#if defined(_MSC_VER) && _MSC_VER < 1800
// Hack around bugs in MSVC 2012. It always tries to copy this class.
AllocaHolder(const AllocaHolder &RHS)
: Allocations(std::move(const_cast<AllocaHolder &>(RHS).Allocations)) {}
AllocaHolder &operator=(const AllocaHolder &RHS) {
Allocations = std::move(const_cast<AllocaHolder &>(RHS).Allocations);
// Make this type move-only. Define explicit move special members for MSVC.
AllocaHolder(AllocaHolder &&RHS) : Allocations(std::move(RHS.Allocations)) {}
AllocaHolder &operator=(AllocaHolder &&RHS) {
Allocations = std::move(RHS.Allocations);
return *this;
}
#else
AllocaHolder(AllocaHolder &&RHS) : Allocations(std::move(RHS.Allocations)) {}
#endif
~AllocaHolder() {
for (void *Allocation : Allocations)
@ -71,11 +66,28 @@ struct ExecutionContext {
Function *CurFunction;// The currently executing function
BasicBlock *CurBB; // The currently executing BB
BasicBlock::iterator CurInst; // The next instruction to execute
std::map<Value *, GenericValue> Values; // LLVM values used in this invocation
std::vector<GenericValue> VarArgs; // Values passed through an ellipsis
CallSite Caller; // Holds the call that called subframes.
// NULL if main func or debugger invoked fn
std::map<Value *, GenericValue> Values; // LLVM values used in this invocation
std::vector<GenericValue> VarArgs; // Values passed through an ellipsis
AllocaHolder Allocas; // Track memory allocated by alloca
ExecutionContext() : CurFunction(nullptr), CurBB(nullptr), CurInst(nullptr) {}
ExecutionContext(ExecutionContext &&O)
: CurFunction(O.CurFunction), CurBB(O.CurBB), CurInst(O.CurInst),
Caller(O.Caller), Values(std::move(O.Values)),
VarArgs(std::move(O.VarArgs)), Allocas(std::move(O.Allocas)) {}
ExecutionContext &operator=(ExecutionContext &&O) {
CurFunction = O.CurFunction;
CurBB = O.CurBB;
CurInst = O.CurInst;
Caller = O.Caller;
Values = std::move(O.Values);
VarArgs = std::move(O.VarArgs);
Allocas = std::move(O.Allocas);
}
};
// Interpreter - This class represents the entirety of the interpreter.