-bool RuntimeDyld::loadObject(MemoryBuffer *InputBuffer) {
- if (!Dyld) {
- sys::LLVMFileType type = sys::IdentifyFileType(
- InputBuffer->getBufferStart(),
- static_cast<unsigned>(InputBuffer->getBufferSize()));
- switch (type) {
- case sys::ELF_Relocatable_FileType:
- case sys::ELF_Executable_FileType:
- case sys::ELF_SharedObject_FileType:
- case sys::ELF_Core_FileType:
- Dyld = new RuntimeDyldELF(MM);
- break;
- case sys::Mach_O_Object_FileType:
- case sys::Mach_O_Executable_FileType:
- case sys::Mach_O_FixedVirtualMemorySharedLib_FileType:
- case sys::Mach_O_Core_FileType:
- case sys::Mach_O_PreloadExecutable_FileType:
- case sys::Mach_O_DynamicallyLinkedSharedLib_FileType:
- case sys::Mach_O_DynamicLinker_FileType:
- case sys::Mach_O_Bundle_FileType:
- case sys::Mach_O_DynamicallyLinkedSharedLibStub_FileType:
- case sys::Mach_O_DSYMCompanion_FileType:
- Dyld = new RuntimeDyldMachO(MM);
- break;
- case sys::Unknown_FileType:
- case sys::Bitcode_FileType:
- case sys::Archive_FileType:
- case sys::COFF_FileType:
- report_fatal_error("Incompatible object format!");
- }
- } else {
- if (!Dyld->isCompatibleFormat(InputBuffer))
- report_fatal_error("Incompatible object format!");
+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 = 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!");