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