diff options
author | Lang Hames <lhames@gmail.com> | 2013-12-07 04:25:19 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2013-12-07 04:25:19 +0000 |
commit | a49701db7d54967aea8a511743fedcfb9b056eea (patch) | |
tree | dab70cd2963ff5ea01065de2243e1ed0b2363c03 /lib | |
parent | d4ef813fd5efc03775fea5694b06c126e429de2d (diff) | |
download | llvm-a49701db7d54967aea8a511743fedcfb9b056eea.tar.gz llvm-a49701db7d54967aea8a511743fedcfb9b056eea.tar.bz2 llvm-a49701db7d54967aea8a511743fedcfb9b056eea.tar.xz |
Revert r196639 while I investigate a bot failure.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196641 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/ExecutionEngine/MCJIT/MCJIT.cpp | 56 | ||||
-rw-r--r-- | lib/ExecutionEngine/MCJIT/MCJIT.h | 8 | ||||
-rw-r--r-- | lib/ExecutionEngine/RuntimeDyld/ObjectImageCommon.h | 6 | ||||
-rw-r--r-- | lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp | 34 | ||||
-rw-r--r-- | lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp | 40 | ||||
-rw-r--r-- | lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h | 2 | ||||
-rw-r--r-- | lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h | 7 | ||||
-rw-r--r-- | lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp | 5 | ||||
-rw-r--r-- | lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h | 1 |
9 files changed, 10 insertions, 149 deletions
diff --git a/lib/ExecutionEngine/MCJIT/MCJIT.cpp b/lib/ExecutionEngine/MCJIT/MCJIT.cpp index 2076a94b80..8d9c33f49a 100644 --- a/lib/ExecutionEngine/MCJIT/MCJIT.cpp +++ b/lib/ExecutionEngine/MCJIT/MCJIT.cpp @@ -21,7 +21,6 @@ #include "llvm/IR/Function.h" #include "llvm/IR/Module.h" #include "llvm/MC/MCAsmInfo.h" -#include "llvm/Object/Archive.h" #include "llvm/Support/DynamicLibrary.h" #include "llvm/Support/ErrorHandling.h" #include "llvm/Support/MemoryBuffer.h" @@ -79,24 +78,15 @@ MCJIT::~MCJIT() { Modules.clear(); Dyld.deregisterEHFrames(); - LoadedObjectList::iterator it, end; - for (it = LoadedObjects.begin(), end = LoadedObjects.end(); it != end; ++it) { - ObjectImage *Obj = *it; + LoadedObjectMap::iterator it, end = LoadedObjects.end(); + for (it = LoadedObjects.begin(); it != end; ++it) { + ObjectImage *Obj = it->second; if (Obj) { NotifyFreeingObject(*Obj); delete Obj; } } LoadedObjects.clear(); - - - SmallVector<object::Archive *, 2>::iterator ArIt, ArEnd; - for (ArIt = Archives.begin(), ArEnd = Archives.end(); ArIt != ArEnd; ++ArIt) { - object::Archive *A = *ArIt; - delete A; - } - Archives.clear(); - delete TM; } @@ -112,21 +102,6 @@ bool MCJIT::removeModule(Module *M) { -void MCJIT::addObjectFile(object::ObjectFile *Obj) { - ObjectImage *LoadedObject = Dyld.loadObject(Obj); - if (!LoadedObject) - report_fatal_error(Dyld.getErrorString()); - - LoadedObjects.push_back(LoadedObject); - - NotifyObjectEmitted(*LoadedObject); -} - -void MCJIT::addArchive(object::Archive *A) { - Archives.push_back(A); -} - - void MCJIT::setObjectCache(ObjectCache* NewCache) { MutexGuard locked(lock); ObjCache = NewCache; @@ -196,9 +171,9 @@ void MCJIT::generateCodeForModule(Module *M) { } // Load the object into the dynamic linker. - // MCJIT now owns the ObjectImage pointer (via its LoadedObjects list). + // MCJIT now owns the ObjectImage pointer (via its LoadedObjects map). ObjectImage *LoadedObject = Dyld.loadObject(ObjectToLoad.take()); - LoadedObjects.push_back(LoadedObject); + LoadedObjects[M] = LoadedObject; if (!LoadedObject) report_fatal_error(Dyld.getErrorString()); @@ -296,27 +271,6 @@ uint64_t MCJIT::getSymbolAddress(const std::string &Name, if (Addr) return Addr; - SmallVector<object::Archive*, 2>::iterator I, E; - for (I = Archives.begin(), E = Archives.end(); I != E; ++I) { - object::Archive *A = *I; - // Look for our symbols in each Archive - object::Archive::child_iterator ChildIt = A->findSym(Name); - if (ChildIt != A->end_children()) { - OwningPtr<object::Binary> ChildBin; - // FIXME: Support nested archives? - if (!ChildIt->getAsBinary(ChildBin) && ChildBin->isObject()) { - object::ObjectFile *OF = reinterpret_cast<object::ObjectFile *>( - ChildBin.take()); - // This causes the object file to be loaded. - addObjectFile(OF); - // The address should be here now. - Addr = getExistingSymbolAddress(Name); - if (Addr) - return Addr; - } - } - } - // If it hasn't already been generated, see if it's in one of our modules. Module *M = findModuleForSymbol(Name, CheckFunctionsOnly); if (!M) diff --git a/lib/ExecutionEngine/MCJIT/MCJIT.h b/lib/ExecutionEngine/MCJIT/MCJIT.h index f45e869cd5..86b478bff5 100644 --- a/lib/ExecutionEngine/MCJIT/MCJIT.h +++ b/lib/ExecutionEngine/MCJIT/MCJIT.h @@ -206,10 +206,8 @@ class MCJIT : public ExecutionEngine { OwningModuleContainer OwnedModules; - SmallVector<object::Archive*, 2> Archives; - - typedef SmallVector<ObjectImage *, 2> LoadedObjectList; - LoadedObjectList LoadedObjects; + typedef DenseMap<Module *, ObjectImage *> LoadedObjectMap; + LoadedObjectMap LoadedObjects; // An optional ObjectCache to be notified of compiled objects and used to // perform lookup of pre-compiled code to avoid re-compilation. @@ -229,8 +227,6 @@ public: /// @name ExecutionEngine interface implementation /// @{ virtual void addModule(Module *M); - virtual void addObjectFile(object::ObjectFile *O); - virtual void addArchive(object::Archive *O); virtual bool removeModule(Module *M); /// FindFunctionNamed - Search all of the active modules to find the one that diff --git a/lib/ExecutionEngine/RuntimeDyld/ObjectImageCommon.h b/lib/ExecutionEngine/RuntimeDyld/ObjectImageCommon.h index 477ebccdc1..9cbde5daed 100644 --- a/lib/ExecutionEngine/RuntimeDyld/ObjectImageCommon.h +++ b/lib/ExecutionEngine/RuntimeDyld/ObjectImageCommon.h @@ -20,10 +20,6 @@ namespace llvm { -namespace object { - class ObjectFile; -} - class ObjectImageCommon : public ObjectImage { ObjectImageCommon(); // = delete ObjectImageCommon(const ObjectImageCommon &other); // = delete @@ -46,8 +42,6 @@ public: { ObjFile = object::ObjectFile::createObjectFile(Buffer->getMemBuffer()); } - ObjectImageCommon(object::ObjectFile* Input) - : ObjectImage(NULL), ObjFile(Input) {} virtual ~ObjectImageCommon() { delete ObjFile; } virtual object::symbol_iterator begin_symbols() const diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp index 800a75ef7e..161135a4f8 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp @@ -82,24 +82,12 @@ ObjectImage *RuntimeDyldImpl::createObjectImage(ObjectBuffer *InputBuffer) { return new ObjectImageCommon(InputBuffer); } -ObjectImage *RuntimeDyldImpl::createObjectImageFromFile(ObjectFile *InputObject) { - return new ObjectImageCommon(InputObject); -} - -ObjectImage *RuntimeDyldImpl::loadObject(ObjectFile *InputObject) { - return loadObject(createObjectImageFromFile(InputObject)); -} - ObjectImage *RuntimeDyldImpl::loadObject(ObjectBuffer *InputBuffer) { - return loadObject(createObjectImage(InputBuffer)); -} - -ObjectImage *RuntimeDyldImpl::loadObject(ObjectImage *InputObject) { MutexGuard locked(lock); - OwningPtr<ObjectImage> obj(InputObject); + OwningPtr<ObjectImage> obj(createObjectImage(InputBuffer)); if (!obj) - return NULL; + report_fatal_error("Unable to create object image from memory buffer!"); // Save information about our target Arch = (Triple::ArchType)obj->getArch(); @@ -151,7 +139,7 @@ ObjectImage *RuntimeDyldImpl::loadObject(ObjectImage *InputObject) { if (si == obj->end_sections()) continue; Check(si->getContents(SectionData)); Check(si->isText(IsCode)); - const uint8_t* SymPtr = (const uint8_t*)InputObject->getData().data() + + const uint8_t* SymPtr = (const uint8_t*)InputBuffer->getBufferStart() + (uintptr_t)FileOffset; uintptr_t SectOffset = (uintptr_t)(SymPtr - (const uint8_t*)SectionData.begin()); @@ -575,22 +563,6 @@ RuntimeDyld::~RuntimeDyld() { delete Dyld; } -ObjectImage *RuntimeDyld::loadObject(ObjectFile *InputObject) { - if (!Dyld) { - if (InputObject->isELF()) - Dyld = new RuntimeDyldELF(MM); - else if (InputObject->isMachO()) - Dyld = new RuntimeDyldMachO(MM); - else - report_fatal_error("Incompatible object format!"); - } else { - if (!Dyld->isCompatibleFile(InputObject)) - report_fatal_error("Incompatible object format!"); - } - - return Dyld->loadObject(InputObject); -} - ObjectImage *RuntimeDyld::loadObject(ObjectBuffer *InputBuffer) { if (!Dyld) { sys::fs::file_magic Type = diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp index 68e86d86b6..f2c69fc99c 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.cpp @@ -25,8 +25,6 @@ #include "llvm/Object/ELFObjectFile.h" #include "llvm/Object/ObjectFile.h" #include "llvm/Support/ELF.h" -#include "llvm/Support/MemoryBuffer.h" - using namespace llvm; using namespace llvm::object; @@ -180,39 +178,6 @@ void RuntimeDyldELF::deregisterEHFrames() { RegisteredEHFrameSections.clear(); } -ObjectImage *RuntimeDyldELF::createObjectImageFromFile(object::ObjectFile *ObjFile) { - if (!ObjFile) - return NULL; - - error_code ec; - MemoryBuffer* Buffer = MemoryBuffer::getMemBuffer(ObjFile->getData(), - "", - false); - - if (ObjFile->getBytesInAddress() == 4 && ObjFile->isLittleEndian()) { - DyldELFObject<ELFType<support::little, 4, false> > *Obj = - new DyldELFObject<ELFType<support::little, 4, false> >(Buffer, ec); - return new ELFObjectImage<ELFType<support::little, 4, false> >(NULL, Obj); - } - else if (ObjFile->getBytesInAddress() == 4 && !ObjFile->isLittleEndian()) { - DyldELFObject<ELFType<support::big, 4, false> > *Obj = - new DyldELFObject<ELFType<support::big, 4, false> >(Buffer, ec); - return new ELFObjectImage<ELFType<support::big, 4, false> >(NULL, Obj); - } - else if (ObjFile->getBytesInAddress() == 8 && !ObjFile->isLittleEndian()) { - DyldELFObject<ELFType<support::big, 8, true> > *Obj = - new DyldELFObject<ELFType<support::big, 8, true> >(Buffer, ec); - return new ELFObjectImage<ELFType<support::big, 8, true> >(NULL, Obj); - } - else if (ObjFile->getBytesInAddress() == 8 && ObjFile->isLittleEndian()) { - DyldELFObject<ELFType<support::little, 8, true> > *Obj = - new DyldELFObject<ELFType<support::little, 8, true> >(Buffer, ec); - return new ELFObjectImage<ELFType<support::little, 8, true> >(NULL, Obj); - } - else - llvm_unreachable("Unexpected ELF format"); -} - ObjectImage *RuntimeDyldELF::createObjectImage(ObjectBuffer *Buffer) { if (Buffer->getBufferSize() < ELF::EI_NIDENT) llvm_unreachable("Unexpected ELF object size"); @@ -1438,9 +1403,4 @@ bool RuntimeDyldELF::isCompatibleFormat(const ObjectBuffer *Buffer) const { return false; return (memcmp(Buffer->getBufferStart(), ELF::ElfMagic, strlen(ELF::ElfMagic))) == 0; } - -bool RuntimeDyldELF::isCompatibleFile(const object::ObjectFile *Obj) const { - return Obj->isELF(); -} - } // namespace llvm diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h index 181964faa9..3adf82706a 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h @@ -140,9 +140,7 @@ public: const SymbolTableMap &Symbols, StubMap &Stubs); virtual bool isCompatibleFormat(const ObjectBuffer *Buffer) const; - virtual bool isCompatibleFile(const object::ObjectFile *Buffer) const; virtual ObjectImage *createObjectImage(ObjectBuffer *InputBuffer); - virtual ObjectImage *createObjectImageFromFile(object::ObjectFile *Obj); virtual void registerEHFrames(); virtual void deregisterEHFrames(); virtual void finalizeLoad(ObjSectionToIDMap &SectionMap); diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h index 183cf6cf36..3014b30773 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h @@ -311,18 +311,12 @@ protected: virtual void updateGOTEntries(StringRef Name, uint64_t Addr) {} virtual ObjectImage *createObjectImage(ObjectBuffer *InputBuffer); - virtual ObjectImage *createObjectImageFromFile(object::ObjectFile *InputObject); - - // This is the implementation for the two public overloads - ObjectImage *loadObject(ObjectImage *InputObject); - public: RuntimeDyldImpl(RTDyldMemoryManager *mm) : MemMgr(mm), HasError(false) {} virtual ~RuntimeDyldImpl(); ObjectImage *loadObject(ObjectBuffer *InputBuffer); - ObjectImage *loadObject(object::ObjectFile *InputObject); void *getSymbolAddress(StringRef Name) { // FIXME: Just look up as a function for now. Overly simple of course. @@ -360,7 +354,6 @@ public: StringRef getErrorString() { return ErrorStr; } virtual bool isCompatibleFormat(const ObjectBuffer *Buffer) const = 0; - virtual bool isCompatibleFile(const ObjectFile *Obj) const = 0; virtual void registerEHFrames(); diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp index 780908b11c..5b92867b47 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.cpp @@ -455,9 +455,4 @@ bool RuntimeDyldMachO::isCompatibleFormat( return false; } -bool RuntimeDyldMachO::isCompatibleFile( - const object::ObjectFile *Obj) const { - return Obj->isMachO(); -} - } // end namespace llvm diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h index 0f1c0cb37b..bbf6aa9f65 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h @@ -94,7 +94,6 @@ public: const SymbolTableMap &Symbols, StubMap &Stubs); virtual bool isCompatibleFormat(const ObjectBuffer *Buffer) const; - virtual bool isCompatibleFile(const object::ObjectFile *Obj) const; virtual void registerEHFrames(); virtual void finalizeLoad(ObjSectionToIDMap &SectionMap); }; |