1ab7f6d04SEugene Zelenko //===-- OperatingSystemPython.h ---------------------------------*- C++ -*-===//
2b3e77600SGreg Clayton //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6b3e77600SGreg Clayton //
7b3e77600SGreg Clayton //===----------------------------------------------------------------------===//
8b3e77600SGreg Clayton 
9b3e77600SGreg Clayton #ifndef liblldb_OperatingSystemPython_h_
10b3e77600SGreg Clayton #define liblldb_OperatingSystemPython_h_
11b3e77600SGreg Clayton 
12ab7f6d04SEugene Zelenko #ifndef LLDB_DISABLE_PYTHON
13ab7f6d04SEugene Zelenko 
14b3e77600SGreg Clayton #include "lldb/Target/OperatingSystem.h"
15f2a8bccfSPavel Labath #include "lldb/Utility/StructuredData.h"
16b3e77600SGreg Clayton 
17b3e77600SGreg Clayton class DynamicRegisterInfo;
18b3e77600SGreg Clayton 
19b9c1b51eSKate Stone namespace lldb_private {
200641ca1aSZachary Turner class ScriptInterpreter;
210641ca1aSZachary Turner }
220641ca1aSZachary Turner 
23b9c1b51eSKate Stone class OperatingSystemPython : public lldb_private::OperatingSystem {
24b3e77600SGreg Clayton public:
25ab7f6d04SEugene Zelenko   OperatingSystemPython(lldb_private::Process *process,
26ab7f6d04SEugene Zelenko                         const lldb_private::FileSpec &python_module_path);
27ab7f6d04SEugene Zelenko 
28ab7f6d04SEugene Zelenko   ~OperatingSystemPython() override;
29ab7f6d04SEugene Zelenko 
30b3e77600SGreg Clayton   //------------------------------------------------------------------
31b3e77600SGreg Clayton   // Static Functions
32b3e77600SGreg Clayton   //------------------------------------------------------------------
33b3e77600SGreg Clayton   static lldb_private::OperatingSystem *
34b3e77600SGreg Clayton   CreateInstance(lldb_private::Process *process, bool force);
35b3e77600SGreg Clayton 
36b9c1b51eSKate Stone   static void Initialize();
37b3e77600SGreg Clayton 
38b9c1b51eSKate Stone   static void Terminate();
39b3e77600SGreg Clayton 
40b9c1b51eSKate Stone   static lldb_private::ConstString GetPluginNameStatic();
41b3e77600SGreg Clayton 
42b9c1b51eSKate Stone   static const char *GetPluginDescriptionStatic();
43b3e77600SGreg Clayton 
44b3e77600SGreg Clayton   //------------------------------------------------------------------
45b3e77600SGreg Clayton   // lldb_private::PluginInterface Methods
46b3e77600SGreg Clayton   //------------------------------------------------------------------
47b9c1b51eSKate Stone   lldb_private::ConstString GetPluginName() override;
48b3e77600SGreg Clayton 
49b9c1b51eSKate Stone   uint32_t GetPluginVersion() override;
50b3e77600SGreg Clayton 
51b3e77600SGreg Clayton   //------------------------------------------------------------------
52b3e77600SGreg Clayton   // lldb_private::OperatingSystem Methods
53b3e77600SGreg Clayton   //------------------------------------------------------------------
54b9c1b51eSKate Stone   bool UpdateThreadList(lldb_private::ThreadList &old_thread_list,
55ba4e61d3SAndrew Kaylor                         lldb_private::ThreadList &real_thread_list,
56ab7f6d04SEugene Zelenko                         lldb_private::ThreadList &new_thread_list) override;
57b3e77600SGreg Clayton 
58b9c1b51eSKate Stone   void ThreadWasSelected(lldb_private::Thread *thread) override;
59b3e77600SGreg Clayton 
60ab7f6d04SEugene Zelenko   lldb::RegisterContextSP
61ead45e01SGreg Clayton   CreateRegisterContextForThread(lldb_private::Thread *thread,
62ab7f6d04SEugene Zelenko                                  lldb::addr_t reg_data_addr) override;
63b3e77600SGreg Clayton 
64ab7f6d04SEugene Zelenko   lldb::StopInfoSP
65ab7f6d04SEugene Zelenko   CreateThreadStopReason(lldb_private::Thread *thread) override;
66b3e77600SGreg Clayton 
67a4d8747dSGreg Clayton   //------------------------------------------------------------------
68a4d8747dSGreg Clayton   // Method for lazy creation of threads on demand
69a4d8747dSGreg Clayton   //------------------------------------------------------------------
70b9c1b51eSKate Stone   lldb::ThreadSP CreateThread(lldb::tid_t tid, lldb::addr_t context) override;
71a4d8747dSGreg Clayton 
72b3e77600SGreg Clayton protected:
73b9c1b51eSKate Stone   bool IsValid() const {
740641ca1aSZachary Turner     return m_python_object_sp && m_python_object_sp->IsValid();
75c9d645d3SGreg Clayton   }
76a4d8747dSGreg Clayton 
77b9c1b51eSKate Stone   lldb::ThreadSP CreateThreadFromThreadInfo(
78b9c1b51eSKate Stone       lldb_private::StructuredData::Dictionary &thread_dict,
79b9c1b51eSKate Stone       lldb_private::ThreadList &core_thread_list,
80b9c1b51eSKate Stone       lldb_private::ThreadList &old_thread_list,
810641ca1aSZachary Turner       std::vector<bool> &core_used_map, bool *did_create_ptr);
82a4d8747dSGreg Clayton 
83b9c1b51eSKate Stone   DynamicRegisterInfo *GetDynamicRegisterInfo();
84b3e77600SGreg Clayton 
85b3e77600SGreg Clayton   lldb::ValueObjectSP m_thread_list_valobj_sp;
86*d5b44036SJonas Devlieghere   std::unique_ptr<DynamicRegisterInfo> m_register_info_up;
875790759aSEnrico Granata   lldb_private::ScriptInterpreter *m_interpreter;
880641ca1aSZachary Turner   lldb_private::StructuredData::ObjectSP m_python_object_sp;
89b3e77600SGreg Clayton };
90b3e77600SGreg Clayton 
91ab7f6d04SEugene Zelenko #endif // LLDB_DISABLE_PYTHON
92ab7f6d04SEugene Zelenko 
93ab7f6d04SEugene Zelenko #endif // liblldb_OperatingSystemPython_h_
94