-ObjectImage *RuntimeDyld::loadObject(ObjectFile *InputObject) {
- std::unique_ptr<ObjectImage> InputImage;
-
- if (InputObject->isELF()) {
- InputImage.reset(RuntimeDyldELF::createObjectImageFromFile(InputObject));
- if (!Dyld)
- Dyld = createRuntimeDyldELF(MM, ProcessAllSections).release();
- } else if (InputObject->isMachO()) {
- InputImage.reset(RuntimeDyldMachO::createObjectImageFromFile(InputObject));
- if (!Dyld)
- Dyld = createRuntimeDyldMachO(MM, ProcessAllSections).release();
- } else
- report_fatal_error("Incompatible object format!");
-
- if (!Dyld->isCompatibleFile(InputObject))
- report_fatal_error("Incompatible object format!");
-
- Dyld->loadObject(InputImage.get());
- return InputImage.release();
-}
-
-ObjectImage *RuntimeDyld::loadObject(ObjectBuffer *InputBuffer) {
- std::unique_ptr<ObjectImage> InputImage;
- sys::fs::file_magic Type = sys::fs::identify_magic(InputBuffer->getBuffer());
-
- switch (Type) {
- case sys::fs::file_magic::elf_relocatable:
- case sys::fs::file_magic::elf_executable:
- case sys::fs::file_magic::elf_shared_object:
- case sys::fs::file_magic::elf_core:
- InputImage.reset(RuntimeDyldELF::createObjectImage(InputBuffer));
- if (!Dyld)
- Dyld = createRuntimeDyldELF(MM, ProcessAllSections).release();
- break;
- case sys::fs::file_magic::macho_object:
- case sys::fs::file_magic::macho_executable:
- case sys::fs::file_magic::macho_fixed_virtual_memory_shared_lib:
- case sys::fs::file_magic::macho_core:
- case sys::fs::file_magic::macho_preload_executable:
- case sys::fs::file_magic::macho_dynamically_linked_shared_lib:
- case sys::fs::file_magic::macho_dynamic_linker:
- case sys::fs::file_magic::macho_bundle:
- case sys::fs::file_magic::macho_dynamically_linked_shared_lib_stub:
- case sys::fs::file_magic::macho_dsym_companion:
- InputImage.reset(RuntimeDyldMachO::createObjectImage(InputBuffer));
- if (!Dyld)
- Dyld = createRuntimeDyldMachO(MM, ProcessAllSections).release();
- break;
- case sys::fs::file_magic::unknown:
- case sys::fs::file_magic::bitcode:
- case sys::fs::file_magic::archive:
- case sys::fs::file_magic::coff_object:
- case sys::fs::file_magic::coff_import_library:
- case sys::fs::file_magic::pecoff_executable:
- case sys::fs::file_magic::macho_universal_binary:
- case sys::fs::file_magic::windows_resource:
- report_fatal_error("Incompatible object format!");
+std::unique_ptr<RuntimeDyld::LoadedObjectInfo>
+RuntimeDyld::loadObject(const ObjectFile &Obj) {
+ if (!Dyld) {
+ if (Obj.isELF())
+ Dyld = createRuntimeDyldELF(MemMgr, Resolver, ProcessAllSections, Checker);
+ else if (Obj.isMachO())
+ Dyld = createRuntimeDyldMachO(
+ static_cast<Triple::ArchType>(Obj.getArch()), MemMgr, Resolver,
+ ProcessAllSections, Checker);
+ else if (Obj.isCOFF())
+ Dyld = createRuntimeDyldCOFF(
+ static_cast<Triple::ArchType>(Obj.getArch()), MemMgr, Resolver,
+ ProcessAllSections, Checker);
+ else
+ report_fatal_error("Incompatible object format!");