diff options
author | Lang Hames <lhames@gmail.com> | 2014-03-20 21:06:46 +0000 |
---|---|---|
committer | Lang Hames <lhames@gmail.com> | 2014-03-20 21:06:46 +0000 |
commit | 20425d92dfb39377e6b8eb111971d5ac3042421a (patch) | |
tree | 108613187a8bd7d182f7d7499f011d8288e4e1c1 /lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp | |
parent | ee3242ed0b25f1b2d53d47eabe727035f387123a (diff) | |
download | llvm-20425d92dfb39377e6b8eb111971d5ac3042421a.tar.gz llvm-20425d92dfb39377e6b8eb111971d5ac3042421a.tar.bz2 llvm-20425d92dfb39377e6b8eb111971d5ac3042421a.tar.xz |
Add an option to MCJIT to have it forward all sections to the
RTDyldMemoryManager, regardless of whether it thinks they're "required for
execution".
Currently, RuntimeDyld only passes sections that are "required for execution"
to the RTDyldMemoryManager, and takes "required for execution" to mean exactly
"contains symbols or relocations". There are two problems with this:
(1) It can drop sections with anonymous data that is referenced by code.
(2) It leaves the JIT client no way to inspect interesting sections that aren't
actually required to run the program (e.g dwarf sections).
A test case is still in the works.
Future work: We may want to replace this with a generic section filtering
mechanism, but that will require more consideration. For now, this flag at least
allows clients to volunteer to do the filtering themselves.
Fixes <rdar://problem/15177691>.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@204398 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp')
-rw-r--r-- | lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp | 46 |
1 files changed, 30 insertions, 16 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: |