Give ExecutionEngine of top level buffers.

Long term the idea if for the engine to not own the buffers, but for now
this is consistent with the rest of the API.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216484 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Rafael Espindola
2014-08-26 21:04:04 +00:00
parent 3c92309f0d
commit af07403c3e
5 changed files with 14 additions and 6 deletions

View File

@ -189,6 +189,7 @@ public:
/// ///
/// MCJIT will take ownership of the ObjectFile. /// MCJIT will take ownership of the ObjectFile.
virtual void addObjectFile(std::unique_ptr<object::ObjectFile> O); virtual void addObjectFile(std::unique_ptr<object::ObjectFile> O);
virtual void addObjectFile(object::OwningBinary<object::ObjectFile> O);
/// addArchive - Add an Archive to the execution engine. /// addArchive - Add an Archive to the execution engine.
/// ///

View File

@ -124,6 +124,11 @@ void ExecutionEngine::addObjectFile(std::unique_ptr<object::ObjectFile> O) {
llvm_unreachable("ExecutionEngine subclass doesn't implement addObjectFile."); llvm_unreachable("ExecutionEngine subclass doesn't implement addObjectFile.");
} }
void
ExecutionEngine::addObjectFile(object::OwningBinary<object::ObjectFile> O) {
llvm_unreachable("ExecutionEngine subclass doesn't implement addObjectFile.");
}
void ExecutionEngine::addArchive(object::OwningBinary<object::Archive> A) { void ExecutionEngine::addArchive(object::OwningBinary<object::Archive> A) {
llvm_unreachable("ExecutionEngine subclass doesn't implement addArchive."); llvm_unreachable("ExecutionEngine subclass doesn't implement addArchive.");
} }

View File

@ -107,8 +107,6 @@ bool MCJIT::removeModule(Module *M) {
return OwnedModules.removeModule(M); return OwnedModules.removeModule(M);
} }
void MCJIT::addObjectFile(std::unique_ptr<object::ObjectFile> Obj) { void MCJIT::addObjectFile(std::unique_ptr<object::ObjectFile> Obj) {
ObjectImage *LoadedObject = Dyld.loadObject(std::move(Obj)); ObjectImage *LoadedObject = Dyld.loadObject(std::move(Obj));
if (!LoadedObject || Dyld.hasError()) if (!LoadedObject || Dyld.hasError())
@ -119,11 +117,15 @@ void MCJIT::addObjectFile(std::unique_ptr<object::ObjectFile> Obj) {
NotifyObjectEmitted(*LoadedObject); NotifyObjectEmitted(*LoadedObject);
} }
void MCJIT::addObjectFile(object::OwningBinary<object::ObjectFile> Obj) {
addObjectFile(std::move(Obj.getBinary()));
Buffers.push_back(std::move(Obj.getBuffer()));
}
void MCJIT::addArchive(object::OwningBinary<object::Archive> A) { void MCJIT::addArchive(object::OwningBinary<object::Archive> A) {
Archives.push_back(std::move(A)); Archives.push_back(std::move(A));
} }
void MCJIT::setObjectCache(ObjectCache* NewCache) { void MCJIT::setObjectCache(ObjectCache* NewCache) {
MutexGuard locked(lock); MutexGuard locked(lock);
ObjCache = NewCache; ObjCache = NewCache;

View File

@ -217,6 +217,7 @@ class MCJIT : public ExecutionEngine {
OwningModuleContainer OwnedModules; OwningModuleContainer OwnedModules;
SmallVector<object::OwningBinary<object::Archive>, 2> Archives; SmallVector<object::OwningBinary<object::Archive>, 2> Archives;
SmallVector<std::unique_ptr<MemoryBuffer>, 2> Buffers;
typedef SmallVector<ObjectImage *, 2> LoadedObjectList; typedef SmallVector<ObjectImage *, 2> LoadedObjectList;
LoadedObjectList LoadedObjects; LoadedObjectList LoadedObjects;
@ -240,6 +241,7 @@ public:
/// @{ /// @{
void addModule(std::unique_ptr<Module> M) override; void addModule(std::unique_ptr<Module> M) override;
void addObjectFile(std::unique_ptr<object::ObjectFile> O) override; void addObjectFile(std::unique_ptr<object::ObjectFile> O) override;
void addObjectFile(object::OwningBinary<object::ObjectFile> O) override;
void addArchive(object::OwningBinary<object::Archive> O) override; void addArchive(object::OwningBinary<object::Archive> O) override;
bool removeModule(Module *M) override; bool removeModule(Module *M) override;

View File

@ -529,7 +529,6 @@ int main(int argc, char **argv, char * const *envp) {
EE->addModule(std::move(XMod)); EE->addModule(std::move(XMod));
} }
std::vector<std::unique_ptr<MemoryBuffer>> Buffers;
for (unsigned i = 0, e = ExtraObjects.size(); i != e; ++i) { for (unsigned i = 0, e = ExtraObjects.size(); i != e; ++i) {
ErrorOr<object::OwningBinary<object::ObjectFile>> Obj = ErrorOr<object::OwningBinary<object::ObjectFile>> Obj =
object::ObjectFile::createObjectFile(ExtraObjects[i]); object::ObjectFile::createObjectFile(ExtraObjects[i]);
@ -538,8 +537,7 @@ int main(int argc, char **argv, char * const *envp) {
return 1; return 1;
} }
object::OwningBinary<object::ObjectFile> &O = Obj.get(); object::OwningBinary<object::ObjectFile> &O = Obj.get();
EE->addObjectFile(std::move(O.getBinary())); EE->addObjectFile(std::move(O));
Buffers.push_back(std::move(O.getBuffer()));
} }
for (unsigned i = 0, e = ExtraArchives.size(); i != e; ++i) { for (unsigned i = 0, e = ExtraArchives.size(); i != e; ++i) {