21 using namespace llvm::MachO;
24 ObjectContainerMachOArchive)
27 PluginManager::RegisterPlugin(GetPluginNameStatic(),
28 GetPluginDescriptionStatic(), CreateInstance,
29 GetModuleSpecifications);
33 PluginManager::UnregisterPlugin(CreateInstance);
37 const lldb::ModuleSP &module_sp, DataBufferSP &data_sp,
44 data.
SetData(data_sp, data_offset, length);
46 std::unique_ptr<ObjectContainerUniversalMachO> container_up(
48 file, file_offset, length));
49 if (container_up->ParseHeader()) {
50 return container_up.release();
60 return magic == FAT_MAGIC || magic == FAT_CIGAM;
64 const lldb::ModuleSP &module_sp, DataBufferSP &data_sp,
69 m_header(), m_fat_archs() {
85 std::vector<llvm::MachO::fat_arch> &fat_archs) {
92 header.magic = data.
GetU32(&offset);
95 if (header.magic == FAT_MAGIC) {
99 header.nfat_arch = data.
GetU32(&offset);
105 for (arch_idx = 0; arch_idx < header.nfat_arch; ++arch_idx) {
108 if (data.
GetU32(&offset, &arch,
sizeof(fat_arch) /
sizeof(
uint32_t)))
109 fat_archs.push_back(arch);
114 memset(&header, 0,
sizeof(header));
120 s->
Printf(
"%p: ",
static_cast<const void *
>(
this));
124 s->
Printf(
"ObjectContainerUniversalMachO, num_archs = %zu, num_objects = %zu",
125 num_archs, num_objects);
129 for (i = 0; i < num_archs; i++) {
134 for (i = 0; i < num_objects; i++) {
164 if (!module_sp->GetArchitecture().IsValid()) {
165 arch = Target::GetDefaultArchitecture();
169 arch = module_sp->GetArchitecture();
173 for (arch_idx = 0; arch_idx <
m_header.nfat_arch; ++arch_idx) {
180 if (arch_idx >=
m_header.nfat_arch) {
181 for (arch_idx = 0; arch_idx <
m_header.nfat_arch; ++arch_idx) {
188 if (arch_idx <
m_header.nfat_arch) {
189 DataBufferSP data_sp;
191 return ObjectFile::FindPlugin(
196 return ObjectFileSP();
203 const size_t initial_count = specs.
GetSize();
206 data.
SetData(data_sp, data_offset, data_sp->GetByteSize());
209 llvm::MachO::fat_header header;
210 std::vector<llvm::MachO::fat_arch> fat_archs;
212 for (
const llvm::MachO::fat_arch &fat_arch : fat_archs) {
213 const lldb::offset_t slice_file_offset = fat_arch.offset + file_offset;
214 if (fat_arch.offset < file_size && file_size > slice_file_offset) {
215 ObjectFile::GetModuleSpecifications(
216 file, slice_file_offset, file_size - slice_file_offset, specs);
221 return specs.
GetSize() - initial_count;