OperatingSystemPython.cpp revision 91a9f2127fa8b8e90f6ea1676d11f97f44ce22dd
1d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton//===-- OperatingSystemPython.cpp --------------------------------*- C++ -*-===//
2d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton//
3d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton//                     The LLVM Compiler Infrastructure
4d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton//
5d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton// This file is distributed under the University of Illinois Open Source
6d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton// License. See LICENSE.TXT for details.
7d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton//
8d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton//===----------------------------------------------------------------------===//
9d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#ifndef LLDB_DISABLE_PYTHON
10d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton
11d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "OperatingSystemPython.h"
12d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton// C Includes
13d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton// C++ Includes
14d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton// Other libraries and framework includes
15d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Core/ArchSpec.h"
16d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Core/DataBufferHeap.h"
17155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata#include "lldb/Core/Debugger.h"
18d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Core/Module.h"
19d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Core/PluginManager.h"
2088b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton#include "lldb/Interpreter/PythonDataObjects.h"
21d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Core/RegisterValue.h"
22d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Core/ValueObjectVariable.h"
23155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata#include "lldb/Interpreter/CommandInterpreter.h"
24155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata#include "lldb/Interpreter/PythonDataObjects.h"
25d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Symbol/ClangNamespaceDecl.h"
26d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Symbol/ObjectFile.h"
27d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Symbol/VariableList.h"
28d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Target/Process.h"
29d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Target/StopInfo.h"
30d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Target/Target.h"
31d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Target/ThreadList.h"
32d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "lldb/Target/Thread.h"
33d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "Plugins/Process/Utility/DynamicRegisterInfo.h"
34d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "Plugins/Process/Utility/RegisterContextMemory.h"
35d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#include "Plugins/Process/Utility/ThreadMemory.h"
36d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton
37d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Claytonusing namespace lldb;
38d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Claytonusing namespace lldb_private;
39d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton
40d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Claytonvoid
41d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::Initialize()
42d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{
43d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton    PluginManager::RegisterPlugin (GetPluginNameStatic(),
44d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton                                   GetPluginDescriptionStatic(),
45d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton                                   CreateInstance);
46d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton}
47d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton
48d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Claytonvoid
49d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::Terminate()
50d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{
51d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton    PluginManager::UnregisterPlugin (CreateInstance);
52d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton}
53d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton
54d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystem *
55d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::CreateInstance (Process *process, bool force)
56d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{
57d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton    // Python OperatingSystem plug-ins must be requested by name, so force must be true
582e7f313dc473b036788319690116b324cb44b765Greg Clayton    FileSpec python_os_plugin_spec (process->GetPythonOSPluginPath());
592e7f313dc473b036788319690116b324cb44b765Greg Clayton    if (python_os_plugin_spec && python_os_plugin_spec.Exists())
602e7f313dc473b036788319690116b324cb44b765Greg Clayton    {
612e7f313dc473b036788319690116b324cb44b765Greg Clayton        std::auto_ptr<OperatingSystemPython> os_ap (new OperatingSystemPython (process, python_os_plugin_spec));
622e7f313dc473b036788319690116b324cb44b765Greg Clayton        if (os_ap.get() && os_ap->IsValid())
632e7f313dc473b036788319690116b324cb44b765Greg Clayton            return os_ap.release();
642e7f313dc473b036788319690116b324cb44b765Greg Clayton    }
65d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton    return NULL;
66d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton}
67d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton
68d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton
69d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Claytonconst char *
70d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::GetPluginNameStatic()
71d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{
72d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton    return "python";
73d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton}
74d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton
75d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Claytonconst char *
76d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::GetPluginDescriptionStatic()
77d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{
78d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton    return "Operating system plug-in that gathers OS information from a python class that implements the necessary OperatingSystem functionality.";
79d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton}
80d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton
81d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton
822e7f313dc473b036788319690116b324cb44b765Greg ClaytonOperatingSystemPython::OperatingSystemPython (lldb_private::Process *process, const FileSpec &python_module_path) :
83d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton    OperatingSystem (process),
84d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton    m_thread_list_valobj_sp (),
85155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata    m_register_info_ap (),
862e7f313dc473b036788319690116b324cb44b765Greg Clayton    m_interpreter (NULL),
872e7f313dc473b036788319690116b324cb44b765Greg Clayton    m_python_object (NULL)
88d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{
89155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata    if (!process)
90155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata        return;
91155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata    lldb::TargetSP target_sp = process->CalculateTarget();
92155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata    if (!target_sp)
93155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata        return;
94155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata    m_interpreter = target_sp->GetDebugger().GetCommandInterpreter().GetScriptInterpreter();
95155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata    if (m_interpreter)
96155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata    {
972e7f313dc473b036788319690116b324cb44b765Greg Clayton
982e7f313dc473b036788319690116b324cb44b765Greg Clayton        std::string os_plugin_class_name (python_module_path.GetFilename().AsCString(""));
992e7f313dc473b036788319690116b324cb44b765Greg Clayton        if (!os_plugin_class_name.empty())
10088b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton        {
1012e7f313dc473b036788319690116b324cb44b765Greg Clayton            const bool init_session = false;
1022e7f313dc473b036788319690116b324cb44b765Greg Clayton            const bool allow_reload = true;
1032e7f313dc473b036788319690116b324cb44b765Greg Clayton            char python_module_path_cstr[PATH_MAX];
1042e7f313dc473b036788319690116b324cb44b765Greg Clayton            python_module_path.GetPath(python_module_path_cstr, sizeof(python_module_path_cstr));
1052e7f313dc473b036788319690116b324cb44b765Greg Clayton            Error error;
1062e7f313dc473b036788319690116b324cb44b765Greg Clayton            if (m_interpreter->LoadScriptingModule (python_module_path_cstr, allow_reload, init_session, error))
1072e7f313dc473b036788319690116b324cb44b765Greg Clayton            {
1082e7f313dc473b036788319690116b324cb44b765Greg Clayton                // Strip the ".py" extension if there is one
1092e7f313dc473b036788319690116b324cb44b765Greg Clayton                size_t py_extension_pos = os_plugin_class_name.rfind(".py");
1102e7f313dc473b036788319690116b324cb44b765Greg Clayton                if (py_extension_pos != std::string::npos)
1112e7f313dc473b036788319690116b324cb44b765Greg Clayton                    os_plugin_class_name.erase (py_extension_pos);
1122e7f313dc473b036788319690116b324cb44b765Greg Clayton                // Add ".OperatingSystemPlugIn" to the module name to get a string like "modulename.OperatingSystemPlugIn"
1132e7f313dc473b036788319690116b324cb44b765Greg Clayton                os_plugin_class_name += ".OperatingSystemPlugIn";
1142e7f313dc473b036788319690116b324cb44b765Greg Clayton                auto object_sp = m_interpreter->CreateOSPlugin(os_plugin_class_name.c_str(), process->CalculateProcess());
1152e7f313dc473b036788319690116b324cb44b765Greg Clayton                if (object_sp)
1162e7f313dc473b036788319690116b324cb44b765Greg Clayton                    m_python_object = object_sp->GetObject();
1172e7f313dc473b036788319690116b324cb44b765Greg Clayton            }
11888b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton        }
119155ee91cc315888c26de1bfebd876bf35b857329Enrico Granata    }
120d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton}
121d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton
122d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::~OperatingSystemPython ()
123d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{
124d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton}
125d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton
126d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonDynamicRegisterInfo *
127d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::GetDynamicRegisterInfo ()
128d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{
12988b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton    if (m_register_info_ap.get() == NULL)
130d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton    {
13188b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton        if (!m_interpreter || !m_python_object)
13288b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton            return NULL;
133467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton        LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
134467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton
135467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton        if (log)
136467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton            log->Printf ("OperatingSystemPython::GetDynamicRegisterInfo() fetching thread register definitions from python for pid %llu", m_process->GetID());
137467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton
13888b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton        auto object_sp = m_interpreter->OSPlugin_QueryForRegisterInfo(m_interpreter->MakeScriptObject(m_python_object));
13988b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton        if (!object_sp)
14088b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton            return NULL;
14188b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton        PythonDataObject dictionary_data_obj((PyObject*)object_sp->GetObject());
14288b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton        PythonDataDictionary dictionary = dictionary_data_obj.GetDictionaryObject();
14388b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton        if (!dictionary)
14488b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton            return NULL;
14588b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton
14688b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton        m_register_info_ap.reset (new DynamicRegisterInfo (dictionary));
14788b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton        assert (m_register_info_ap->GetNumRegisters() > 0);
14888b980bfd735c4691b7f0771a45a78cb75033564Greg Clayton        assert (m_register_info_ap->GetNumRegisterSets() > 0);
149d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton    }
150d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton    return m_register_info_ap.get();
151d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton}
152d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton
153d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton//------------------------------------------------------------------
154d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton// PluginInterface protocol
155d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton//------------------------------------------------------------------
156d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Claytonconst char *
157d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::GetPluginName()
158d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{
159d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton    return "OperatingSystemPython";
160d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton}
161d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton
162d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Claytonconst char *
163d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::GetShortPluginName()
164d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{
165d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton    return GetPluginNameStatic();
166d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton}
167d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton
168d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Claytonuint32_t
169d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::GetPluginVersion()
170d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{
171d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton    return 1;
172d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton}
173d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton
174d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Claytonbool
175d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list)
176d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{
1773e85b6378d312866ab25eb5623d9b8253bc498f8Enrico Granata    if (!m_interpreter || !m_python_object)
1783e85b6378d312866ab25eb5623d9b8253bc498f8Enrico Granata        return NULL;
179467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton
180467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
181467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton
182467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton    if (log)
183467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton        log->Printf ("OperatingSystemPython::UpdateThreadList() fetching thread data from python for pid %llu", m_process->GetID());
184467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton
1853e85b6378d312866ab25eb5623d9b8253bc498f8Enrico Granata    auto object_sp = m_interpreter->OSPlugin_QueryForThreadsInfo(m_interpreter->MakeScriptObject(m_python_object));
1863e85b6378d312866ab25eb5623d9b8253bc498f8Enrico Granata    if (!object_sp)
1873e85b6378d312866ab25eb5623d9b8253bc498f8Enrico Granata        return NULL;
188a63665a17f889d69384abc82311c671b9809419cGreg Clayton    PythonDataObject pyobj((PyObject*)object_sp->GetObject());
189b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton    PythonDataArray threads_array (pyobj.GetArrayObject());
190b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton    if (threads_array)
191b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton    {
192b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton//        const uint32_t num_old_threads = old_thread_list.GetSize(false);
193b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton//        for (uint32_t i=0; i<num_old_threads; ++i)
194b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton//        {
195b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton//            ThreadSP old_thread_sp(old_thread_list.GetThreadAtIndex(i, false));
196b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton//            if (old_thread_sp->GetID() < 0x10000)
197b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton//                new_thread_list.AddThread (old_thread_sp);
198b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton//        }
199b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton
200b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton        PythonDataString tid_pystr("tid");
201b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton        PythonDataString name_pystr("name");
202b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton        PythonDataString queue_pystr("queue");
203b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton        PythonDataString state_pystr("state");
204b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton        PythonDataString stop_reason_pystr("stop_reason");
20591a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton        PythonDataString reg_data_addr_pystr ("register_data_addr");
206b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton
207b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton        const uint32_t num_threads = threads_array.GetSize();
208b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton        for (uint32_t i=0; i<num_threads; ++i)
209b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton        {
210b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton            PythonDataDictionary thread_dict(threads_array.GetItemAtIndex(i).GetDictionaryObject());
211b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton            if (thread_dict)
212b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton            {
21391a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton                const tid_t tid = thread_dict.GetItemForKeyAsInteger (tid_pystr, LLDB_INVALID_THREAD_ID);
21491a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton                const addr_t reg_data_addr = thread_dict.GetItemForKeyAsInteger (reg_data_addr_pystr, LLDB_INVALID_ADDRESS);
215b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton                const char *name = thread_dict.GetItemForKeyAsString (name_pystr);
216b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton                const char *queue = thread_dict.GetItemForKeyAsString (queue_pystr);
217b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton                //const char *state = thread_dict.GetItemForKeyAsString (state_pystr);
218b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton                //const char *stop_reason = thread_dict.GetItemForKeyAsString (stop_reason_pystr);
219b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton
220b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton                ThreadSP thread_sp (old_thread_list.FindThreadByID (tid, false));
221b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton                if (!thread_sp)
22294a5d0de4433dce556db59758f3d6124eb0e1a2aJim Ingham                    thread_sp.reset (new ThreadMemory (*m_process,
223b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton                                                       tid,
224b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton                                                       name,
22591a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton                                                       queue,
22691a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton                                                       reg_data_addr));
227b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton                new_thread_list.AddThread(thread_sp);
228b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton
229b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton            }
230b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton        }
231b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton    }
232b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton    else
233b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton    {
234b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton        new_thread_list = old_thread_list;
235b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton    }
236d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton    return new_thread_list.GetSize(false) > 0;
237d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton}
238d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton
239d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Claytonvoid
240d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::ThreadWasSelected (Thread *thread)
241d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{
242d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton}
243d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton
244d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonRegisterContextSP
24591a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg ClaytonOperatingSystemPython::CreateRegisterContextForThread (Thread *thread, lldb::addr_t reg_data_addr)
246d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{
247b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton    RegisterContextSP reg_ctx_sp;
2483e85b6378d312866ab25eb5623d9b8253bc498f8Enrico Granata    if (!m_interpreter || !m_python_object || !thread)
249915da3534f6024d9983e0ba94142936df8745562Filipe Cabecinhas        return RegisterContextSP();
250467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton
251467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton    LogSP log(lldb_private::GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD));
252467e1ea328873763db41d47196b4ecd56cdde11bGreg Clayton
25391a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton    if (reg_data_addr != LLDB_INVALID_ADDRESS)
254b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton    {
25591a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton        // The registers data is in contiguous memory, just create the register
25691a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton        // context using the address provided
25791a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton        if (log)
25891a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton            log->Printf ("OperatingSystemPython::CreateRegisterContextForThread (tid = 0x%llx, reg_data_addr = 0x%llx) creating memory register context", thread->GetID(), reg_data_addr);
25991a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton        reg_ctx_sp.reset (new RegisterContextMemory (*thread, 0, *GetDynamicRegisterInfo (), reg_data_addr));
26091a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton    }
26191a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton    else
26291a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton    {
26391a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton        // No register data address is provided, query the python plug-in to let
26491a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton        // it make up the data as it sees fit
26591a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton        if (log)
26691a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton            log->Printf ("OperatingSystemPython::CreateRegisterContextForThread (tid = 0x%llx) fetching register data from python", thread->GetID());
26791a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton
26891a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton        auto object_sp = m_interpreter->OSPlugin_QueryForRegisterContextData (m_interpreter->MakeScriptObject(m_python_object),
26991a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton                                                                              thread->GetID());
27091a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton
27191a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton        if (!object_sp)
27291a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton            return RegisterContextSP();
27391a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton
27491a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton        PythonDataString reg_context_data((PyObject*)object_sp->GetObject());
27591a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton        if (reg_context_data)
276b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton        {
27791a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton            DataBufferSP data_sp (new DataBufferHeap (reg_context_data.GetString(),
27891a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton                                                      reg_context_data.GetSize()));
27991a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton            if (data_sp->GetByteSize())
280b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton            {
28191a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton                RegisterContextMemory *reg_ctx_memory = new RegisterContextMemory (*thread, 0, *GetDynamicRegisterInfo (), LLDB_INVALID_ADDRESS);
28291a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton                if (reg_ctx_memory)
28391a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton                {
28491a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton                    reg_ctx_sp.reset(reg_ctx_memory);
28591a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton                    reg_ctx_memory->SetAllRegisterData (data_sp);
28691a9f2127fa8b8e90f6ea1676d11f97f44ce22ddGreg Clayton                }
287b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton            }
288b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton        }
289b8f126a807c00e5c2d0e7faaf764c38072cd6764Greg Clayton    }
290d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton    return reg_ctx_sp;
291d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton}
292d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton
293d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonStopInfoSP
294d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg ClaytonOperatingSystemPython::CreateThreadStopReason (lldb_private::Thread *thread)
295d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton{
296d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton    // We should have gotten the thread stop info from the dictionary of data for
297d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton    // the thread in the initial call to get_thread_info(), this should have been
298d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton    // cached so we can return it here
299d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton    StopInfoSP stop_info_sp; //(StopInfo::CreateStopReasonWithSignal (*thread, SIGSTOP));
300d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton    return stop_info_sp;
301d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton}
302d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton
303d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton
304d815ded12b0c9fea2c8a38cc241d3609b3fe228aGreg Clayton#endif // #ifndef LLDB_DISABLE_PYTHON
305