1312b43daSMed Ismail Bennani //===-- ScriptedProcess.h ------------------------------------- -*- C++ -*-===// 2312b43daSMed Ismail Bennani // 3312b43daSMed Ismail Bennani // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4312b43daSMed Ismail Bennani // See https://llvm.org/LICENSE.txt for license information. 5312b43daSMed Ismail Bennani // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6312b43daSMed Ismail Bennani // 7312b43daSMed Ismail Bennani //===----------------------------------------------------------------------===// 8312b43daSMed Ismail Bennani 9312b43daSMed Ismail Bennani #ifndef LLDB_SOURCE_PLUGINS_SCRIPTED_PROCESS_H 10312b43daSMed Ismail Bennani #define LLDB_SOURCE_PLUGINS_SCRIPTED_PROCESS_H 11312b43daSMed Ismail Bennani 12312b43daSMed Ismail Bennani #include "lldb/Target/Process.h" 13312b43daSMed Ismail Bennani #include "lldb/Utility/ConstString.h" 14601583e5SMed Ismail Bennani #include "lldb/Utility/ScriptedMetadata.h" 15*1f5f4169SMed Ismail Bennani #include "lldb/Utility/State.h" 16312b43daSMed Ismail Bennani #include "lldb/Utility/Status.h" 17312b43daSMed Ismail Bennani 1859d8dd79SMed Ismail Bennani #include "ScriptedThread.h" 1959d8dd79SMed Ismail Bennani 20312b43daSMed Ismail Bennani #include <mutex> 21312b43daSMed Ismail Bennani 22312b43daSMed Ismail Bennani namespace lldb_private { 23312b43daSMed Ismail Bennani class ScriptedProcess : public Process { 24312b43daSMed Ismail Bennani public: 25312b43daSMed Ismail Bennani static lldb::ProcessSP CreateInstance(lldb::TargetSP target_sp, 26312b43daSMed Ismail Bennani lldb::ListenerSP listener_sp, 27312b43daSMed Ismail Bennani const FileSpec *crash_file_path, 28312b43daSMed Ismail Bennani bool can_connect); 29312b43daSMed Ismail Bennani 30312b43daSMed Ismail Bennani static void Initialize(); 31312b43daSMed Ismail Bennani 32312b43daSMed Ismail Bennani static void Terminate(); 33312b43daSMed Ismail Bennani GetPluginNameStatic()345f4980f0SPavel Labath static llvm::StringRef GetPluginNameStatic() { return "ScriptedProcess"; } 35312b43daSMed Ismail Bennani 365f4980f0SPavel Labath static llvm::StringRef GetPluginDescriptionStatic(); 37312b43daSMed Ismail Bennani 38312b43daSMed Ismail Bennani ~ScriptedProcess() override; 39312b43daSMed Ismail Bennani 40312b43daSMed Ismail Bennani bool CanDebug(lldb::TargetSP target_sp, 41312b43daSMed Ismail Bennani bool plugin_specified_by_name) override; 42312b43daSMed Ismail Bennani GetDynamicLoader()43312b43daSMed Ismail Bennani DynamicLoader *GetDynamicLoader() override { return nullptr; } 44312b43daSMed Ismail Bennani GetPluginName()455f4980f0SPavel Labath llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); } 46312b43daSMed Ismail Bennani 47312b43daSMed Ismail Bennani Status DoLoadCore() override; 48312b43daSMed Ismail Bennani 49312b43daSMed Ismail Bennani Status DoLaunch(Module *exe_module, ProcessLaunchInfo &launch_info) override; 50312b43daSMed Ismail Bennani 519cbdfcdbSMed Ismail Bennani void DidLaunch() override; 529cbdfcdbSMed Ismail Bennani 5388f40919SJonas Devlieghere void DidResume() override; 54312b43daSMed Ismail Bennani 55312b43daSMed Ismail Bennani Status DoResume() override; 56312b43daSMed Ismail Bennani 57b9d4c94aSMed Ismail Bennani Status DoAttachToProcessWithID(lldb::pid_t pid, 58b9d4c94aSMed Ismail Bennani const ProcessAttachInfo &attach_info) override; 59b9d4c94aSMed Ismail Bennani 60b9d4c94aSMed Ismail Bennani Status 61b9d4c94aSMed Ismail Bennani DoAttachToProcessWithName(const char *process_name, 62b9d4c94aSMed Ismail Bennani const ProcessAttachInfo &attach_info) override; 63b9d4c94aSMed Ismail Bennani 64b9d4c94aSMed Ismail Bennani void DidAttach(ArchSpec &process_arch) override; 65b9d4c94aSMed Ismail Bennani 66312b43daSMed Ismail Bennani Status DoDestroy() override; 67312b43daSMed Ismail Bennani 68676576b6SMed Ismail Bennani void RefreshStateAfterStop() override; 69312b43daSMed Ismail Bennani 70312b43daSMed Ismail Bennani bool IsAlive() override; 71312b43daSMed Ismail Bennani 72312b43daSMed Ismail Bennani size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size, 73312b43daSMed Ismail Bennani Status &error) override; 74312b43daSMed Ismail Bennani 75f190ec68SMed Ismail Bennani size_t DoWriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size, 76f190ec68SMed Ismail Bennani Status &error) override; 77f190ec68SMed Ismail Bennani 78ad03aeadSMed Ismail Bennani Status EnableBreakpointSite(BreakpointSite *bp_site) override; 79ad03aeadSMed Ismail Bennani 80312b43daSMed Ismail Bennani ArchSpec GetArchitecture(); 81312b43daSMed Ismail Bennani 82312b43daSMed Ismail Bennani Status 83312b43daSMed Ismail Bennani GetMemoryRegions(lldb_private::MemoryRegionInfos ®ion_list) override; 84312b43daSMed Ismail Bennani 85312b43daSMed Ismail Bennani bool GetProcessInfo(ProcessInstanceInfo &info) override; 86312b43daSMed Ismail Bennani 87680ca7f2SMed Ismail Bennani lldb_private::StructuredData::ObjectSP 88680ca7f2SMed Ismail Bennani GetLoadedDynamicLibrariesInfos() override; 89680ca7f2SMed Ismail Bennani 9078d6e1d1SMed Ismail Bennani lldb_private::StructuredData::DictionarySP GetMetadata() override; 9178d6e1d1SMed Ismail Bennani 9244b81f62SMed Ismail Bennani void UpdateQueueListIfNeeded() override; 9344b81f62SMed Ismail Bennani 94c1928033SMed Ismail Bennani void *GetImplementation() override; 95c1928033SMed Ismail Bennani ForceScriptedState(lldb::StateType state)960d77e034SMed Ismail Bennani void ForceScriptedState(lldb::StateType state) override { 97*1f5f4169SMed Ismail Bennani // If we're about to stop, we should fetch the loaded dynamic libraries 98*1f5f4169SMed Ismail Bennani // dictionary before emitting the private stop event to avoid having the 99*1f5f4169SMed Ismail Bennani // module loading happen while the process state is changing. 100*1f5f4169SMed Ismail Bennani if (StateIsStoppedState(state, true)) 101*1f5f4169SMed Ismail Bennani GetLoadedDynamicLibrariesInfos(); 1020d77e034SMed Ismail Bennani SetPrivateState(state); 1030d77e034SMed Ismail Bennani } 1040d77e034SMed Ismail Bennani 105312b43daSMed Ismail Bennani protected: 1069b031d5eSMichał Górny ScriptedProcess(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp, 107d9f4d1b0SMed Ismail Bennani const ScriptedMetadata &scripted_metadata, Status &error); 1089b031d5eSMichał Górny 109312b43daSMed Ismail Bennani void Clear(); 110312b43daSMed Ismail Bennani 111312b43daSMed Ismail Bennani bool DoUpdateThreadList(ThreadList &old_thread_list, 112312b43daSMed Ismail Bennani ThreadList &new_thread_list) override; 113312b43daSMed Ismail Bennani 1142937b282SDavid Spickett Status DoGetMemoryRegionInfo(lldb::addr_t load_addr, 1152937b282SDavid Spickett MemoryRegionInfo &range_info) override; 1162937b282SDavid Spickett 117b9d4c94aSMed Ismail Bennani Status DoAttach(const ProcessAttachInfo &attach_info); 118b9d4c94aSMed Ismail Bennani 119312b43daSMed Ismail Bennani private: 12059d8dd79SMed Ismail Bennani friend class ScriptedThread; 12159d8dd79SMed Ismail Bennani CheckScriptedInterface()122a3d4f739SMed Ismail Bennani inline void CheckScriptedInterface() const { 123a3d4f739SMed Ismail Bennani lldbassert(m_interface_up && "Invalid scripted process interface."); 124a3d4f739SMed Ismail Bennani } 125a3d4f739SMed Ismail Bennani 126312b43daSMed Ismail Bennani ScriptedProcessInterface &GetInterface() const; 127312b43daSMed Ismail Bennani static bool IsScriptLanguageSupported(lldb::ScriptLanguage language); 128312b43daSMed Ismail Bennani 129312b43daSMed Ismail Bennani // Member variables. 130d9f4d1b0SMed Ismail Bennani const ScriptedMetadata m_scripted_metadata; 131a3d4f739SMed Ismail Bennani lldb::ScriptedProcessInterfaceUP m_interface_up; 132312b43daSMed Ismail Bennani }; 133312b43daSMed Ismail Bennani 134312b43daSMed Ismail Bennani } // namespace lldb_private 135312b43daSMed Ismail Bennani 136312b43daSMed Ismail Bennani #endif // LLDB_SOURCE_PLUGINS_SCRIPTED_PROCESS_H 137