xref: /freebsd-src/contrib/llvm-project/lldb/source/Plugins/Process/scripted/ScriptedProcess.h (revision fe6060f10f634930ff71b7c50291ddc610da2475)
1*fe6060f1SDimitry Andric //===-- ScriptedProcess.h ------------------------------------- -*- C++ -*-===//
2*fe6060f1SDimitry Andric //
3*fe6060f1SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*fe6060f1SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
5*fe6060f1SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*fe6060f1SDimitry Andric //
7*fe6060f1SDimitry Andric //===----------------------------------------------------------------------===//
8*fe6060f1SDimitry Andric 
9*fe6060f1SDimitry Andric #ifndef LLDB_SOURCE_PLUGINS_SCRIPTED_PROCESS_H
10*fe6060f1SDimitry Andric #define LLDB_SOURCE_PLUGINS_SCRIPTED_PROCESS_H
11*fe6060f1SDimitry Andric 
12*fe6060f1SDimitry Andric #include "lldb/Target/Process.h"
13*fe6060f1SDimitry Andric #include "lldb/Utility/ConstString.h"
14*fe6060f1SDimitry Andric #include "lldb/Utility/Status.h"
15*fe6060f1SDimitry Andric 
16*fe6060f1SDimitry Andric #include <mutex>
17*fe6060f1SDimitry Andric 
18*fe6060f1SDimitry Andric namespace lldb_private {
19*fe6060f1SDimitry Andric 
20*fe6060f1SDimitry Andric class ScriptedProcess : public Process {
21*fe6060f1SDimitry Andric protected:
22*fe6060f1SDimitry Andric   class ScriptedProcessInfo {
23*fe6060f1SDimitry Andric   public:
24*fe6060f1SDimitry Andric     ScriptedProcessInfo(const ProcessLaunchInfo &launch_info) {
25*fe6060f1SDimitry Andric       m_class_name = launch_info.GetScriptedProcessClassName();
26*fe6060f1SDimitry Andric       m_dictionary_sp = launch_info.GetScriptedProcessDictionarySP();
27*fe6060f1SDimitry Andric     }
28*fe6060f1SDimitry Andric 
29*fe6060f1SDimitry Andric     std::string GetClassName() const { return m_class_name; }
30*fe6060f1SDimitry Andric     StructuredData::DictionarySP GetDictionarySP() const {
31*fe6060f1SDimitry Andric       return m_dictionary_sp;
32*fe6060f1SDimitry Andric     }
33*fe6060f1SDimitry Andric 
34*fe6060f1SDimitry Andric   private:
35*fe6060f1SDimitry Andric     std::string m_class_name;
36*fe6060f1SDimitry Andric     StructuredData::DictionarySP m_dictionary_sp;
37*fe6060f1SDimitry Andric   };
38*fe6060f1SDimitry Andric 
39*fe6060f1SDimitry Andric public:
40*fe6060f1SDimitry Andric   static lldb::ProcessSP CreateInstance(lldb::TargetSP target_sp,
41*fe6060f1SDimitry Andric                                         lldb::ListenerSP listener_sp,
42*fe6060f1SDimitry Andric                                         const FileSpec *crash_file_path,
43*fe6060f1SDimitry Andric                                         bool can_connect);
44*fe6060f1SDimitry Andric 
45*fe6060f1SDimitry Andric   static void Initialize();
46*fe6060f1SDimitry Andric 
47*fe6060f1SDimitry Andric   static void Terminate();
48*fe6060f1SDimitry Andric 
49*fe6060f1SDimitry Andric   static ConstString GetPluginNameStatic();
50*fe6060f1SDimitry Andric 
51*fe6060f1SDimitry Andric   static const char *GetPluginDescriptionStatic();
52*fe6060f1SDimitry Andric 
53*fe6060f1SDimitry Andric   ScriptedProcess(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp,
54*fe6060f1SDimitry Andric                   const ScriptedProcess::ScriptedProcessInfo &launch_info,
55*fe6060f1SDimitry Andric                   Status &error);
56*fe6060f1SDimitry Andric 
57*fe6060f1SDimitry Andric   ~ScriptedProcess() override;
58*fe6060f1SDimitry Andric 
59*fe6060f1SDimitry Andric   bool CanDebug(lldb::TargetSP target_sp,
60*fe6060f1SDimitry Andric                 bool plugin_specified_by_name) override;
61*fe6060f1SDimitry Andric 
62*fe6060f1SDimitry Andric   DynamicLoader *GetDynamicLoader() override { return nullptr; }
63*fe6060f1SDimitry Andric 
64*fe6060f1SDimitry Andric   ConstString GetPluginName() override;
65*fe6060f1SDimitry Andric 
66*fe6060f1SDimitry Andric   uint32_t GetPluginVersion() override;
67*fe6060f1SDimitry Andric 
68*fe6060f1SDimitry Andric   SystemRuntime *GetSystemRuntime() override { return nullptr; }
69*fe6060f1SDimitry Andric 
70*fe6060f1SDimitry Andric   Status DoLoadCore() override;
71*fe6060f1SDimitry Andric 
72*fe6060f1SDimitry Andric   Status DoLaunch(Module *exe_module, ProcessLaunchInfo &launch_info) override;
73*fe6060f1SDimitry Andric 
74*fe6060f1SDimitry Andric   void DidLaunch() override;
75*fe6060f1SDimitry Andric 
76*fe6060f1SDimitry Andric   Status DoResume() override;
77*fe6060f1SDimitry Andric 
78*fe6060f1SDimitry Andric   Status DoDestroy() override;
79*fe6060f1SDimitry Andric 
80*fe6060f1SDimitry Andric   void RefreshStateAfterStop() override{};
81*fe6060f1SDimitry Andric 
82*fe6060f1SDimitry Andric   bool IsAlive() override;
83*fe6060f1SDimitry Andric 
84*fe6060f1SDimitry Andric   size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size,
85*fe6060f1SDimitry Andric                       Status &error) override;
86*fe6060f1SDimitry Andric 
87*fe6060f1SDimitry Andric   ArchSpec GetArchitecture();
88*fe6060f1SDimitry Andric 
89*fe6060f1SDimitry Andric   Status GetMemoryRegionInfo(lldb::addr_t load_addr,
90*fe6060f1SDimitry Andric                              MemoryRegionInfo &range_info) override;
91*fe6060f1SDimitry Andric 
92*fe6060f1SDimitry Andric   Status
93*fe6060f1SDimitry Andric   GetMemoryRegions(lldb_private::MemoryRegionInfos &region_list) override;
94*fe6060f1SDimitry Andric 
95*fe6060f1SDimitry Andric   bool GetProcessInfo(ProcessInstanceInfo &info) override;
96*fe6060f1SDimitry Andric 
97*fe6060f1SDimitry Andric protected:
98*fe6060f1SDimitry Andric   Status DoStop();
99*fe6060f1SDimitry Andric 
100*fe6060f1SDimitry Andric   void Clear();
101*fe6060f1SDimitry Andric 
102*fe6060f1SDimitry Andric   bool DoUpdateThreadList(ThreadList &old_thread_list,
103*fe6060f1SDimitry Andric                           ThreadList &new_thread_list) override;
104*fe6060f1SDimitry Andric 
105*fe6060f1SDimitry Andric private:
106*fe6060f1SDimitry Andric   void CheckInterpreterAndScriptObject() const;
107*fe6060f1SDimitry Andric   ScriptedProcessInterface &GetInterface() const;
108*fe6060f1SDimitry Andric   static bool IsScriptLanguageSupported(lldb::ScriptLanguage language);
109*fe6060f1SDimitry Andric 
110*fe6060f1SDimitry Andric   // Member variables.
111*fe6060f1SDimitry Andric   const ScriptedProcessInfo m_scripted_process_info;
112*fe6060f1SDimitry Andric   lldb_private::ScriptInterpreter *m_interpreter = nullptr;
113*fe6060f1SDimitry Andric   lldb_private::StructuredData::ObjectSP m_script_object_sp = nullptr;
114*fe6060f1SDimitry Andric   //@}
115*fe6060f1SDimitry Andric };
116*fe6060f1SDimitry Andric 
117*fe6060f1SDimitry Andric } // namespace lldb_private
118*fe6060f1SDimitry Andric 
119*fe6060f1SDimitry Andric #endif // LLDB_SOURCE_PLUGINS_SCRIPTED_PROCESS_H
120