//===-- ObjectFileMachO.h ---------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//

#ifndef LLDB_SOURCE_PLUGINS_OBJECTFILE_MACH_O_OBJECTFILEMACHO_H
#define LLDB_SOURCE_PLUGINS_OBJECTFILE_MACH_O_OBJECTFILEMACHO_H

#include "lldb/Core/Address.h"
#include "lldb/Host/SafeMachO.h"
#include "lldb/Symbol/ObjectFile.h"
#include "lldb/Symbol/SaveCoreOptions.h"
#include "lldb/Utility/FileSpec.h"
#include "lldb/Utility/FileSpecList.h"
#include "lldb/Utility/RangeMap.h"
#include "lldb/Utility/StreamString.h"
#include "lldb/Utility/UUID.h"
#include <optional>

// This class needs to be hidden as eventually belongs in a plugin that
// will export the ObjectFile protocol
class ObjectFileMachO : public lldb_private::ObjectFile {
public:
  ObjectFileMachO(const lldb::ModuleSP &module_sp,
                  lldb::DataExtractorSP extractor_sp,
                  lldb::offset_t data_offset,
                  const lldb_private::FileSpec *file, lldb::offset_t offset,
                  lldb::offset_t length);

  ObjectFileMachO(const lldb::ModuleSP &module_sp,
                  lldb::WritableDataBufferSP data_sp,
                  const lldb::ProcessSP &process_sp, lldb::addr_t header_addr);

  ~ObjectFileMachO() override = default;

  // Static Functions
  static void Initialize();

  static void Terminate();

  static llvm::StringRef GetPluginNameStatic() { return "mach-o"; }

  static llvm::StringRef GetPluginDescriptionStatic() {
    return "Mach-o object file reader (32 and 64 bit)";
  }

  static lldb_private::ObjectFile *
  CreateInstance(const lldb::ModuleSP &module_sp,
                 lldb::DataExtractorSP extractor_sp, lldb::offset_t data_offset,
                 const lldb_private::FileSpec *file, lldb::offset_t file_offset,
                 lldb::offset_t length);

  static lldb_private::ObjectFile *CreateMemoryInstance(
      const lldb::ModuleSP &module_sp, lldb::WritableDataBufferSP data_sp,
      const lldb::ProcessSP &process_sp, lldb::addr_t header_addr);

  static lldb_private::ModuleSpecList
  GetModuleSpecifications(const lldb_private::FileSpec &file,
                          lldb::DataExtractorSP &extractor_sp,
                          lldb::offset_t file_offset, lldb::offset_t length);

  static bool SaveCore(const lldb::ProcessSP &process_sp,
                       lldb_private::SaveCoreOptions &options,
                       lldb_private::Status &error);

  static bool MagicBytesMatch(lldb::DataExtractorSP extractor_sp,
                              lldb::addr_t offset, lldb::addr_t length);

  // LLVM RTTI support
  static char ID;
  bool isA(const void *ClassID) const override {
    return ClassID == &ID || ObjectFile::isA(ClassID);
  }
  static bool classof(const ObjectFile *obj) { return obj->isA(&ID); }

  // Member Functions
  bool ParseHeader() override;

  bool SetLoadAddress(lldb_private::Target &target, lldb::addr_t value,
                      bool value_is_offset) override;

  lldb::ByteOrder GetByteOrder() const override;

  bool IsExecutable() const override;

  bool IsDynamicLoader() const;

  bool IsSharedCacheBinary() const;

  bool IsKext() const;

  uint32_t GetAddressByteSize() const override;

  lldb_private::AddressClass GetAddressClass(lldb::addr_t file_addr) override;

  void ParseSymtab(lldb_private::Symtab &symtab) override;

  bool IsStripped() override;

  void CreateSections(lldb_private::SectionList &unified_section_list) override;

  void Dump(lldb_private::Stream *s) override;

  lldb_private::ArchSpec GetArchitecture() override;

  lldb_private::UUID GetUUID() override;

  uint32_t GetDependentModules(lldb_private::FileSpecList &files) override;

  lldb_private::FileSpecList GetReExportedLibraries() override {
    return m_reexported_dylibs;
  }

  lldb_private::Address GetEntryPointAddress() override;

  lldb_private::Address GetBaseAddress() override;

  uint32_t GetNumThreadContexts() override;

  std::vector<std::tuple<lldb::offset_t, lldb::offset_t>>
  FindLC_NOTEByName(std::string name);

  std::string GetIdentifierString() override;

  lldb_private::AddressableBits GetAddressableBits() override;

  bool GetCorefileMainBinaryInfo(lldb::addr_t &value, bool &value_is_offset,
                                 lldb_private::UUID &uuid,
                                 ObjectFile::BinaryType &type) override;

  bool GetCorefileThreadExtraInfos(std::vector<lldb::tid_t> &tids) override;

  lldb_private::StructuredData::ObjectSP GetCorefileProcessMetadata() override;

  bool LoadCoreFileImages(lldb_private::Process &process) override;

  lldb::RegisterContextSP
  GetThreadContextAtIndex(uint32_t idx, lldb_private::Thread &thread) override;

  ObjectFile::Type CalculateType() override;

  ObjectFile::Strata CalculateStrata() override;

  llvm::VersionTuple GetVersion() override;

  llvm::VersionTuple GetMinimumOSVersion() override;

  llvm::VersionTuple GetSDKVersion() override;

  bool GetIsDynamicLinkEditor() override;

  bool CanTrustAddressRanges() override;

  static bool ParseHeader(lldb::DataExtractorSP &data,
                          lldb::offset_t *data_offset_ptr,
                          llvm::MachO::mach_header &header);

  bool AllowAssemblyEmulationUnwindPlans() override;

  lldb_private::Section *GetMachHeaderSection();

  bool IsGOTSection(const lldb_private::Section &section) const override;

  // PluginInterface protocol
  llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }

protected:
  static lldb_private::UUID
  GetUUID(const llvm::MachO::mach_header &header,
          const lldb_private::DataExtractor &data,
          lldb::offset_t lc_offset); // Offset to the first load command

  static lldb_private::ArchSpec GetArchitecture(
      lldb::ModuleSP module_sp, const llvm::MachO::mach_header &header,
      const lldb_private::DataExtractor &data, lldb::offset_t lc_offset);

  /// Enumerate all ArchSpecs supported by this Mach-O file.
  ///
  /// On macOS one Mach-O slice can contain multiple load commands:
  /// One load command for being loaded into a macOS process and one
  /// load command for being loaded into a macCatalyst process. In
  /// contrast to ObjectContainerUniversalMachO, this is the same
  /// binary that can be loaded into different contexts.
  static void GetAllArchSpecs(const llvm::MachO::mach_header &header,
                              const lldb_private::DataExtractor &data,
                              lldb::offset_t lc_offset,
                              lldb_private::ModuleSpec &base_spec,
                              lldb_private::ModuleSpecList &all_specs);

  /// Intended for same-host arm device debugging where lldb needs to
  /// detect libraries in the shared cache and augment the nlist entries
  /// with an on-disk dyld_shared_cache file.  The process will record
  /// the shared cache UUID so the on-disk cache can be matched or rejected
  /// correctly.
  void GetProcessSharedCacheUUID(lldb_private::Process *,
                                 lldb::addr_t &base_addr,
                                 lldb_private::UUID &uuid);

  /// Intended for same-host arm device debugging where lldb will read
  /// shared cache libraries out of its own memory instead of the remote
  /// process' memory as an optimization.  If lldb's shared cache UUID
  /// does not match the process' shared cache UUID, this optimization
  /// should not be used.
  void GetLLDBSharedCacheUUID(lldb::addr_t &base_addir, lldb_private::UUID &uuid);

  lldb::addr_t CalculateSectionLoadAddressForMemoryImage(
      lldb::addr_t mach_header_load_address,
      const lldb_private::Section *mach_header_section,
      const lldb_private::Section *section);

  lldb_private::UUID
  GetSharedCacheUUID(lldb_private::FileSpec dyld_shared_cache,
                     const lldb::ByteOrder byte_order,
                     const uint32_t addr_byte_size);

  size_t ParseSymtab();

  typedef lldb_private::RangeVector<uint32_t, uint32_t, 8> EncryptedFileRanges;
  EncryptedFileRanges GetEncryptedFileRanges();

  struct SegmentParsingContext;
  void ProcessDysymtabCommand(const llvm::MachO::load_command &load_cmd,
                              lldb::offset_t offset);
  void ProcessSegmentCommand(const llvm::MachO::load_command &load_cmd,
                             lldb::offset_t offset, uint32_t cmd_idx,
                             SegmentParsingContext &context);
  void SanitizeSegmentCommand(llvm::MachO::segment_command_64 &seg_cmd,
                              uint32_t cmd_idx);

  bool SectionIsLoadable(const lldb_private::Section *section);

  /// A corefile may include metadata about all of the binaries that were
  /// present in the process when the corefile was taken.  This is only
  /// implemented for Mach-O files for now; we'll generalize it when we
  /// have other systems that can include the same.
  struct MachOCorefileImageEntry {
    std::string filename;
    lldb_private::UUID uuid;
    lldb::addr_t load_address = LLDB_INVALID_ADDRESS;
    lldb::addr_t slide = 0;
    bool currently_executing = false;
    std::vector<std::tuple<lldb_private::ConstString, lldb::addr_t>>
        segment_load_addresses;
  };

  struct LCNoteEntry {
    explicit LCNoteEntry(lldb::ByteOrder byte_order)
        : payload(lldb_private::Stream::eBinary, byte_order) {}

    std::string name;
    lldb::addr_t payload_file_offset = 0;
    lldb_private::StreamString payload;
  };

  struct MachOCorefileAllImageInfos {
    std::vector<MachOCorefileImageEntry> all_image_infos;
    bool IsValid() { return all_image_infos.size() > 0; }
  };

  // The LC_SYMTAB's symtab_command structure uses 32-bit file offsets
  // for two fields, but ObjectFileMachO needs to calculate the offsets
  // in virtual address layout from the start of the TEXT segment, and
  // that span may be larger than 4GB.
  struct SymtabCommandLargeOffsets {
    SymtabCommandLargeOffsets() {}
    SymtabCommandLargeOffsets(const llvm::MachO::symtab_command &in)
        : cmd(in.cmd), cmdsize(in.cmdsize), symoff(in.symoff), nsyms(in.nsyms),
          stroff(in.stroff), strsize(in.strsize) {}
    void operator=(const llvm::MachO::symtab_command &in) {
      cmd = in.cmd;
      cmdsize = in.cmdsize;
      symoff = in.symoff;
      nsyms = in.nsyms;
      stroff = in.stroff;
      strsize = in.strsize;
    }
    uint32_t cmd = 0;          /* LC_SYMTAB */
    uint32_t cmdsize = 0;      /* sizeof(struct symtab_command) */
    lldb::offset_t symoff = 0; /* symbol table offset */
    uint32_t nsyms = 0;        /* number of symbol table entries */
    lldb::offset_t stroff = 0; /* string table offset */
    uint32_t strsize = 0;      /* string table size in bytes */
  };

  // The LC_DYLD_INFO's dyld_info_command has 32-bit file offsets
  // that we will use as virtual address offsets, and may need to span
  // more than 4GB in virtual memory.
  struct DyldInfoCommandLargeOffsets {
    DyldInfoCommandLargeOffsets() {}
    DyldInfoCommandLargeOffsets(const llvm::MachO::dyld_info_command &in)
        : cmd(in.cmd), cmdsize(in.cmdsize), rebase_off(in.rebase_off),
          rebase_size(in.rebase_size), bind_off(in.bind_off),
          bind_size(in.bind_size), weak_bind_off(in.weak_bind_off),
          weak_bind_size(in.weak_bind_size), lazy_bind_off(in.lazy_bind_off),
          lazy_bind_size(in.lazy_bind_size), export_off(in.export_off),
          export_size(in.export_size) {}

    void operator=(const llvm::MachO::dyld_info_command &in) {
      cmd = in.cmd;
      cmdsize = in.cmdsize;
      rebase_off = in.rebase_off;
      rebase_size = in.rebase_size;
      bind_off = in.bind_off;
      bind_size = in.bind_size;
      weak_bind_off = in.weak_bind_off;
      weak_bind_size = in.weak_bind_size;
      lazy_bind_off = in.lazy_bind_off;
      lazy_bind_size = in.lazy_bind_size;
      export_off = in.export_off;
      export_size = in.export_size;
    };

    /// LC_DYLD_INFO or LC_DYLD_INFO_ONLY
    uint32_t cmd = 0;
    uint32_t cmdsize = 0;             /* sizeof(struct dyld_info_command) */
    lldb::offset_t rebase_off = 0;    /* file offset to rebase info  */
    uint32_t rebase_size = 0;         /* size of rebase info   */
    lldb::offset_t bind_off = 0;      /* file offset to binding info   */
    uint32_t bind_size = 0;           /* size of binding info  */
    lldb::offset_t weak_bind_off = 0; /* file offset to weak binding info   */
    uint32_t weak_bind_size = 0;      /* size of weak binding info  */
    lldb::offset_t lazy_bind_off = 0; /* file offset to lazy binding info */
    uint32_t lazy_bind_size = 0;      /* size of lazy binding infs */
    lldb::offset_t export_off = 0;    /* file offset to lazy binding info */
    uint32_t export_size = 0;         /* size of lazy binding infs */
  };

  /// The LC_DYSYMTAB's dysymtab_command has 32-bit file offsets
  /// that we will use as virtual address offsets, and may need to span
  /// more than 4GB in virtual memory.
  struct DysymtabCommandLargeOffsets {
    DysymtabCommandLargeOffsets() {}
    DysymtabCommandLargeOffsets(const llvm::MachO::dysymtab_command &in)
        : cmd(in.cmd), cmdsize(in.cmdsize), ilocalsym(in.ilocalsym),
          nlocalsym(in.nlocalsym), iextdefsym(in.iextdefsym),
          nextdefsym(in.nextdefsym), iundefsym(in.iundefsym),
          nundefsym(in.nundefsym), tocoff(in.tocoff), ntoc(in.ntoc),
          modtaboff(in.modtaboff), nmodtab(in.nmodtab),
          extrefsymoff(in.extrefsymoff), nextrefsyms(in.nextrefsyms),
          indirectsymoff(in.indirectsymoff), nindirectsyms(in.nindirectsyms),
          extreloff(in.extreloff), nextrel(in.nextrel), locreloff(in.locreloff),
          nlocrel(in.nlocrel) {}

    void operator=(const llvm::MachO::dysymtab_command &in) {
      cmd = in.cmd;
      cmdsize = in.cmdsize;
      ilocalsym = in.ilocalsym;
      nlocalsym = in.nlocalsym;
      iextdefsym = in.iextdefsym;
      nextdefsym = in.nextdefsym;
      iundefsym = in.iundefsym;
      nundefsym = in.nundefsym;
      tocoff = in.tocoff;
      ntoc = in.ntoc;
      modtaboff = in.modtaboff;
      nmodtab = in.nmodtab;
      extrefsymoff = in.extrefsymoff;
      nextrefsyms = in.nextrefsyms;
      indirectsymoff = in.indirectsymoff;
      nindirectsyms = in.nindirectsyms;
      extreloff = in.extreloff;
      nextrel = in.nextrel;
      locreloff = in.locreloff;
      nlocrel = in.nlocrel;
    };

    uint32_t cmd = 0;             /* LC_DYSYMTAB */
    uint32_t cmdsize = 0;         /* sizeof(struct dysymtab_command) */
    uint32_t ilocalsym = 0;       /* index to local symbols */
    uint32_t nlocalsym = 0;       /* number of local symbols */
    uint32_t iextdefsym = 0;      /* index to externally defined symbols */
    uint32_t nextdefsym = 0;      /* number of externally defined symbols */
    uint32_t iundefsym = 0;       /* index to undefined symbols */
    uint32_t nundefsym = 0;       /* number of undefined symbols */
    lldb::offset_t tocoff = 0;    /* file offset to table of contents */
    uint32_t ntoc = 0;            /* number of entries in table of contents */
    lldb::offset_t modtaboff = 0; /* file offset to module table */
    uint32_t nmodtab = 0;         /* number of module table entries */
    lldb::offset_t extrefsymoff = 0; /* offset to referenced symbol table */
    uint32_t nextrefsyms = 0; /* number of referenced symbol table entries */
    lldb::offset_t indirectsymoff =
        0;                        /* file offset to the indirect symbol table */
    uint32_t nindirectsyms = 0;   /* number of indirect symbol table entries */
    lldb::offset_t extreloff = 0; /* offset to external relocation entries */
    uint32_t nextrel = 0;         /* number of external relocation entries */
    lldb::offset_t locreloff = 0; /* offset to local relocation entries */
    uint32_t nlocrel = 0;         /* number of local relocation entries */
  };

  // The linkedit_data_command is used in several load commands including
  // LC_FUNCTION_STARTS and LC_DYLD_EXPORTS_TRIE.  It has a 32-bit file offset
  // that may need to span more than 4GB in real virtual addresses.
  struct LinkeditDataCommandLargeOffsets {
    LinkeditDataCommandLargeOffsets() {}
    LinkeditDataCommandLargeOffsets(
        const llvm::MachO::linkedit_data_command &in)
        : cmd(in.cmd), cmdsize(in.cmdsize), dataoff(in.dataoff),
          datasize(in.datasize) {}
    void operator=(const llvm::MachO::linkedit_data_command &in) {
      cmd = in.cmd;
      cmdsize = in.cmdsize;
      dataoff = in.dataoff;
      datasize = in.datasize;
    }
    uint32_t cmd = 0;     /* LC_FUNCTION_STARTS, LC_DYLD_EXPORTS_TRIE, etc */
    uint32_t cmdsize = 0; /* sizeof(struct linkedit_data_command) */
    lldb::offset_t dataoff = 0; /* file offset of data in __LINKEDIT segment */
    uint32_t datasize = 0;      /* file size of data in __LINKEDIT segment  */
  };

  /// Get the list of binary images that were present in the process
  /// when the corefile was produced.
  /// \return
  ///     The MachOCorefileAllImageInfos object returned will have
  ///     IsValid() == false if the information is unavailable.
  MachOCorefileAllImageInfos GetCorefileAllImageInfos();

  llvm::MachO::mach_header m_header;
  static lldb_private::ConstString GetSegmentNameTEXT();
  static lldb_private::ConstString GetSegmentNameDATA();
  static lldb_private::ConstString GetSegmentNameDATA_DIRTY();
  static lldb_private::ConstString GetSegmentNameDATA_CONST();
  static lldb_private::ConstString GetSegmentNameOBJC();
  static lldb_private::ConstString GetSegmentNameLINKEDIT();
  static lldb_private::ConstString GetSegmentNameDWARF();
  static lldb_private::ConstString GetSegmentNameLLVM_COV();
  static lldb_private::ConstString GetSectionNameEHFrame();
  static lldb_private::ConstString GetSectionNameLLDBNoNlist();

  llvm::MachO::dysymtab_command m_dysymtab;
  std::vector<llvm::MachO::section_64> m_mach_sections;
  std::optional<llvm::VersionTuple> m_min_os_version;
  std::optional<llvm::VersionTuple> m_sdk_versions;
  typedef lldb_private::RangeVector<uint32_t, uint32_t> FileRangeArray;
  lldb_private::Address m_entry_point_address;
  FileRangeArray m_thread_context_offsets;
  lldb::offset_t m_linkedit_original_offset = 0;
  lldb::addr_t m_text_address = LLDB_INVALID_ADDRESS;
  bool m_thread_context_offsets_valid;
  lldb_private::FileSpecList m_reexported_dylibs;
  bool m_allow_assembly_emulation_unwind_plans;
};

#endif // LLDB_SOURCE_PLUGINS_OBJECTFILE_MACH_O_OBJECTFILEMACHO_H
