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