#ifndef LLDB_SOURCE_PLUGINS_DYNAMICLOADER_MACOSX_DYLD_DYNAMICLOADERMACOS_H
#define LLDB_SOURCE_PLUGINS_DYNAMICLOADER_MACOSX_DYLD_DYNAMICLOADERMACOS_H
#include <mutex>
#include <vector>
#include "lldb/Target/DynamicLoader.h"
#include "lldb/Target/Process.h"
#include "lldb/Utility/FileSpec.h"
#include "lldb/Utility/StructuredData.h"
#include "lldb/Utility/UUID.h"
#include "DynamicLoaderDarwin.h"
class DynamicLoaderMacOS : public lldb_private::DynamicLoaderDarwin {
public:
DynamicLoaderMacOS(lldb_private::Process *process);
~DynamicLoaderMacOS() override;
static void Initialize();
static void Terminate();
static llvm::StringRef GetPluginNameStatic() { return "macos-dyld"; }
static llvm::StringRef GetPluginDescriptionStatic();
static lldb_private::DynamicLoader *
CreateInstance(lldb_private::Process *process, bool force);
bool ProcessDidExec() override;
lldb_private::Status CanLoadImage() override;
bool GetSharedCacheInformation(
lldb::addr_t &base_address, lldb_private::UUID &uuid,
lldb_private::LazyBool &using_shared_cache,
lldb_private::LazyBool &private_shared_cache) override;
llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
protected:
void PutToLog(lldb_private::Log *log) const;
void DoInitialImageFetch() override;
bool NeedToDoInitialImageFetch() override;
bool DidSetNotificationBreakpoint() override;
bool SetDYLDHandoverBreakpoint(lldb::addr_t notification_address);
void ClearDYLDHandoverBreakpoint();
void AddBinaries(const std::vector<lldb::addr_t> &load_addresses);
void DoClear() override;
bool IsFullyInitialized() override;
static bool
NotifyBreakpointHit(void *baton,
lldb_private::StoppointCallbackContext *context,
lldb::user_id_t break_id, lldb::user_id_t break_loc_id);
lldb::addr_t GetNotificationFuncAddrFromImageInfos();
bool SetNotificationBreakpoint() override;
void ClearNotificationBreakpoint() override;
void UpdateImageInfosHeaderAndLoadCommands(ImageInfo::collection &image_infos,
uint32_t infos_count,
bool update_executable);
lldb::addr_t
GetDyldLockVariableAddressFromModule(lldb_private::Module *module);
uint32_t m_image_infos_stop_id;
lldb::user_id_t m_break_id;
lldb::user_id_t m_dyld_handover_break_id;
mutable std::recursive_mutex m_mutex;
lldb::addr_t m_maybe_image_infos_address;
bool m_libsystem_fully_initalized;
};
#endif