1b3e77600SGreg Clayton //===-- OperatingSystemPython.cpp --------------------------------*- C++ -*-===// 2b3e77600SGreg Clayton // 3b3e77600SGreg Clayton // The LLVM Compiler Infrastructure 4b3e77600SGreg Clayton // 5b3e77600SGreg Clayton // This file is distributed under the University of Illinois Open Source 6b3e77600SGreg Clayton // License. See LICENSE.TXT for details. 7b3e77600SGreg Clayton // 8b3e77600SGreg Clayton //===----------------------------------------------------------------------===// 9b3e77600SGreg Clayton #ifndef LLDB_DISABLE_PYTHON 10b3e77600SGreg Clayton 11b3e77600SGreg Clayton #include "OperatingSystemPython.h" 12b3e77600SGreg Clayton // C Includes 13b3e77600SGreg Clayton // C++ Includes 14b3e77600SGreg Clayton // Other libraries and framework includes 15b3e77600SGreg Clayton #include "lldb/Core/ArchSpec.h" 16b3e77600SGreg Clayton #include "lldb/Core/DataBufferHeap.h" 175790759aSEnrico Granata #include "lldb/Core/Debugger.h" 18b3e77600SGreg Clayton #include "lldb/Core/Module.h" 19b3e77600SGreg Clayton #include "lldb/Core/PluginManager.h" 202443cbd7SGreg Clayton #include "lldb/Interpreter/PythonDataObjects.h" 21b3e77600SGreg Clayton #include "lldb/Core/RegisterValue.h" 22b3e77600SGreg Clayton #include "lldb/Core/ValueObjectVariable.h" 235790759aSEnrico Granata #include "lldb/Interpreter/CommandInterpreter.h" 245790759aSEnrico Granata #include "lldb/Interpreter/PythonDataObjects.h" 25b3e77600SGreg Clayton #include "lldb/Symbol/ClangNamespaceDecl.h" 26b3e77600SGreg Clayton #include "lldb/Symbol/ObjectFile.h" 27b3e77600SGreg Clayton #include "lldb/Symbol/VariableList.h" 28b3e77600SGreg Clayton #include "lldb/Target/Process.h" 29b3e77600SGreg Clayton #include "lldb/Target/StopInfo.h" 30b3e77600SGreg Clayton #include "lldb/Target/Target.h" 31b3e77600SGreg Clayton #include "lldb/Target/ThreadList.h" 32b3e77600SGreg Clayton #include "lldb/Target/Thread.h" 33b3e77600SGreg Clayton #include "Plugins/Process/Utility/DynamicRegisterInfo.h" 34b3e77600SGreg Clayton #include "Plugins/Process/Utility/RegisterContextMemory.h" 35b3e77600SGreg Clayton #include "Plugins/Process/Utility/ThreadMemory.h" 36b3e77600SGreg Clayton 37b3e77600SGreg Clayton using namespace lldb; 38b3e77600SGreg Clayton using namespace lldb_private; 39b3e77600SGreg Clayton 40b3e77600SGreg Clayton void 41b3e77600SGreg Clayton OperatingSystemPython::Initialize() 42b3e77600SGreg Clayton { 43b3e77600SGreg Clayton PluginManager::RegisterPlugin (GetPluginNameStatic(), 44b3e77600SGreg Clayton GetPluginDescriptionStatic(), 45b3e77600SGreg Clayton CreateInstance); 46b3e77600SGreg Clayton } 47b3e77600SGreg Clayton 48b3e77600SGreg Clayton void 49b3e77600SGreg Clayton OperatingSystemPython::Terminate() 50b3e77600SGreg Clayton { 51b3e77600SGreg Clayton PluginManager::UnregisterPlugin (CreateInstance); 52b3e77600SGreg Clayton } 53b3e77600SGreg Clayton 54b3e77600SGreg Clayton OperatingSystem * 55b3e77600SGreg Clayton OperatingSystemPython::CreateInstance (Process *process, bool force) 56b3e77600SGreg Clayton { 57b3e77600SGreg Clayton // Python OperatingSystem plug-ins must be requested by name, so force must be true 582443cbd7SGreg Clayton if (force) 59b3e77600SGreg Clayton return new OperatingSystemPython (process); 60b3e77600SGreg Clayton return NULL; 61b3e77600SGreg Clayton } 62b3e77600SGreg Clayton 63b3e77600SGreg Clayton 64b3e77600SGreg Clayton const char * 65b3e77600SGreg Clayton OperatingSystemPython::GetPluginNameStatic() 66b3e77600SGreg Clayton { 67b3e77600SGreg Clayton return "python"; 68b3e77600SGreg Clayton } 69b3e77600SGreg Clayton 70b3e77600SGreg Clayton const char * 71b3e77600SGreg Clayton OperatingSystemPython::GetPluginDescriptionStatic() 72b3e77600SGreg Clayton { 73b3e77600SGreg Clayton return "Operating system plug-in that gathers OS information from a python class that implements the necessary OperatingSystem functionality."; 74b3e77600SGreg Clayton } 75b3e77600SGreg Clayton 76b3e77600SGreg Clayton 77b3e77600SGreg Clayton OperatingSystemPython::OperatingSystemPython (lldb_private::Process *process) : 78b3e77600SGreg Clayton OperatingSystem (process), 79b3e77600SGreg Clayton m_thread_list_valobj_sp (), 805790759aSEnrico Granata m_register_info_ap (), 815790759aSEnrico Granata m_interpreter(NULL), 825790759aSEnrico Granata m_python_object(NULL) 83b3e77600SGreg Clayton { 845790759aSEnrico Granata if (!process) 855790759aSEnrico Granata return; 865790759aSEnrico Granata lldb::TargetSP target_sp = process->CalculateTarget(); 875790759aSEnrico Granata if (!target_sp) 885790759aSEnrico Granata return; 895790759aSEnrico Granata m_interpreter = target_sp->GetDebugger().GetCommandInterpreter().GetScriptInterpreter(); 905790759aSEnrico Granata if (m_interpreter) 915790759aSEnrico Granata { 925790759aSEnrico Granata // TODO: hardcoded is not good 935790759aSEnrico Granata auto object_sp = m_interpreter->CreateOSPlugin("operating_system.PlugIn",process->CalculateProcess()); 945790759aSEnrico Granata if (object_sp) 952443cbd7SGreg Clayton { 965790759aSEnrico Granata m_python_object = object_sp->GetObject(); 972443cbd7SGreg Clayton 98*a83b6cf2SGreg Clayton //GetDynamicRegisterInfo (); // COMMENT THIS LINE OUT PRIOR TO CHECKIN!!! 992443cbd7SGreg Clayton } 1005790759aSEnrico Granata } 101b3e77600SGreg Clayton } 102b3e77600SGreg Clayton 103b3e77600SGreg Clayton OperatingSystemPython::~OperatingSystemPython () 104b3e77600SGreg Clayton { 105b3e77600SGreg Clayton } 106b3e77600SGreg Clayton 107b3e77600SGreg Clayton DynamicRegisterInfo * 108b3e77600SGreg Clayton OperatingSystemPython::GetDynamicRegisterInfo () 109b3e77600SGreg Clayton { 1102443cbd7SGreg Clayton if (m_register_info_ap.get() == NULL) 1112443cbd7SGreg Clayton { 1125790759aSEnrico Granata if (!m_interpreter || !m_python_object) 1135790759aSEnrico Granata return NULL; 1145790759aSEnrico Granata auto object_sp = m_interpreter->OSPlugin_QueryForRegisterInfo(m_interpreter->MakeScriptObject(m_python_object)); 1155790759aSEnrico Granata if (!object_sp) 1165790759aSEnrico Granata return NULL; 1175790759aSEnrico Granata PythonDataObject dictionary_data_obj((PyObject*)object_sp->GetObject()); 1185790759aSEnrico Granata PythonDataDictionary dictionary = dictionary_data_obj.GetDictionaryObject(); 1195790759aSEnrico Granata if (!dictionary) 1205790759aSEnrico Granata return NULL; 121b3e77600SGreg Clayton 1222443cbd7SGreg Clayton m_register_info_ap.reset (new DynamicRegisterInfo (dictionary)); 1232443cbd7SGreg Clayton assert (m_register_info_ap->GetNumRegisters() > 0); 1242443cbd7SGreg Clayton assert (m_register_info_ap->GetNumRegisterSets() > 0); 125b3e77600SGreg Clayton } 126b3e77600SGreg Clayton return m_register_info_ap.get(); 127b3e77600SGreg Clayton } 128b3e77600SGreg Clayton 129b3e77600SGreg Clayton //------------------------------------------------------------------ 130b3e77600SGreg Clayton // PluginInterface protocol 131b3e77600SGreg Clayton //------------------------------------------------------------------ 132b3e77600SGreg Clayton const char * 133b3e77600SGreg Clayton OperatingSystemPython::GetPluginName() 134b3e77600SGreg Clayton { 135b3e77600SGreg Clayton return "OperatingSystemPython"; 136b3e77600SGreg Clayton } 137b3e77600SGreg Clayton 138b3e77600SGreg Clayton const char * 139b3e77600SGreg Clayton OperatingSystemPython::GetShortPluginName() 140b3e77600SGreg Clayton { 141b3e77600SGreg Clayton return GetPluginNameStatic(); 142b3e77600SGreg Clayton } 143b3e77600SGreg Clayton 144b3e77600SGreg Clayton uint32_t 145b3e77600SGreg Clayton OperatingSystemPython::GetPluginVersion() 146b3e77600SGreg Clayton { 147b3e77600SGreg Clayton return 1; 148b3e77600SGreg Clayton } 149b3e77600SGreg Clayton 150b3e77600SGreg Clayton bool 151b3e77600SGreg Clayton OperatingSystemPython::UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list) 152b3e77600SGreg Clayton { 1536167ab28SEnrico Granata 1546167ab28SEnrico Granata if (!m_interpreter || !m_python_object) 1556167ab28SEnrico Granata return NULL; 1566167ab28SEnrico Granata auto object_sp = m_interpreter->OSPlugin_QueryForThreadsInfo(m_interpreter->MakeScriptObject(m_python_object)); 1576167ab28SEnrico Granata if (!object_sp) 1586167ab28SEnrico Granata return NULL; 159*a83b6cf2SGreg Clayton PythonDataObject pyobj((PyObject*)object_sp->GetObject()); 160*a83b6cf2SGreg Clayton PythonDataArray array = pyobj.GetArrayObject(); 161*a83b6cf2SGreg Clayton if(!array) 1626167ab28SEnrico Granata return NULL; 1636167ab28SEnrico Granata 1646167ab28SEnrico Granata // TODO: read from the dict 1656167ab28SEnrico Granata 166b3e77600SGreg Clayton // and parse the returned dictionary. We need to pass in the a Dictionary 167b3e77600SGreg Clayton // with the same kind of info we want back so we can reuse old threads, but 168b3e77600SGreg Clayton // only create new ones. 169b3e77600SGreg Clayton 170b3e77600SGreg Clayton // Make any constant strings once and cache the uniqued C string values 171b3e77600SGreg Clayton // so we don't have to rehash them each time through this function call 172b3e77600SGreg Clayton // dict thread_info_dict = python.get_thread_info() 173b3e77600SGreg Clayton // for thread_info in thread_info_dict: 174b3e77600SGreg Clayton // { 175b3e77600SGreg Clayton // ThreadSP thread_sp (old_thread_list.FindThreadByID (tid, false)); 176b3e77600SGreg Clayton // if (!thread_sp) 177b3e77600SGreg Clayton // thread_sp.reset (new ThreadMemory (m_process->shared_from_this(), tid, valobj_sp)); 178b3e77600SGreg Clayton // new_thread_list.AddThread(thread_sp); 179b3e77600SGreg Clayton // } 180b3e77600SGreg Clayton new_thread_list = old_thread_list; 181b3e77600SGreg Clayton return new_thread_list.GetSize(false) > 0; 182b3e77600SGreg Clayton } 183b3e77600SGreg Clayton 184b3e77600SGreg Clayton void 185b3e77600SGreg Clayton OperatingSystemPython::ThreadWasSelected (Thread *thread) 186b3e77600SGreg Clayton { 187b3e77600SGreg Clayton } 188b3e77600SGreg Clayton 189b3e77600SGreg Clayton RegisterContextSP 190b3e77600SGreg Clayton OperatingSystemPython::CreateRegisterContextForThread (Thread *thread) 191b3e77600SGreg Clayton { 1926167ab28SEnrico Granata 1936167ab28SEnrico Granata if (!m_interpreter || !m_python_object || !thread) 1946167ab28SEnrico Granata return NULL; 1956167ab28SEnrico Granata auto object_sp = m_interpreter->OSPlugin_QueryForThreadInfo(m_interpreter->MakeScriptObject(m_python_object), 1966167ab28SEnrico Granata thread->GetID()); 1976167ab28SEnrico Granata if (!object_sp) 1986167ab28SEnrico Granata return NULL; 1996167ab28SEnrico Granata PythonDataObject pack_info_data_obj((PyObject*)object_sp->GetObject()); 2006167ab28SEnrico Granata if(!pack_info_data_obj) 2016167ab28SEnrico Granata return NULL; 2026167ab28SEnrico Granata 203b3e77600SGreg Clayton RegisterContextSP reg_ctx_sp; 204b3e77600SGreg Clayton // bytes b = get_register_context_data(thread) 205b3e77600SGreg Clayton // if (b) 206b3e77600SGreg Clayton // { 207b3e77600SGreg Clayton // reg_ctx_sp.reset (new RegisterContextMemory (*thread, 0, *GetDynamicRegisterInfo (), base_addr)); 208b3e77600SGreg Clayton // // set bytes 209b3e77600SGreg Clayton // } 210b3e77600SGreg Clayton return reg_ctx_sp; 211b3e77600SGreg Clayton } 212b3e77600SGreg Clayton 213b3e77600SGreg Clayton StopInfoSP 214b3e77600SGreg Clayton OperatingSystemPython::CreateThreadStopReason (lldb_private::Thread *thread) 215b3e77600SGreg Clayton { 216b3e77600SGreg Clayton // We should have gotten the thread stop info from the dictionary of data for 217b3e77600SGreg Clayton // the thread in the initial call to get_thread_info(), this should have been 218b3e77600SGreg Clayton // cached so we can return it here 219b3e77600SGreg Clayton StopInfoSP stop_info_sp; //(StopInfo::CreateStopReasonWithSignal (*thread, SIGSTOP)); 220b3e77600SGreg Clayton return stop_info_sp; 221b3e77600SGreg Clayton } 222b3e77600SGreg Clayton 223b3e77600SGreg Clayton 224b3e77600SGreg Clayton #endif // #ifndef LLDB_DISABLE_PYTHON 225