Skip to content
This repository was archived by the owner on Feb 5, 2019. It is now read-only.

Commit f089b84

Browse files
committed
Make createObjectImage and createObjectImageFromFile static methods on the
relevant subclasses of RuntimeDyldImpl. This allows construction of RuntimeDyldImpl instances to be deferred until after the target architecture is known. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@203352 91177308-0d34-0410-b5e6-96231b3b80d8
1 parent f911d52 commit f089b84

File tree

4 files changed

+70
-74
lines changed

4 files changed

+70
-74
lines changed

lib/ExecutionEngine/RuntimeDyld/RuntimeDyld.cpp

Lines changed: 56 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -75,25 +75,7 @@ void RuntimeDyldImpl::mapSectionAddress(const void *LocalAddress,
7575
llvm_unreachable("Attempting to remap address of unknown section!");
7676
}
7777

78-
// Subclasses can implement this method to create specialized image instances.
79-
// The caller owns the pointer that is returned.
80-
ObjectImage *RuntimeDyldImpl::createObjectImage(ObjectBuffer *InputBuffer) {
81-
return new ObjectImageCommon(InputBuffer);
82-
}
83-
84-
ObjectImage *RuntimeDyldImpl::createObjectImageFromFile(ObjectFile *InputObject) {
85-
return new ObjectImageCommon(InputObject);
86-
}
87-
88-
ObjectImage *RuntimeDyldImpl::loadObject(ObjectFile *InputObject) {
89-
return loadObject(createObjectImageFromFile(InputObject));
90-
}
91-
92-
ObjectImage *RuntimeDyldImpl::loadObject(ObjectBuffer *InputBuffer) {
93-
return loadObject(createObjectImage(InputBuffer));
94-
}
95-
96-
ObjectImage *RuntimeDyldImpl::loadObject(ObjectImage *InputObject) {
78+
ObjectImage* RuntimeDyldImpl::loadObject(ObjectImage *InputObject) {
9779
MutexGuard locked(lock);
9880

9981
std::unique_ptr<ObjectImage> Obj(InputObject);
@@ -155,7 +137,7 @@ ObjectImage *RuntimeDyldImpl::loadObject(ObjectImage *InputObject) {
155137
if (SI == Obj->end_sections()) continue;
156138
Check(SI->getContents(SectionData));
157139
Check(SI->isText(IsCode));
158-
const uint8_t* SymPtr = (const uint8_t*)InputObject->getData().data() +
140+
const uint8_t* SymPtr = (const uint8_t*)Obj->getData().data() +
159141
(uintptr_t)FileOffset;
160142
uintptr_t SectOffset = (uintptr_t)(SymPtr -
161143
(const uint8_t*)SectionData.begin());
@@ -693,60 +675,70 @@ RuntimeDyld::~RuntimeDyld() {
693675
}
694676

695677
ObjectImage *RuntimeDyld::loadObject(ObjectFile *InputObject) {
696-
if (!Dyld) {
697-
if (InputObject->isELF())
678+
std::unique_ptr<ObjectImage> InputImage;
679+
680+
if (InputObject->isELF()) {
681+
InputImage.reset(RuntimeDyldELF::createObjectImageFromFile(InputObject));
682+
if (!Dyld)
698683
Dyld = new RuntimeDyldELF(MM);
699-
else if (InputObject->isMachO())
684+
} else if (InputObject->isMachO()) {
685+
InputImage.reset(RuntimeDyldMachO::createObjectImageFromFile(InputObject));
686+
if (!Dyld)
700687
Dyld = new RuntimeDyldMachO(MM);
701-
else
702-
report_fatal_error("Incompatible object format!");
703-
} else {
704-
if (!Dyld->isCompatibleFile(InputObject))
705-
report_fatal_error("Incompatible object format!");
706-
}
688+
} else
689+
report_fatal_error("Incompatible object format!");
690+
691+
if (!Dyld->isCompatibleFile(InputObject))
692+
report_fatal_error("Incompatible object format!");
707693

708-
return Dyld->loadObject(InputObject);
694+
Dyld->loadObject(InputImage.get());
695+
return InputImage.release();
709696
}
710697

711698
ObjectImage *RuntimeDyld::loadObject(ObjectBuffer *InputBuffer) {
712-
if (!Dyld) {
713-
sys::fs::file_magic Type =
714-
sys::fs::identify_magic(InputBuffer->getBuffer());
715-
switch (Type) {
716-
case sys::fs::file_magic::elf_relocatable:
717-
case sys::fs::file_magic::elf_executable:
718-
case sys::fs::file_magic::elf_shared_object:
719-
case sys::fs::file_magic::elf_core:
699+
std::unique_ptr<ObjectImage> InputImage;
700+
sys::fs::file_magic Type =
701+
sys::fs::identify_magic(InputBuffer->getBuffer());
702+
703+
switch (Type) {
704+
case sys::fs::file_magic::elf_relocatable:
705+
case sys::fs::file_magic::elf_executable:
706+
case sys::fs::file_magic::elf_shared_object:
707+
case sys::fs::file_magic::elf_core:
708+
InputImage.reset(RuntimeDyldELF::createObjectImage(InputBuffer));
709+
if (!Dyld)
720710
Dyld = new RuntimeDyldELF(MM);
721-
break;
722-
case sys::fs::file_magic::macho_object:
723-
case sys::fs::file_magic::macho_executable:
724-
case sys::fs::file_magic::macho_fixed_virtual_memory_shared_lib:
725-
case sys::fs::file_magic::macho_core:
726-
case sys::fs::file_magic::macho_preload_executable:
727-
case sys::fs::file_magic::macho_dynamically_linked_shared_lib:
728-
case sys::fs::file_magic::macho_dynamic_linker:
729-
case sys::fs::file_magic::macho_bundle:
730-
case sys::fs::file_magic::macho_dynamically_linked_shared_lib_stub:
731-
case sys::fs::file_magic::macho_dsym_companion:
711+
break;
712+
case sys::fs::file_magic::macho_object:
713+
case sys::fs::file_magic::macho_executable:
714+
case sys::fs::file_magic::macho_fixed_virtual_memory_shared_lib:
715+
case sys::fs::file_magic::macho_core:
716+
case sys::fs::file_magic::macho_preload_executable:
717+
case sys::fs::file_magic::macho_dynamically_linked_shared_lib:
718+
case sys::fs::file_magic::macho_dynamic_linker:
719+
case sys::fs::file_magic::macho_bundle:
720+
case sys::fs::file_magic::macho_dynamically_linked_shared_lib_stub:
721+
case sys::fs::file_magic::macho_dsym_companion:
722+
InputImage.reset(RuntimeDyldMachO::createObjectImage(InputBuffer));
723+
if (!Dyld)
732724
Dyld = new RuntimeDyldMachO(MM);
733-
break;
734-
case sys::fs::file_magic::unknown:
735-
case sys::fs::file_magic::bitcode:
736-
case sys::fs::file_magic::archive:
737-
case sys::fs::file_magic::coff_object:
738-
case sys::fs::file_magic::coff_import_library:
739-
case sys::fs::file_magic::pecoff_executable:
740-
case sys::fs::file_magic::macho_universal_binary:
741-
case sys::fs::file_magic::windows_resource:
742-
report_fatal_error("Incompatible object format!");
743-
}
744-
} else {
745-
if (!Dyld->isCompatibleFormat(InputBuffer))
746-
report_fatal_error("Incompatible object format!");
725+
break;
726+
case sys::fs::file_magic::unknown:
727+
case sys::fs::file_magic::bitcode:
728+
case sys::fs::file_magic::archive:
729+
case sys::fs::file_magic::coff_object:
730+
case sys::fs::file_magic::coff_import_library:
731+
case sys::fs::file_magic::pecoff_executable:
732+
case sys::fs::file_magic::macho_universal_binary:
733+
case sys::fs::file_magic::windows_resource:
734+
report_fatal_error("Incompatible object format!");
747735
}
748736

749-
return Dyld->loadObject(InputBuffer);
737+
if (!Dyld->isCompatibleFormat(InputBuffer))
738+
report_fatal_error("Incompatible object format!");
739+
740+
Dyld->loadObject(InputImage.get());
741+
return InputImage.release();
750742
}
751743

752744
void *RuntimeDyld::getSymbolAddress(StringRef Name) {

lib/ExecutionEngine/RuntimeDyld/RuntimeDyldELF.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,12 +139,13 @@ class RuntimeDyldELF : public RuntimeDyldImpl {
139139
StubMap &Stubs) override;
140140
bool isCompatibleFormat(const ObjectBuffer *Buffer) const override;
141141
bool isCompatibleFile(const object::ObjectFile *Buffer) const override;
142-
ObjectImage *createObjectImage(ObjectBuffer *InputBuffer) override;
143-
ObjectImage *createObjectImageFromFile(object::ObjectFile *Obj) override;
144142
void registerEHFrames() override;
145143
void deregisterEHFrames() override;
146144
void finalizeLoad(ObjSectionToIDMap &SectionMap) override;
147145
virtual ~RuntimeDyldELF();
146+
147+
static ObjectImage *createObjectImage(ObjectBuffer *InputBuffer);
148+
static ObjectImage *createObjectImageFromFile(object::ObjectFile *Obj);
148149
};
149150

150151
} // end namespace llvm

lib/ExecutionEngine/RuntimeDyld/RuntimeDyldImpl.h

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -310,9 +310,6 @@ class RuntimeDyldImpl {
310310
// The base class does nothing. ELF overrides this.
311311
virtual void updateGOTEntries(StringRef Name, uint64_t Addr) {}
312312

313-
virtual ObjectImage *createObjectImage(ObjectBuffer *InputBuffer);
314-
virtual ObjectImage *createObjectImageFromFile(object::ObjectFile *InputObject);
315-
316313
// \brief Compute an upper bound of the memory that is required to load all sections
317314
void computeTotalAllocSize(ObjectImage &Obj,
318315
uint64_t& CodeSize,
@@ -322,16 +319,12 @@ class RuntimeDyldImpl {
322319
// \brief Compute the stub buffer size required for a section
323320
unsigned computeSectionStubBufSize(ObjectImage &Obj, const SectionRef &Section);
324321

325-
// This is the implementation for the two public overloads
326-
ObjectImage *loadObject(ObjectImage *InputObject);
327-
328322
public:
329323
RuntimeDyldImpl(RTDyldMemoryManager *mm) : MemMgr(mm), HasError(false) {}
330324

331325
virtual ~RuntimeDyldImpl();
332326

333-
ObjectImage *loadObject(ObjectBuffer *InputBuffer);
334-
ObjectImage *loadObject(object::ObjectFile *InputObject);
327+
ObjectImage* loadObject(ObjectImage* InputObject);
335328

336329
void *getSymbolAddress(StringRef Name) {
337330
// FIXME: Just look up as a function for now. Overly simple of course.

lib/ExecutionEngine/RuntimeDyld/RuntimeDyldMachO.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
#ifndef LLVM_RUNTIME_DYLD_MACHO_H
1515
#define LLVM_RUNTIME_DYLD_MACHO_H
1616

17+
#include "ObjectImageCommon.h"
1718
#include "RuntimeDyldImpl.h"
1819
#include "llvm/ADT/IndexedMap.h"
1920
#include "llvm/Object/MachO.h"
@@ -95,6 +96,15 @@ class RuntimeDyldMachO : public RuntimeDyldImpl {
9596
bool isCompatibleFile(const object::ObjectFile *Obj) const override;
9697
void registerEHFrames() override;
9798
void finalizeLoad(ObjSectionToIDMap &SectionMap) override;
99+
100+
101+
static ObjectImage *createObjectImage(ObjectBuffer *InputBuffer) {
102+
return new ObjectImageCommon(InputBuffer);
103+
}
104+
105+
static ObjectImage *createObjectImageFromFile(object::ObjectFile *InputObject) {
106+
return new ObjectImageCommon(InputObject);
107+
}
98108
};
99109

100110
} // end namespace llvm

0 commit comments

Comments
 (0)