diff options
Diffstat (limited to 'llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp')
-rw-r--r-- | llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp | 71 |
1 files changed, 33 insertions, 38 deletions
diff --git a/llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp b/llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp index 58cf4e5e6dd..da5f03799e3 100644 --- a/llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp +++ b/llvm/lib/ExecutionEngine/MCJIT/MCJIT.cpp @@ -11,6 +11,8 @@ #include "llvm/ExecutionEngine/GenericValue.h" #include "llvm/ExecutionEngine/JITEventListener.h" #include "llvm/ExecutionEngine/MCJIT.h" +#include "llvm/ExecutionEngine/ObjectBuffer.h" +#include "llvm/ExecutionEngine/ObjectImage.h" #include "llvm/ExecutionEngine/SectionMemoryManager.h" #include "llvm/IR/DataLayout.h" #include "llvm/IR/DerivedTypes.h" @@ -19,7 +21,6 @@ #include "llvm/IR/Module.h" #include "llvm/MC/MCAsmInfo.h" #include "llvm/Object/Archive.h" -#include "llvm/Object/ObjectFile.h" #include "llvm/PassManager.h" #include "llvm/Support/DynamicLibrary.h" #include "llvm/Support/ErrorHandling.h" @@ -30,8 +31,6 @@ using namespace llvm; -void ObjectCache::anchor() {} - namespace { static struct RegisterJIT { @@ -75,7 +74,6 @@ MCJIT::MCJIT(std::unique_ptr<Module> M, std::unique_ptr<TargetMachine> tm, OwnedModules.addModule(std::move(First)); setDataLayout(TM->getSubtargetImpl()->getDataLayout()); - RegisterJITEventListener(JITEventListener::createGDBRegistrationListener()); } MCJIT::~MCJIT() { @@ -101,13 +99,13 @@ bool MCJIT::removeModule(Module *M) { } void MCJIT::addObjectFile(std::unique_ptr<object::ObjectFile> Obj) { - std::unique_ptr<RuntimeDyld::LoadedObjectInfo> L = Dyld.loadObject(*Obj); - if (Dyld.hasError()) + std::unique_ptr<ObjectImage> LoadedObject = Dyld.loadObject(std::move(Obj)); + if (!LoadedObject || Dyld.hasError()) report_fatal_error(Dyld.getErrorString()); - NotifyObjectEmitted(*Obj, *L); + NotifyObjectEmitted(*LoadedObject); - LoadedObjects.push_back(std::move(Obj)); + LoadedObjects.push_back(std::move(LoadedObject)); } void MCJIT::addObjectFile(object::OwningBinary<object::ObjectFile> Obj) { @@ -127,7 +125,7 @@ void MCJIT::setObjectCache(ObjectCache* NewCache) { ObjCache = NewCache; } -std::unique_ptr<MemoryBuffer> MCJIT::emitObject(Module *M) { +std::unique_ptr<ObjectBufferStream> MCJIT::emitObject(Module *M) { MutexGuard locked(lock); // This must be a module which has already been added but not loaded to this @@ -140,32 +138,30 @@ std::unique_ptr<MemoryBuffer> MCJIT::emitObject(Module *M) { PM.add(new DataLayoutPass()); // The RuntimeDyld will take ownership of this shortly - SmallVector<char, 4096> ObjBufferSV; - raw_svector_ostream ObjStream(ObjBufferSV); + std::unique_ptr<ObjectBufferStream> CompiledObject(new ObjectBufferStream()); // Turn the machine code intermediate representation into bytes in memory // that may be executed. - if (TM->addPassesToEmitMC(PM, Ctx, ObjStream, !getVerifyModules())) + if (TM->addPassesToEmitMC(PM, Ctx, CompiledObject->getOStream(), + !getVerifyModules())) { report_fatal_error("Target does not support MC emission!"); + } // Initialize passes. PM.run(*M); // Flush the output buffer to get the generated code into memory - ObjStream.flush(); - - std::unique_ptr<MemoryBuffer> CompiledObjBuffer( - new ObjectMemoryBuffer(std::move(ObjBufferSV))); + CompiledObject->flush(); // 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). if (ObjCache) { // MemoryBuffer is a thin wrapper around the actual memory, so it's OK // to create a temporary object here and delete it after the call. - MemoryBufferRef MB = CompiledObjBuffer->getMemBufferRef(); + MemoryBufferRef MB = CompiledObject->getMemBuffer(); ObjCache->notifyObjectCompiled(M, MB); } - return CompiledObjBuffer; + return CompiledObject; } void MCJIT::generateCodeForModule(Module *M) { @@ -180,10 +176,14 @@ void MCJIT::generateCodeForModule(Module *M) { if (OwnedModules.hasModuleBeenLoaded(M)) return; - std::unique_ptr<MemoryBuffer> ObjectToLoad; + std::unique_ptr<ObjectBuffer> ObjectToLoad; // Try to load the pre-compiled object from cache if possible - if (ObjCache) - ObjectToLoad = ObjCache->getObject(M); + if (ObjCache) { + if (std::unique_ptr<MemoryBuffer> PreCompiledObject = + ObjCache->getObject(M)) + ObjectToLoad = + llvm::make_unique<ObjectBuffer>(std::move(PreCompiledObject)); + } // If the cache did not contain a suitable object, compile the object if (!ObjectToLoad) { @@ -193,18 +193,17 @@ void MCJIT::generateCodeForModule(Module *M) { // Load the object into the dynamic linker. // MCJIT now owns the ObjectImage pointer (via its LoadedObjects list). - ErrorOr<std::unique_ptr<object::ObjectFile>> LoadedObject = - object::ObjectFile::createObjectFile(ObjectToLoad->getMemBufferRef()); - std::unique_ptr<RuntimeDyld::LoadedObjectInfo> L = - Dyld.loadObject(*LoadedObject.get()); - - if (Dyld.hasError()) + std::unique_ptr<ObjectImage> LoadedObject = + Dyld.loadObject(std::move(ObjectToLoad)); + if (!LoadedObject) report_fatal_error(Dyld.getErrorString()); - NotifyObjectEmitted(*LoadedObject.get(), *L); + // FIXME: Make this optional, maybe even move it to a JIT event listener + LoadedObject->registerWithDebugger(); + + NotifyObjectEmitted(*LoadedObject); - Buffers.push_back(std::move(ObjectToLoad)); - LoadedObjects.push_back(std::move(*LoadedObject)); + LoadedObjects.push_back(std::move(LoadedObject)); OwnedModules.markModuleAsLoaded(M); } @@ -550,7 +549,6 @@ void MCJIT::RegisterJITEventListener(JITEventListener *L) { MutexGuard locked(lock); EventListeners.push_back(L); } - void MCJIT::UnregisterJITEventListener(JITEventListener *L) { if (!L) return; @@ -561,17 +559,14 @@ void MCJIT::UnregisterJITEventListener(JITEventListener *L) { EventListeners.pop_back(); } } - -void MCJIT::NotifyObjectEmitted(const object::ObjectFile& Obj, - const RuntimeDyld::LoadedObjectInfo &L) { +void MCJIT::NotifyObjectEmitted(const ObjectImage& Obj) { MutexGuard locked(lock); - MemMgr.notifyObjectLoaded(this, Obj); + MemMgr.notifyObjectLoaded(this, &Obj); for (unsigned I = 0, S = EventListeners.size(); I < S; ++I) { - EventListeners[I]->NotifyObjectEmitted(Obj, L); + EventListeners[I]->NotifyObjectEmitted(Obj); } } - -void MCJIT::NotifyFreeingObject(const object::ObjectFile& Obj) { +void MCJIT::NotifyFreeingObject(const ObjectImage& Obj) { MutexGuard locked(lock); for (JITEventListener *L : EventListeners) L->NotifyFreeingObject(Obj); |