xref: /llvm-project/lldb/source/Plugins/Process/scripted/ScriptedProcess.h (revision 1f5f4169c427c51c6919e0013c89a191dba564e8)
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 &region_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