1*f6aab3d8Srobert //===-- ObjectContainerMachOFileset.h ---------------------------*- C++ -*-===// 2*f6aab3d8Srobert // 3*f6aab3d8Srobert // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*f6aab3d8Srobert // See https://llvm.org/LICENSE.txt for license information. 5*f6aab3d8Srobert // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*f6aab3d8Srobert // 7*f6aab3d8Srobert //===----------------------------------------------------------------------===// 8*f6aab3d8Srobert 9*f6aab3d8Srobert #ifndef LLDB_SOURCE_PLUGINS_OBJECTCONTAINER_MACH_O_FILESET_OBJECTCONTAINERMADCHOFILESET_H 10*f6aab3d8Srobert #define LLDB_SOURCE_PLUGINS_OBJECTCONTAINER_MACH_O_FILESET_OBJECTCONTAINERMADCHOFILESET_H 11*f6aab3d8Srobert 12*f6aab3d8Srobert #include "lldb/Host/SafeMachO.h" 13*f6aab3d8Srobert #include "lldb/Symbol/ObjectContainer.h" 14*f6aab3d8Srobert #include "lldb/Utility/FileSpec.h" 15*f6aab3d8Srobert 16*f6aab3d8Srobert namespace lldb_private { 17*f6aab3d8Srobert 18*f6aab3d8Srobert class ObjectContainerMachOFileset : public lldb_private::ObjectContainer { 19*f6aab3d8Srobert public: 20*f6aab3d8Srobert ObjectContainerMachOFileset(const lldb::ModuleSP &module_sp, 21*f6aab3d8Srobert lldb::DataBufferSP &data_sp, 22*f6aab3d8Srobert lldb::offset_t data_offset, 23*f6aab3d8Srobert const lldb_private::FileSpec *file, 24*f6aab3d8Srobert lldb::offset_t offset, lldb::offset_t length); 25*f6aab3d8Srobert 26*f6aab3d8Srobert ObjectContainerMachOFileset(const lldb::ModuleSP &module_sp, 27*f6aab3d8Srobert lldb::WritableDataBufferSP data_sp, 28*f6aab3d8Srobert const lldb::ProcessSP &process_sp, 29*f6aab3d8Srobert lldb::addr_t header_addr); 30*f6aab3d8Srobert 31*f6aab3d8Srobert ~ObjectContainerMachOFileset() override; 32*f6aab3d8Srobert 33*f6aab3d8Srobert static void Initialize(); 34*f6aab3d8Srobert static void Terminate(); 35*f6aab3d8Srobert GetPluginNameStatic()36*f6aab3d8Srobert static llvm::StringRef GetPluginNameStatic() { return "mach-o-fileset"; } 37*f6aab3d8Srobert GetPluginDescriptionStatic()38*f6aab3d8Srobert static llvm::StringRef GetPluginDescriptionStatic() { 39*f6aab3d8Srobert return "Mach-O Fileset container reader."; 40*f6aab3d8Srobert } 41*f6aab3d8Srobert 42*f6aab3d8Srobert static lldb_private::ObjectContainer * 43*f6aab3d8Srobert CreateInstance(const lldb::ModuleSP &module_sp, lldb::DataBufferSP &data_sp, 44*f6aab3d8Srobert lldb::offset_t data_offset, const lldb_private::FileSpec *file, 45*f6aab3d8Srobert lldb::offset_t offset, lldb::offset_t length); 46*f6aab3d8Srobert 47*f6aab3d8Srobert static lldb_private::ObjectContainer *CreateMemoryInstance( 48*f6aab3d8Srobert const lldb::ModuleSP &module_sp, lldb::WritableDataBufferSP data_sp, 49*f6aab3d8Srobert const lldb::ProcessSP &process_sp, lldb::addr_t header_addr); 50*f6aab3d8Srobert 51*f6aab3d8Srobert static size_t GetModuleSpecifications(const lldb_private::FileSpec &file, 52*f6aab3d8Srobert lldb::DataBufferSP &data_sp, 53*f6aab3d8Srobert lldb::offset_t data_offset, 54*f6aab3d8Srobert lldb::offset_t file_offset, 55*f6aab3d8Srobert lldb::offset_t length, 56*f6aab3d8Srobert lldb_private::ModuleSpecList &specs); 57*f6aab3d8Srobert 58*f6aab3d8Srobert static bool MagicBytesMatch(const lldb_private::DataExtractor &data); 59*f6aab3d8Srobert static bool MagicBytesMatch(lldb::DataBufferSP data_sp, 60*f6aab3d8Srobert lldb::addr_t data_offset, 61*f6aab3d8Srobert lldb::addr_t data_length); 62*f6aab3d8Srobert 63*f6aab3d8Srobert bool ParseHeader() override; 64*f6aab3d8Srobert GetNumObjects()65*f6aab3d8Srobert size_t GetNumObjects() const override { return m_entries.size(); } 66*f6aab3d8Srobert 67*f6aab3d8Srobert lldb::ObjectFileSP GetObjectFile(const lldb_private::FileSpec *file) override; 68*f6aab3d8Srobert GetPluginName()69*f6aab3d8Srobert llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 70*f6aab3d8Srobert 71*f6aab3d8Srobert struct Entry { EntryEntry72*f6aab3d8Srobert Entry(uint64_t vmaddr, uint64_t fileoff, std::string id) 73*f6aab3d8Srobert : vmaddr(vmaddr), fileoff(fileoff), id(id) {} 74*f6aab3d8Srobert uint64_t vmaddr; 75*f6aab3d8Srobert uint64_t fileoff; 76*f6aab3d8Srobert std::string id; 77*f6aab3d8Srobert }; 78*f6aab3d8Srobert 79*f6aab3d8Srobert Entry *FindEntry(llvm::StringRef id); 80*f6aab3d8Srobert 81*f6aab3d8Srobert private: 82*f6aab3d8Srobert static bool ParseHeader(lldb_private::DataExtractor &data, 83*f6aab3d8Srobert const lldb_private::FileSpec &file, 84*f6aab3d8Srobert lldb::offset_t file_offset, 85*f6aab3d8Srobert std::vector<Entry> &entries); 86*f6aab3d8Srobert 87*f6aab3d8Srobert std::vector<Entry> m_entries; 88*f6aab3d8Srobert lldb::ProcessWP m_process_wp; 89*f6aab3d8Srobert const lldb::addr_t m_memory_addr; 90*f6aab3d8Srobert }; 91*f6aab3d8Srobert 92*f6aab3d8Srobert } // namespace lldb_private 93*f6aab3d8Srobert 94*f6aab3d8Srobert #endif // LLDB_SOURCE_PLUGINS_OBJECTCONTAINER_MACH_O_FILESET_OBJECTCONTAINERMADCHOFILESET_H 95