diff options
Diffstat (limited to 'lib/ExecutionEngine/RuntimeDyld')
-rw-r--r-- | lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp | 46 | ||||
-rw-r--r-- | lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h | 11 |
2 files changed, 40 insertions, 17 deletions
diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp index 5d6a2c0f12..310b206a06 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp @@ -161,25 +161,22 @@ ObjectImage* RuntimeDyldImpl::loadObject(ObjectImage *InputObject) { DEBUG(dbgs() << "Parse relocations:\n"); for (section_iterator SI = Obj->begin_sections(), SE = Obj->end_sections(); SI != SE; ++SI) { - bool IsFirstRelocation = true; unsigned SectionID = 0; StubMap Stubs; section_iterator RelocatedSection = SI->getRelocatedSection(); - for (const RelocationRef &Reloc : SI->relocations()) { - // If it's the first relocation in this section, find its SectionID - if (IsFirstRelocation) { - bool IsCode = false; - Check(RelocatedSection->isText(IsCode)); - SectionID = - findOrEmitSection(*Obj, *RelocatedSection, IsCode, LocalSections); - DEBUG(dbgs() << "\tSectionID: " << SectionID << "\n"); - IsFirstRelocation = false; - } + if ((SI->relocation_begin() != SI->relocation_end()) || + ProcessAllSections) { + bool IsCode = false; + Check(RelocatedSection->isText(IsCode)); + SectionID = + findOrEmitSection(*Obj, *RelocatedSection, IsCode, LocalSections); + DEBUG(dbgs() << "\tSectionID: " << SectionID << "\n"); + } + for (const RelocationRef &Reloc : SI->relocations()) processRelocationRef(SectionID, Reloc, *Obj, LocalSections, LocalSymbols, Stubs); - } } // Give the subclasses a chance to tie-up any loose ends. @@ -665,23 +662,40 @@ RuntimeDyld::RuntimeDyld(RTDyldMemoryManager *mm) { // permissions are applied. Dyld = 0; MM = mm; + ProcessAllSections = false; } RuntimeDyld::~RuntimeDyld() { delete Dyld; } +static std::unique_ptr<RuntimeDyldELF> createRuntimeDyldELF( + RTDyldMemoryManager *MM, + bool ProcessAllSections) { + std::unique_ptr<RuntimeDyldELF> Dyld(new RuntimeDyldELF(MM)); + Dyld->setProcessAllSections(ProcessAllSections); + return Dyld; +} + +static std::unique_ptr<RuntimeDyldMachO> createRuntimeDyldMachO( + RTDyldMemoryManager *MM, + bool ProcessAllSections) { + std::unique_ptr<RuntimeDyldMachO> Dyld(new RuntimeDyldMachO(MM)); + Dyld->setProcessAllSections(ProcessAllSections); + return Dyld; +} + ObjectImage *RuntimeDyld::loadObject(ObjectFile *InputObject) { std::unique_ptr<ObjectImage> InputImage; if (InputObject->isELF()) { InputImage.reset(RuntimeDyldELF::createObjectImageFromFile(InputObject)); if (!Dyld) - Dyld = new RuntimeDyldELF(MM); + Dyld = createRuntimeDyldELF(MM, ProcessAllSections).release(); } else if (InputObject->isMachO()) { InputImage.reset(RuntimeDyldMachO::createObjectImageFromFile(InputObject)); if (!Dyld) - Dyld = new RuntimeDyldMachO(MM); + Dyld = createRuntimeDyldMachO(MM, ProcessAllSections).release(); } else report_fatal_error("Incompatible object format!"); @@ -704,7 +718,7 @@ ObjectImage *RuntimeDyld::loadObject(ObjectBuffer *InputBuffer) { case sys::fs::file_magic::elf_core: InputImage.reset(RuntimeDyldELF::createObjectImage(InputBuffer)); if (!Dyld) - Dyld = new RuntimeDyldELF(MM); + Dyld = createRuntimeDyldELF(MM, ProcessAllSections).release(); break; case sys::fs::file_magic::macho_object: case sys::fs::file_magic::macho_executable: @@ -718,7 +732,7 @@ ObjectImage *RuntimeDyld::loadObject(ObjectBuffer *InputBuffer) { case sys::fs::file_magic::macho_dsym_companion: InputImage.reset(RuntimeDyldMachO::createObjectImage(InputBuffer)); if (!Dyld) - Dyld = new RuntimeDyldMachO(MM); + Dyld = createRuntimeDyldMachO(MM, ProcessAllSections).release(); break; case sys::fs::file_magic::unknown: case sys::fs::file_magic::bitcode: diff --git a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h index 8fd55920f2..0b7de17a6e 100644 --- a/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h +++ b/lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h @@ -187,6 +187,10 @@ protected: Triple::ArchType Arch; bool IsTargetLittleEndian; + // True if all sections should be passed to the memory manager, false if only + // sections containing relocations should be. Defaults to 'false'. + bool ProcessAllSections; + // This mutex prevents simultaneously loading objects from two different // threads. This keeps us from having to protect individual data structures // and guarantees that section allocation requests to the memory manager @@ -320,10 +324,15 @@ protected: unsigned computeSectionStubBufSize(ObjectImage &Obj, const SectionRef &Section); public: - RuntimeDyldImpl(RTDyldMemoryManager *mm) : MemMgr(mm), HasError(false) {} + RuntimeDyldImpl(RTDyldMemoryManager *mm) + : MemMgr(mm), ProcessAllSections(false), HasError(false) {} virtual ~RuntimeDyldImpl(); + void setProcessAllSections(bool ProcessAllSections) { + this->ProcessAllSections = ProcessAllSections; + } + ObjectImage* loadObject(ObjectImage* InputObject); void *getSymbolAddress(StringRef Name) { |