summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorLang Hames <lhames@gmail.com>2018-05-21 23:45:40 +0000
committerLang Hames <lhames@gmail.com>2018-05-21 23:45:40 +0000
commit373f4628a5eef559aa5cdde01355ddf31846aba9 (patch)
tree17d0fb5bb7801b2a331d883b61d224c4121de450 /llvm/lib
parentf1aa348b3150cad8c9e0a993f731b24c6bfe9a07 (diff)
downloadbcm5719-llvm-373f4628a5eef559aa5cdde01355ddf31846aba9.tar.gz
bcm5719-llvm-373f4628a5eef559aa5cdde01355ddf31846aba9.zip
[LKH] Add a replacement RTDyldLayer.
llvm-svn: 332918
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/ExecutionEngine/Orc/CMakeLists.txt1
-rw-r--r--llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp96
2 files changed, 97 insertions, 0 deletions
diff --git a/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt b/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt
index ec0d0e0796b..aaa968f073e 100644
--- a/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt
+++ b/llvm/lib/ExecutionEngine/Orc/CMakeLists.txt
@@ -10,6 +10,7 @@ add_llvm_library(LLVMOrcJIT
OrcError.cpp
OrcMCJITReplacement.cpp
RPCUtils.cpp
+ RTDyldObjectLinkingLayer.cpp
ADDITIONAL_HEADER_DIRS
${LLVM_MAIN_INCLUDE_DIR}/llvm/ExecutionEngine/Orc
diff --git a/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
new file mode 100644
index 00000000000..c635ab0f883
--- /dev/null
+++ b/llvm/lib/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.cpp
@@ -0,0 +1,96 @@
+//===-- RTDyldObjectLinkingLayer.cpp - RuntimeDyld backed ORC ObjectLayer -===//
+//
+// 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/RTDyldObjectLinkingLayer.h"
+
+namespace llvm {
+namespace orc {
+
+RTDyldObjectLinkingLayer2::RTDyldObjectLinkingLayer2(
+ ExecutionSession &ES, ResourcesGetterFunction GetResources,
+ NotifyLoadedFunction NotifyLoaded, NotifyFinalizedFunction NotifyFinalized)
+ : ObjectLayer(ES), GetResources(std::move(GetResources)),
+ NotifyLoaded(std::move(NotifyLoaded)),
+ NotifyFinalized(std::move(NotifyFinalized)), ProcessAllSections(false) {}
+
+void RTDyldObjectLinkingLayer2::emit(MaterializationResponsibility R,
+ VModuleKey K,
+ std::unique_ptr<MemoryBuffer> O) {
+ assert(O && "Object has already been materialized");
+
+ auto &ES = getExecutionSession();
+
+ auto ObjFile = object::ObjectFile::createObjectFile(*O);
+ if (!ObjFile) {
+ getExecutionSession().reportError(ObjFile.takeError());
+ R.failMaterialization();
+ }
+
+ auto Resources = GetResources(K);
+
+ JITSymbolResolverAdapter ResolverAdapter(ES, *Resources.Resolver, &R);
+ auto RTDyld =
+ llvm::make_unique<RuntimeDyld>(*Resources.MemMgr, ResolverAdapter);
+ RTDyld->setProcessAllSections(ProcessAllSections);
+
+ {
+ std::lock_guard<std::mutex> Lock(RTDyldLayerMutex);
+
+ assert(!ActiveRTDylds.count(K) &&
+ "An active RTDyld already exists for this key?");
+ ActiveRTDylds[K] = RTDyld.get();
+
+ assert(!MemMgrs.count(K) &&
+ "A memory manager already exists for this key?");
+ MemMgrs[K] = Resources.MemMgr;
+ }
+
+ auto Info = RTDyld->loadObject(**ObjFile);
+
+ {
+ SymbolMap Symbols;
+ for (auto &KV : RTDyld->getSymbolTable())
+ Symbols[ES.getSymbolStringPool().intern(KV.first)] = KV.second;
+ R.resolve(Symbols);
+ }
+
+ if (NotifyLoaded)
+ NotifyLoaded(K, **ObjFile, *Info);
+
+ RTDyld->finalizeWithMemoryManagerLocking();
+
+ {
+ std::lock_guard<std::mutex> Lock(RTDyldLayerMutex);
+ ActiveRTDylds.erase(K);
+ }
+
+ if (RTDyld->hasError()) {
+ ES.reportError(make_error<StringError>(RTDyld->getErrorString(),
+ inconvertibleErrorCode()));
+ R.failMaterialization();
+ }
+
+ R.finalize();
+
+ if (NotifyFinalized)
+ NotifyFinalized(K);
+}
+
+void RTDyldObjectLinkingLayer2::mapSectionAddress(
+ VModuleKey K, const void *LocalAddress, JITTargetAddress TargetAddr) const {
+ std::lock_guard<std::mutex> Lock(RTDyldLayerMutex);
+ auto ActiveRTDyldItr = ActiveRTDylds.find(K);
+
+ assert(ActiveRTDyldItr != ActiveRTDylds.end() &&
+ "No active RTDyld instance found for key");
+ ActiveRTDyldItr->second->mapSectionAddress(LocalAddress, TargetAddr);
+}
+
+} // End namespace orc.
+} // End namespace llvm.
OpenPOWER on IntegriCloud