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