1061da546Spatrick //===-- JITLoaderGDB.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_JITLOADER_GDB_JITLOADERGDB_H 10dda28197Spatrick #define LLDB_SOURCE_PLUGINS_JITLOADER_GDB_JITLOADERGDB_H 11061da546Spatrick 12061da546Spatrick #include <map> 13061da546Spatrick 14061da546Spatrick #include "lldb/Target/JITLoader.h" 15061da546Spatrick #include "lldb/Target/Process.h" 16061da546Spatrick 17061da546Spatrick class JITLoaderGDB : public lldb_private::JITLoader { 18061da546Spatrick public: 19061da546Spatrick JITLoaderGDB(lldb_private::Process *process); 20061da546Spatrick 21061da546Spatrick ~JITLoaderGDB() override; 22061da546Spatrick 23061da546Spatrick // Static Functions 24061da546Spatrick static void Initialize(); 25061da546Spatrick 26061da546Spatrick static void Terminate(); 27061da546Spatrick GetPluginNameStatic()28*f6aab3d8Srobert static llvm::StringRef GetPluginNameStatic() { return "gdb"; } 29061da546Spatrick 30*f6aab3d8Srobert static llvm::StringRef GetPluginDescriptionStatic(); 31061da546Spatrick 32061da546Spatrick static lldb::JITLoaderSP CreateInstance(lldb_private::Process *process, 33061da546Spatrick bool force); 34061da546Spatrick 35061da546Spatrick static void DebuggerInitialize(lldb_private::Debugger &debugger); 36061da546Spatrick 37061da546Spatrick // PluginInterface protocol GetPluginName()38*f6aab3d8Srobert llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 39061da546Spatrick 40061da546Spatrick // JITLoader interface 41061da546Spatrick void DidAttach() override; 42061da546Spatrick 43061da546Spatrick void DidLaunch() override; 44061da546Spatrick 45061da546Spatrick void ModulesDidLoad(lldb_private::ModuleList &module_list) override; 46061da546Spatrick 47061da546Spatrick private: 48061da546Spatrick lldb::addr_t GetSymbolAddress(lldb_private::ModuleList &module_list, 49061da546Spatrick lldb_private::ConstString name, 50061da546Spatrick lldb::SymbolType symbol_type) const; 51061da546Spatrick 52061da546Spatrick void SetJITBreakpoint(lldb_private::ModuleList &module_list); 53061da546Spatrick 54061da546Spatrick bool DidSetJITBreakpoint() const; 55061da546Spatrick 56061da546Spatrick bool ReadJITDescriptor(bool all_entries); 57061da546Spatrick 58061da546Spatrick template <typename ptr_t> bool ReadJITDescriptorImpl(bool all_entries); 59061da546Spatrick 60061da546Spatrick static bool 61061da546Spatrick JITDebugBreakpointHit(void *baton, 62061da546Spatrick lldb_private::StoppointCallbackContext *context, 63061da546Spatrick lldb::user_id_t break_id, lldb::user_id_t break_loc_id); 64061da546Spatrick 65061da546Spatrick static void ProcessStateChangedCallback(void *baton, 66061da546Spatrick lldb_private::Process *process, 67061da546Spatrick lldb::StateType state); 68061da546Spatrick 69061da546Spatrick // A collection of in-memory jitted object addresses and their corresponding 70061da546Spatrick // modules 71061da546Spatrick typedef std::map<lldb::addr_t, const lldb::ModuleSP> JITObjectMap; 72061da546Spatrick JITObjectMap m_jit_objects; 73061da546Spatrick 74061da546Spatrick lldb::user_id_t m_jit_break_id; 75061da546Spatrick lldb::addr_t m_jit_descriptor_addr; 76061da546Spatrick }; 77061da546Spatrick 78dda28197Spatrick #endif // LLDB_SOURCE_PLUGINS_JITLOADER_GDB_JITLOADERGDB_H 79