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