[llvm] r217887 - Fix move-only type issues in Interpreter with MSVC

Reid Kleckner reid at kleckner.net
Tue Sep 16 10:28:15 PDT 2014


Author: rnk
Date: Tue Sep 16 12:28:15 2014
New Revision: 217887

URL: http://llvm.org/viewvc/llvm-project?rev=217887&view=rev
Log:
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.

Modified:
    llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.h

Modified: llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.h?rev=217887&r1=217886&r2=217887&view=diff
==============================================================================
--- llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.h (original)
+++ llvm/trunk/lib/ExecutionEngine/Interpreter/Interpreter.h Tue Sep 16 12:28:15 2014
@@ -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.





More information about the llvm-commits mailing list