[LKH] Add a new IRCompileLayer.

llvm-svn: 333127
diff --git a/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt b/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt
index aaa968f..5b94ae9 100644
--- a/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt
+++ b/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt
@@ -2,6 +2,7 @@
   Core.cpp
   ExecutionUtils.cpp
   IndirectionUtils.cpp
+  IRCompileLayer.cpp
   Legacy.cpp
   Layer.cpp
   NullResolver.cpp
diff --git a/llvm/lib/ExecutionEngine/Orc/IRCompileLayer.cpp b/llvm/lib/ExecutionEngine/Orc/IRCompileLayer.cpp
new file mode 100644
index 0000000..0c17f9b
--- /dev/null
+++ b/llvm/lib/ExecutionEngine/Orc/IRCompileLayer.cpp
@@ -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.
diff --git a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
index c635ab0..3e5336ca 100644
--- a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
+++ b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
@@ -22,7 +22,7 @@
 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();