OSDN Git Service

[LKH] Add a new IRCompileLayer.
authorLang Hames <lhames@gmail.com>
Wed, 23 May 2018 21:27:01 +0000 (21:27 +0000)
committerLang Hames <lhames@gmail.com>
Wed, 23 May 2018 21:27:01 +0000 (21:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@333127 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/ExecutionEngine/Orc/IRCompileLayer.h
lib/ExecutionEngine/Orc/CMakeLists.txt
lib/ExecutionEngine/Orc/IRCompileLayer.cpp [new file with mode: 0644]
lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp

index cbdc06f..ad64815 100644 (file)
@@ -16,8 +16,9 @@
 
 #include "llvm/ADT/STLExtras.h"
 #include "llvm/ExecutionEngine/JITSymbol.h"
-#include "llvm/ExecutionEngine/Orc/Core.h"
+#include "llvm/ExecutionEngine/Orc/Layer.h"
 #include "llvm/Support/Error.h"
+#include "llvm/Support/MemoryBuffer.h"
 #include <memory>
 #include <string>
 
@@ -27,6 +28,29 @@ class Module;
 
 namespace orc {
 
+class IRCompileLayer2 : public IRLayer {
+public:
+  using CompileFunction =
+      std::function<Expected<std::unique_ptr<MemoryBuffer>>(Module &)>;
+
+  using NotifyCompiledFunction =
+      std::function<void(VModuleKey K, std::unique_ptr<Module>)>;
+
+  IRCompileLayer2(ExecutionSession &ES, ObjectLayer &BaseLayer,
+                  CompileFunction Compile);
+
+  void setNotifyCompiled(NotifyCompiledFunction NotifyCompiled);
+
+  void emit(MaterializationResponsibility R, VModuleKey K,
+            std::unique_ptr<Module> M) override;
+
+private:
+  mutable std::mutex IRLayerMutex;
+  ObjectLayer &BaseLayer;
+  CompileFunction Compile;
+  NotifyCompiledFunction NotifyCompiled = NotifyCompiledFunction();
+};
+
 /// Eager IR compiling layer.
 ///
 ///   This layer immediately compiles each IR module added via addModule to an
index aaa968f..5b94ae9 100644 (file)
@@ -2,6 +2,7 @@ add_llvm_library(LLVMOrcJIT
   Core.cpp
   ExecutionUtils.cpp
   IndirectionUtils.cpp
+  IRCompileLayer.cpp
   Legacy.cpp
   Layer.cpp
   NullResolver.cpp
diff --git a/lib/ExecutionEngine/Orc/IRCompileLayer.cpp b/lib/ExecutionEngine/Orc/IRCompileLayer.cpp
new file mode 100644 (file)
index 0000000..0c17f9b
--- /dev/null
@@ -0,0 +1,44 @@
+//===--------------- IRCompileLayer.cpp - IR Compiling Layer --------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm/ExecutionEngine/Orc/IRCompileLayer.h"
+
+namespace llvm {
+namespace orc {
+
+IRCompileLayer2::IRCompileLayer2(ExecutionSession &ES, ObjectLayer &BaseLayer,
+                                 CompileFunction Compile)
+    : IRLayer(ES), BaseLayer(BaseLayer), Compile(std::move(Compile)) {}
+
+void IRCompileLayer2::setNotifyCompiled(NotifyCompiledFunction NotifyCompiled) {
+  std::lock_guard<std::mutex> Lock(IRLayerMutex);
+  this->NotifyCompiled = std::move(NotifyCompiled);
+}
+
+void IRCompileLayer2::emit(MaterializationResponsibility R, VModuleKey K,
+                           std::unique_ptr<Module> M) {
+  assert(M && "Module must not be null");
+
+  if (auto Obj = Compile(*M)) {
+    {
+      std::lock_guard<std::mutex> Lock(IRLayerMutex);
+      if (NotifyCompiled)
+        NotifyCompiled(K, std::move(M));
+      else
+        M = nullptr;
+    }
+    BaseLayer.emit(std::move(R), std::move(K), std::move(*Obj));
+  } else {
+    R.failMaterialization();
+    getExecutionSession().reportError(Obj.takeError());
+  }
+}
+
+} // End namespace orc.
+} // End namespace llvm.
index c635ab0..3e5336c 100644 (file)
@@ -22,7 +22,7 @@ RTDyldObjectLinkingLayer2::RTDyldObjectLinkingLayer2(
 void RTDyldObjectLinkingLayer2::emit(MaterializationResponsibility R,
                                      VModuleKey K,
                                      std::unique_ptr<MemoryBuffer> O) {
-  assert(O && "Object has already been materialized");
+  assert(O && "Object must not be null");
 
   auto &ES = getExecutionSession();