diff options
Diffstat (limited to 'lib/ExecutionEngine/MCJIT')
-rw-r--r-- | lib/ExecutionEngine/MCJIT/MCJIT.cpp | 19 | ||||
-rw-r--r-- | lib/ExecutionEngine/MCJIT/MCJIT.h | 20 | ||||
-rw-r--r-- | lib/ExecutionEngine/MCJIT/ObjectBuffer.h | 48 |
3 files changed, 23 insertions, 64 deletions
diff --git a/lib/ExecutionEngine/MCJIT/MCJIT.cpp b/lib/ExecutionEngine/MCJIT/MCJIT.cpp index f7b8a3b657ee..2c663c2e1edf 100644 --- a/lib/ExecutionEngine/MCJIT/MCJIT.cpp +++ b/lib/ExecutionEngine/MCJIT/MCJIT.cpp @@ -39,11 +39,10 @@ static struct RegisterJIT { extern "C" void LLVMLinkInMCJIT() { } -ExecutionEngine* -MCJIT::createJIT(std::unique_ptr<Module> M, - std::string *ErrorStr, +ExecutionEngine * +MCJIT::createJIT(std::unique_ptr<Module> M, std::string *ErrorStr, std::shared_ptr<MCJITMemoryManager> MemMgr, - std::shared_ptr<JITSymbolResolver> Resolver, + std::shared_ptr<LegacyJITSymbolResolver> Resolver, std::unique_ptr<TargetMachine> TM) { // Try to register the program as a source of symbols to resolve against. // @@ -64,7 +63,7 @@ MCJIT::createJIT(std::unique_ptr<Module> M, MCJIT::MCJIT(std::unique_ptr<Module> M, std::unique_ptr<TargetMachine> TM, std::shared_ptr<MCJITMemoryManager> MemMgr, - std::shared_ptr<JITSymbolResolver> Resolver) + std::shared_ptr<LegacyJITSymbolResolver> Resolver) : ExecutionEngine(TM->createDataLayout(), std::move(M)), TM(std::move(TM)), Ctx(nullptr), MemMgr(std::move(MemMgr)), Resolver(*this, std::move(Resolver)), Dyld(*this->MemMgr, this->Resolver), @@ -143,8 +142,14 @@ void MCJIT::setObjectCache(ObjectCache* NewCache) { } std::unique_ptr<MemoryBuffer> MCJIT::emitObject(Module *M) { + assert(M && "Can not emit a null module"); + MutexGuard locked(lock); + // Materialize all globals in the module if they have not been + // materialized already. + cantFail(M->materializeAll()); + // This must be a module which has already been added but not loaded to this // MCJIT instance, since these conditions are tested by our caller, // generateCodeForModule. @@ -165,7 +170,7 @@ std::unique_ptr<MemoryBuffer> MCJIT::emitObject(Module *M) { // Flush the output buffer to get the generated code into memory std::unique_ptr<MemoryBuffer> CompiledObjBuffer( - new ObjectMemoryBuffer(std::move(ObjBufferSV))); + new SmallVectorMemoryBuffer(std::move(ObjBufferSV))); // If we have an object cache, tell it about the new object. // Note that we're using the compiled image, not the loaded image (as below). @@ -666,3 +671,5 @@ LinkingSymbolResolver::findSymbol(const std::string &Name) { return nullptr; return ClientResolver->findSymbol(Name); } + +void LinkingSymbolResolver::anchor() {} diff --git a/lib/ExecutionEngine/MCJIT/MCJIT.h b/lib/ExecutionEngine/MCJIT/MCJIT.h index daf578f5daae..943b14942a0f 100644 --- a/lib/ExecutionEngine/MCJIT/MCJIT.h +++ b/lib/ExecutionEngine/MCJIT/MCJIT.h @@ -14,10 +14,10 @@ #include "llvm/ADT/SmallVector.h" #include "llvm/ExecutionEngine/ExecutionEngine.h" #include "llvm/ExecutionEngine/ObjectCache.h" -#include "llvm/ExecutionEngine/ObjectMemoryBuffer.h" #include "llvm/ExecutionEngine/RTDyldMemoryManager.h" #include "llvm/ExecutionEngine/RuntimeDyld.h" #include "llvm/IR/Module.h" +#include "llvm/Support/SmallVectorMemoryBuffer.h" namespace llvm { class MCJIT; @@ -26,11 +26,11 @@ class MCJIT; // functions across modules that it owns. It aggregates the memory manager // that is passed in to the MCJIT constructor and defers most functionality // to that object. -class LinkingSymbolResolver : public JITSymbolResolver { +class LinkingSymbolResolver : public LegacyJITSymbolResolver { public: LinkingSymbolResolver(MCJIT &Parent, - std::shared_ptr<JITSymbolResolver> Resolver) - : ParentEngine(Parent), ClientResolver(std::move(Resolver)) {} + std::shared_ptr<LegacyJITSymbolResolver> Resolver) + : ParentEngine(Parent), ClientResolver(std::move(Resolver)) {} JITSymbol findSymbol(const std::string &Name) override; @@ -41,7 +41,8 @@ public: private: MCJIT &ParentEngine; - std::shared_ptr<JITSymbolResolver> ClientResolver; + std::shared_ptr<LegacyJITSymbolResolver> ClientResolver; + void anchor() override; }; // About Module states: added->loaded->finalized. @@ -67,7 +68,7 @@ private: class MCJIT : public ExecutionEngine { MCJIT(std::unique_ptr<Module> M, std::unique_ptr<TargetMachine> tm, std::shared_ptr<MCJITMemoryManager> MemMgr, - std::shared_ptr<JITSymbolResolver> Resolver); + std::shared_ptr<LegacyJITSymbolResolver> Resolver); typedef llvm::SmallPtrSet<Module *, 4> ModulePtrSet; @@ -300,11 +301,10 @@ public: MCJITCtor = createJIT; } - static ExecutionEngine* - createJIT(std::unique_ptr<Module> M, - std::string *ErrorStr, + static ExecutionEngine * + createJIT(std::unique_ptr<Module> M, std::string *ErrorStr, std::shared_ptr<MCJITMemoryManager> MemMgr, - std::shared_ptr<JITSymbolResolver> Resolver, + std::shared_ptr<LegacyJITSymbolResolver> Resolver, std::unique_ptr<TargetMachine> TM); // @} diff --git a/lib/ExecutionEngine/MCJIT/ObjectBuffer.h b/lib/ExecutionEngine/MCJIT/ObjectBuffer.h deleted file mode 100644 index 92310f3eb54a..000000000000 --- a/lib/ExecutionEngine/MCJIT/ObjectBuffer.h +++ /dev/null @@ -1,48 +0,0 @@ -//===--- ObjectBuffer.h - Utility class to wrap object memory ---*- C++ -*-===// -// -// The LLVM Compiler Infrastructure -// -// This file is distributed under the University of Illinois Open Source -// License. See LICENSE.TXT for details. -// -//===----------------------------------------------------------------------===// -// -// This file declares a wrapper class to hold the memory into which an -// object will be generated. -// -//===----------------------------------------------------------------------===// - -#ifndef LLVM_EXECUTIONENGINE_OBJECTBUFFER_H -#define LLVM_EXECUTIONENGINE_OBJECTBUFFER_H - -#include "llvm/ADT/SmallVector.h" -#include "llvm/Support/MemoryBuffer.h" -#include "llvm/Support/raw_ostream.h" - -namespace llvm { - -class ObjectMemoryBuffer : public MemoryBuffer { -public: - template <unsigned N> - ObjectMemoryBuffer(SmallVector<char, N> SV) - : SV(SV), BufferName("<in-memory object>") { - init(this->SV.begin(), this->SV.end(), false); - } - - template <unsigned N> - ObjectMemoryBuffer(SmallVector<char, N> SV, StringRef Name) - : SV(SV), BufferName(Name) { - init(this->SV.begin(), this->SV.end(), false); - } - const char* getBufferIdentifier() const override { return BufferName.c_str(); } - - BufferKind getBufferKind() const override { return MemoryBuffer_Malloc; } - -private: - SmallVector<char, 4096> SV; - std::string BufferName; -}; - -} // namespace llvm - -#endif |