@@ -75,25 +75,7 @@ void RuntimeDyldImpl::mapSectionAddress(const void *LocalAddress,
75
75
llvm_unreachable (" Attempting to remap address of unknown section!" );
76
76
}
77
77
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) {
97
79
MutexGuard locked (lock);
98
80
99
81
std::unique_ptr<ObjectImage> Obj (InputObject);
@@ -155,7 +137,7 @@ ObjectImage *RuntimeDyldImpl::loadObject(ObjectImage *InputObject) {
155
137
if (SI == Obj->end_sections ()) continue ;
156
138
Check (SI->getContents (SectionData));
157
139
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 () +
159
141
(uintptr_t )FileOffset;
160
142
uintptr_t SectOffset = (uintptr_t )(SymPtr -
161
143
(const uint8_t *)SectionData.begin ());
@@ -693,60 +675,70 @@ RuntimeDyld::~RuntimeDyld() {
693
675
}
694
676
695
677
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)
698
683
Dyld = new RuntimeDyldELF (MM);
699
- else if (InputObject->isMachO ())
684
+ } else if (InputObject->isMachO ()) {
685
+ InputImage.reset (RuntimeDyldMachO::createObjectImageFromFile (InputObject));
686
+ if (!Dyld)
700
687
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!" );
707
693
708
- return Dyld->loadObject (InputObject);
694
+ Dyld->loadObject (InputImage.get ());
695
+ return InputImage.release ();
709
696
}
710
697
711
698
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)
720
710
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)
732
724
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!" );
747
735
}
748
736
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 ();
750
742
}
751
743
752
744
void *RuntimeDyld::getSymbolAddress (StringRef Name) {
0 commit comments