[Orc][Kaleidoscope] Fix a fixme - no reason we can't use C++14 in the tutorials.
authorLang Hames <lhames@gmail.com>
Wed, 18 Feb 2015 23:16:09 +0000 (23:16 +0000)
committerLang Hames <lhames@gmail.com>
Wed, 18 Feb 2015 23:16:09 +0000 (23:16 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@229765 91177308-0d34-0410-b5e6-96231b3b80d8

examples/Kaleidoscope/Orc/fully_lazy/toy.cpp

index 3ef9799..9210dd1 100644 (file)
@@ -1253,18 +1253,21 @@ public:
     // Step 4) Add the module containing the stub to the JIT.
     auto H = addModule(C.takeM());
 
-    // Step 5) Set the compile and update actions for the callback. The compile
-    //         action will IRGen and Codegen the function. The update action
-    //         will update FunctionBodyPointer to point at the newly compiled
-    //         function pointer.
+    // Step 5) Set the compile and update actions for the callback.
     //
-    // FIXME: Use generalized capture for FnAST when we get C++14 support.
-    FunctionAST *FnASTPtr = FnAST.release();
-    CallbackInfo.setCompileAction([this,FnASTPtr](){
-      std::unique_ptr<FunctionAST> Fn(FnASTPtr);
-      auto H = addModule(IRGen(Session, *Fn));
-      return findSymbolIn(H, Fn->Proto->Name).getAddress();
-    });
+    //   The compile action will IRGen the function and add it to the JIT, then
+    // request its address, which will trigger codegen. Since we don't need the
+    // AST after this, we pass ownership of the AST into the compile action:
+    // compile actions (and update actions) are deleted after they're run, so
+    // this will free the AST for us.
+    //
+    //   The update action will update FunctionBodyPointer to point at the newly
+    // compiled function.
+    CallbackInfo.setCompileAction(
+      [this,Fn = std::shared_ptr<FunctionAST>(std::move(FnAST))](){
+        auto H = addModule(IRGen(Session, *Fn));
+        return findSymbolIn(H, Fn->Proto->Name).getAddress();
+      });
     CallbackInfo.setUpdateAction(
       CompileCallbacks.getLocalFPUpdater(H, Mangle(BodyPtrName)));
   }