1061da546Spatrick //===-- ObjectContainerUniversalMachO.h -------------------------*- C++ -*-===// 2061da546Spatrick // 3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6061da546Spatrick // 7061da546Spatrick //===----------------------------------------------------------------------===// 8061da546Spatrick 9dda28197Spatrick #ifndef LLDB_SOURCE_PLUGINS_OBJECTCONTAINER_UNIVERSAL_MACH_O_OBJECTCONTAINERUNIVERSALMACHO_H 10dda28197Spatrick #define LLDB_SOURCE_PLUGINS_OBJECTCONTAINER_UNIVERSAL_MACH_O_OBJECTCONTAINERUNIVERSALMACHO_H 11061da546Spatrick 12061da546Spatrick #include "lldb/Host/SafeMachO.h" 13061da546Spatrick #include "lldb/Symbol/ObjectContainer.h" 14061da546Spatrick #include "lldb/Utility/FileSpec.h" 15061da546Spatrick 16061da546Spatrick class ObjectContainerUniversalMachO : public lldb_private::ObjectContainer { 17061da546Spatrick public: 18061da546Spatrick ObjectContainerUniversalMachO(const lldb::ModuleSP &module_sp, 19061da546Spatrick lldb::DataBufferSP &data_sp, 20061da546Spatrick lldb::offset_t data_offset, 21061da546Spatrick const lldb_private::FileSpec *file, 22061da546Spatrick lldb::offset_t offset, lldb::offset_t length); 23061da546Spatrick 24061da546Spatrick ~ObjectContainerUniversalMachO() override; 25061da546Spatrick 26061da546Spatrick // Static Functions 27061da546Spatrick static void Initialize(); 28061da546Spatrick 29061da546Spatrick static void Terminate(); 30061da546Spatrick GetPluginNameStatic()31*f6aab3d8Srobert static llvm::StringRef GetPluginNameStatic() { return "mach-o"; } 32061da546Spatrick GetPluginDescriptionStatic()33*f6aab3d8Srobert static llvm::StringRef GetPluginDescriptionStatic() { 34*f6aab3d8Srobert return "Universal mach-o object container reader."; 35*f6aab3d8Srobert } 36061da546Spatrick 37061da546Spatrick static lldb_private::ObjectContainer * 38061da546Spatrick CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp, 39061da546Spatrick lldb::offset_t data_offset, const lldb_private::FileSpec *file, 40061da546Spatrick lldb::offset_t offset, lldb::offset_t length); 41061da546Spatrick 42061da546Spatrick static size_t GetModuleSpecifications(const lldb_private::FileSpec &file, 43061da546Spatrick lldb::DataBufferSP &data_sp, 44061da546Spatrick lldb::offset_t data_offset, 45061da546Spatrick lldb::offset_t file_offset, 46061da546Spatrick lldb::offset_t length, 47061da546Spatrick lldb_private::ModuleSpecList &specs); 48061da546Spatrick 49061da546Spatrick static bool MagicBytesMatch(const lldb_private::DataExtractor &data); 50061da546Spatrick 51061da546Spatrick // Member Functions 52061da546Spatrick bool ParseHeader() override; 53061da546Spatrick 54061da546Spatrick size_t GetNumArchitectures() const override; 55061da546Spatrick 56061da546Spatrick bool GetArchitectureAtIndex(uint32_t cpu_idx, 57061da546Spatrick lldb_private::ArchSpec &arch) const override; 58061da546Spatrick 59061da546Spatrick lldb::ObjectFileSP GetObjectFile(const lldb_private::FileSpec *file) override; 60061da546Spatrick 61061da546Spatrick // PluginInterface protocol GetPluginName()62*f6aab3d8Srobert llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 63061da546Spatrick 64061da546Spatrick protected: 65061da546Spatrick llvm::MachO::fat_header m_header; 66061da546Spatrick std::vector<llvm::MachO::fat_arch> m_fat_archs; 67061da546Spatrick 68061da546Spatrick static bool ParseHeader(lldb_private::DataExtractor &data, 69061da546Spatrick llvm::MachO::fat_header &header, 70061da546Spatrick std::vector<llvm::MachO::fat_arch> &fat_archs); 71061da546Spatrick }; 72061da546Spatrick 73dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_OBJECTCONTAINER_UNIVERSAL_MACH_O_OBJECTCONTAINERUNIVERSALMACHO_H 74