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"
14312b43daSMed Ismail Bennani #include "lldb/Utility/Status.h"
15312b43daSMed Ismail Bennani 
1659d8dd79SMed Ismail Bennani #include "ScriptedThread.h"
1759d8dd79SMed Ismail Bennani 
18312b43daSMed Ismail Bennani #include <mutex>
19312b43daSMed Ismail Bennani 
20312b43daSMed Ismail Bennani namespace lldb_private {
21312b43daSMed Ismail Bennani 
22312b43daSMed Ismail Bennani class ScriptedProcess : public Process {
23312b43daSMed Ismail Bennani protected:
24312b43daSMed Ismail Bennani   class ScriptedProcessInfo {
25312b43daSMed Ismail Bennani   public:
ScriptedProcessInfo(const ProcessLaunchInfo & launch_info)26312b43daSMed Ismail Bennani     ScriptedProcessInfo(const ProcessLaunchInfo &launch_info) {
27312b43daSMed Ismail Bennani       m_class_name = launch_info.GetScriptedProcessClassName();
28ad0f7d3dSMed Ismail Bennani       m_args_sp = launch_info.GetScriptedProcessDictionarySP();
29312b43daSMed Ismail Bennani     }
30312b43daSMed Ismail Bennani 
GetClassName()31312b43daSMed Ismail Bennani     std::string GetClassName() const { return m_class_name; }
GetArgsSP()32ad0f7d3dSMed Ismail Bennani     StructuredData::DictionarySP GetArgsSP() const { return m_args_sp; }
33312b43daSMed Ismail Bennani 
34312b43daSMed Ismail Bennani   private:
35312b43daSMed Ismail Bennani     std::string m_class_name;
36ad0f7d3dSMed Ismail Bennani     StructuredData::DictionarySP m_args_sp;
37312b43daSMed Ismail Bennani   };
38312b43daSMed Ismail Bennani 
39312b43daSMed Ismail Bennani public:
40312b43daSMed Ismail Bennani   static lldb::ProcessSP CreateInstance(lldb::TargetSP target_sp,
41312b43daSMed Ismail Bennani                                         lldb::ListenerSP listener_sp,
42312b43daSMed Ismail Bennani                                         const FileSpec *crash_file_path,
43312b43daSMed Ismail Bennani                                         bool can_connect);
44312b43daSMed Ismail Bennani 
45312b43daSMed Ismail Bennani   static void Initialize();
46312b43daSMed Ismail Bennani 
47312b43daSMed Ismail Bennani   static void Terminate();
48312b43daSMed Ismail Bennani 
GetPluginNameStatic()495f4980f0SPavel Labath   static llvm::StringRef GetPluginNameStatic() { return "ScriptedProcess"; }
50312b43daSMed Ismail Bennani 
515f4980f0SPavel Labath   static llvm::StringRef GetPluginDescriptionStatic();
52312b43daSMed Ismail Bennani 
53312b43daSMed Ismail Bennani   ScriptedProcess(lldb::TargetSP target_sp, lldb::ListenerSP listener_sp,
54312b43daSMed Ismail Bennani                   const ScriptedProcess::ScriptedProcessInfo &launch_info,
55312b43daSMed Ismail Bennani                   Status &error);
56312b43daSMed Ismail Bennani 
57312b43daSMed Ismail Bennani   ~ScriptedProcess() override;
58312b43daSMed Ismail Bennani 
59312b43daSMed Ismail Bennani   bool CanDebug(lldb::TargetSP target_sp,
60312b43daSMed Ismail Bennani                 bool plugin_specified_by_name) override;
61312b43daSMed Ismail Bennani 
GetDynamicLoader()62312b43daSMed Ismail Bennani   DynamicLoader *GetDynamicLoader() override { return nullptr; }
63312b43daSMed Ismail Bennani 
GetPluginName()645f4980f0SPavel Labath   llvm::StringRef GetPluginName() override { return GetPluginNameStatic(); }
65312b43daSMed Ismail Bennani 
GetSystemRuntime()66312b43daSMed Ismail Bennani   SystemRuntime *GetSystemRuntime() override { return nullptr; }
67312b43daSMed Ismail Bennani 
68312b43daSMed Ismail Bennani   Status DoLoadCore() override;
69312b43daSMed Ismail Bennani 
70312b43daSMed Ismail Bennani   Status DoLaunch(Module *exe_module, ProcessLaunchInfo &launch_info) override;
71312b43daSMed Ismail Bennani 
72312b43daSMed Ismail Bennani   void DidLaunch() override;
73312b43daSMed Ismail Bennani 
74312b43daSMed Ismail Bennani   Status DoResume() override;
75312b43daSMed Ismail Bennani 
76312b43daSMed Ismail Bennani   Status DoDestroy() override;
77312b43daSMed Ismail Bennani 
78676576b6SMed Ismail Bennani   void RefreshStateAfterStop() override;
79312b43daSMed Ismail Bennani 
80312b43daSMed Ismail Bennani   bool IsAlive() override;
81312b43daSMed Ismail Bennani 
82312b43daSMed Ismail Bennani   size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size,
83312b43daSMed Ismail Bennani                       Status &error) override;
84312b43daSMed Ismail Bennani 
85312b43daSMed Ismail Bennani   ArchSpec GetArchitecture();
86312b43daSMed Ismail Bennani 
87312b43daSMed Ismail Bennani   Status
88312b43daSMed Ismail Bennani   GetMemoryRegions(lldb_private::MemoryRegionInfos &region_list) override;
89312b43daSMed Ismail Bennani 
90312b43daSMed Ismail Bennani   bool GetProcessInfo(ProcessInstanceInfo &info) override;
91312b43daSMed Ismail Bennani 
92*680ca7f2SMed Ismail Bennani   lldb_private::StructuredData::ObjectSP
93*680ca7f2SMed Ismail Bennani   GetLoadedDynamicLibrariesInfos() override;
94*680ca7f2SMed Ismail Bennani 
95312b43daSMed Ismail Bennani protected:
96312b43daSMed Ismail Bennani   Status DoStop();
97312b43daSMed Ismail Bennani 
98312b43daSMed Ismail Bennani   void Clear();
99312b43daSMed Ismail Bennani 
100312b43daSMed Ismail Bennani   bool DoUpdateThreadList(ThreadList &old_thread_list,
101312b43daSMed Ismail Bennani                           ThreadList &new_thread_list) override;
102312b43daSMed Ismail Bennani 
1032937b282SDavid Spickett   Status DoGetMemoryRegionInfo(lldb::addr_t load_addr,
1042937b282SDavid Spickett                                MemoryRegionInfo &range_info) override;
1052937b282SDavid Spickett 
106312b43daSMed Ismail Bennani private:
10759d8dd79SMed Ismail Bennani   friend class ScriptedThread;
10859d8dd79SMed Ismail Bennani 
109312b43daSMed Ismail Bennani   void CheckInterpreterAndScriptObject() const;
110312b43daSMed Ismail Bennani   ScriptedProcessInterface &GetInterface() const;
111312b43daSMed Ismail Bennani   static bool IsScriptLanguageSupported(lldb::ScriptLanguage language);
112312b43daSMed Ismail Bennani 
113312b43daSMed Ismail Bennani   // Member variables.
114312b43daSMed Ismail Bennani   const ScriptedProcessInfo m_scripted_process_info;
115312b43daSMed Ismail Bennani   lldb_private::ScriptInterpreter *m_interpreter = nullptr;
116312b43daSMed Ismail Bennani   lldb_private::StructuredData::ObjectSP m_script_object_sp = nullptr;
117312b43daSMed Ismail Bennani   //@}
118312b43daSMed Ismail Bennani };
119312b43daSMed Ismail Bennani 
120312b43daSMed Ismail Bennani } // namespace lldb_private
121312b43daSMed Ismail Bennani 
122312b43daSMed Ismail Bennani #endif // LLDB_SOURCE_PLUGINS_SCRIPTED_PROCESS_H
123