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 "llvm/ADT/Triple.h" 16b3e77600SGreg Clayton 17b3e77600SGreg Clayton #include "lldb/Core/ArchSpec.h" 18b3e77600SGreg Clayton #include "lldb/Core/DataBufferHeap.h" 19*5790759aSEnrico Granata #include "lldb/Core/Debugger.h" 20b3e77600SGreg Clayton #include "lldb/Core/Module.h" 21b3e77600SGreg Clayton #include "lldb/Core/PluginManager.h" 22b3e77600SGreg Clayton #include "lldb/Core/RegisterValue.h" 23b3e77600SGreg Clayton #include "lldb/Core/ValueObjectVariable.h" 24*5790759aSEnrico Granata #include "lldb/Interpreter/CommandInterpreter.h" 25*5790759aSEnrico Granata #include "lldb/Interpreter/PythonDataObjects.h" 26b3e77600SGreg Clayton #include "lldb/Symbol/ClangNamespaceDecl.h" 27b3e77600SGreg Clayton #include "lldb/Symbol/ObjectFile.h" 28b3e77600SGreg Clayton #include "lldb/Symbol/VariableList.h" 29b3e77600SGreg Clayton #include "lldb/Target/Process.h" 30b3e77600SGreg Clayton #include "lldb/Target/StopInfo.h" 31b3e77600SGreg Clayton #include "lldb/Target/Target.h" 32b3e77600SGreg Clayton #include "lldb/Target/ThreadList.h" 33b3e77600SGreg Clayton #include "lldb/Target/Thread.h" 34b3e77600SGreg Clayton #include "Plugins/Process/Utility/DynamicRegisterInfo.h" 35b3e77600SGreg Clayton #include "Plugins/Process/Utility/RegisterContextMemory.h" 36b3e77600SGreg Clayton #include "Plugins/Process/Utility/ThreadMemory.h" 37b3e77600SGreg Clayton 38b3e77600SGreg Clayton using namespace lldb; 39b3e77600SGreg Clayton using namespace lldb_private; 40b3e77600SGreg Clayton 41b3e77600SGreg Clayton void 42b3e77600SGreg Clayton OperatingSystemPython::Initialize() 43b3e77600SGreg Clayton { 44b3e77600SGreg Clayton PluginManager::RegisterPlugin (GetPluginNameStatic(), 45b3e77600SGreg Clayton GetPluginDescriptionStatic(), 46b3e77600SGreg Clayton CreateInstance); 47b3e77600SGreg Clayton } 48b3e77600SGreg Clayton 49b3e77600SGreg Clayton void 50b3e77600SGreg Clayton OperatingSystemPython::Terminate() 51b3e77600SGreg Clayton { 52b3e77600SGreg Clayton PluginManager::UnregisterPlugin (CreateInstance); 53b3e77600SGreg Clayton } 54b3e77600SGreg Clayton 55b3e77600SGreg Clayton OperatingSystem * 56b3e77600SGreg Clayton OperatingSystemPython::CreateInstance (Process *process, bool force) 57b3e77600SGreg Clayton { 58b3e77600SGreg Clayton // Python OperatingSystem plug-ins must be requested by name, so force must be true 59*5790759aSEnrico Granata //if (force) 60b3e77600SGreg Clayton return new OperatingSystemPython (process); 61b3e77600SGreg Clayton return NULL; 62b3e77600SGreg Clayton } 63b3e77600SGreg Clayton 64b3e77600SGreg Clayton 65b3e77600SGreg Clayton const char * 66b3e77600SGreg Clayton OperatingSystemPython::GetPluginNameStatic() 67b3e77600SGreg Clayton { 68b3e77600SGreg Clayton return "python"; 69b3e77600SGreg Clayton } 70b3e77600SGreg Clayton 71b3e77600SGreg Clayton const char * 72b3e77600SGreg Clayton OperatingSystemPython::GetPluginDescriptionStatic() 73b3e77600SGreg Clayton { 74b3e77600SGreg Clayton return "Operating system plug-in that gathers OS information from a python class that implements the necessary OperatingSystem functionality."; 75b3e77600SGreg Clayton } 76b3e77600SGreg Clayton 77b3e77600SGreg Clayton 78b3e77600SGreg Clayton OperatingSystemPython::OperatingSystemPython (lldb_private::Process *process) : 79b3e77600SGreg Clayton OperatingSystem (process), 80b3e77600SGreg Clayton m_thread_list_valobj_sp (), 81*5790759aSEnrico Granata m_register_info_ap (), 82*5790759aSEnrico Granata m_interpreter(NULL), 83*5790759aSEnrico Granata m_python_object(NULL) 84b3e77600SGreg Clayton { 85*5790759aSEnrico Granata if (!process) 86*5790759aSEnrico Granata return; 87*5790759aSEnrico Granata lldb::TargetSP target_sp = process->CalculateTarget(); 88*5790759aSEnrico Granata if (!target_sp) 89*5790759aSEnrico Granata return; 90*5790759aSEnrico Granata m_interpreter = target_sp->GetDebugger().GetCommandInterpreter().GetScriptInterpreter(); 91*5790759aSEnrico Granata if (m_interpreter) 92*5790759aSEnrico Granata { 93*5790759aSEnrico Granata // TODO: hardcoded is not good 94*5790759aSEnrico Granata auto object_sp = m_interpreter->CreateOSPlugin("operating_system.PlugIn",process->CalculateProcess()); 95*5790759aSEnrico Granata if (object_sp) 96*5790759aSEnrico Granata m_python_object = object_sp->GetObject(); 97*5790759aSEnrico Granata } 98b3e77600SGreg Clayton } 99b3e77600SGreg Clayton 100b3e77600SGreg Clayton OperatingSystemPython::~OperatingSystemPython () 101b3e77600SGreg Clayton { 102b3e77600SGreg Clayton } 103b3e77600SGreg Clayton 104b3e77600SGreg Clayton DynamicRegisterInfo * 105b3e77600SGreg Clayton OperatingSystemPython::GetDynamicRegisterInfo () 106b3e77600SGreg Clayton { 107*5790759aSEnrico Granata if (!m_interpreter || !m_python_object) 108*5790759aSEnrico Granata return NULL; 109*5790759aSEnrico Granata auto object_sp = m_interpreter->OSPlugin_QueryForRegisterInfo(m_interpreter->MakeScriptObject(m_python_object)); 110*5790759aSEnrico Granata if (!object_sp) 111*5790759aSEnrico Granata return NULL; 112*5790759aSEnrico Granata PythonDataObject dictionary_data_obj((PyObject*)object_sp->GetObject()); 113*5790759aSEnrico Granata PythonDataDictionary dictionary = dictionary_data_obj.GetDictionaryObject(); 114*5790759aSEnrico Granata if(!dictionary) 115*5790759aSEnrico Granata return NULL; 116b3e77600SGreg Clayton 117*5790759aSEnrico Granata // TODO: iterate over the dictionary 118b3e77600SGreg Clayton if (m_register_info_ap.get() == NULL && m_thread_list_valobj_sp) 119b3e77600SGreg Clayton { 120b3e77600SGreg Clayton // static ConstString g_gpr_member_name("gpr"); 121b3e77600SGreg Clayton // m_register_info_ap.reset (new DynamicRegisterInfo()); 122b3e77600SGreg Clayton // ConstString empty_name; 123b3e77600SGreg Clayton // const bool can_create = true; 124b3e77600SGreg Clayton // AddressType addr_type; 125b3e77600SGreg Clayton // addr_t base_addr = LLDB_INVALID_ADDRESS; 126b3e77600SGreg Clayton // ValueObjectSP gpr_valobj_sp (m_thread_list_valobj_sp->GetChildMemberWithName(GetThreadGPRMemberName (), can_create)); 127b3e77600SGreg Clayton // 128b3e77600SGreg Clayton // if (gpr_valobj_sp->IsPointerType ()) 129b3e77600SGreg Clayton // base_addr = gpr_valobj_sp->GetPointerValue (&addr_type); 130b3e77600SGreg Clayton // else 131b3e77600SGreg Clayton // base_addr = gpr_valobj_sp->GetAddressOf (true, &addr_type); 132b3e77600SGreg Clayton // 133b3e77600SGreg Clayton // ValueObjectSP child_valobj_sp; 134b3e77600SGreg Clayton // if (gpr_valobj_sp) 135b3e77600SGreg Clayton // { 136b3e77600SGreg Clayton // ABI *abi = m_process->GetABI().get(); 137b3e77600SGreg Clayton // assert (abi); 138b3e77600SGreg Clayton // uint32_t num_children = gpr_valobj_sp->GetNumChildren(); 139b3e77600SGreg Clayton // 140b3e77600SGreg Clayton // ConstString gpr_name (gpr_valobj_sp->GetName()); 141b3e77600SGreg Clayton // uint32_t reg_num = 0; 142b3e77600SGreg Clayton // for (uint32_t i=0; i<num_children; ++i) 143b3e77600SGreg Clayton // { 144b3e77600SGreg Clayton // child_valobj_sp = gpr_valobj_sp->GetChildAtIndex(i, can_create); 145b3e77600SGreg Clayton // 146b3e77600SGreg Clayton // ConstString reg_name(child_valobj_sp->GetName()); 147b3e77600SGreg Clayton // if (reg_name) 148b3e77600SGreg Clayton // { 149b3e77600SGreg Clayton // const char *reg_name_cstr = reg_name.GetCString(); 150b3e77600SGreg Clayton // while (reg_name_cstr[0] == '_') 151b3e77600SGreg Clayton // ++reg_name_cstr; 152b3e77600SGreg Clayton // if (reg_name_cstr != reg_name.GetCString()) 153b3e77600SGreg Clayton // reg_name.SetCString (reg_name_cstr); 154b3e77600SGreg Clayton // } 155b3e77600SGreg Clayton // 156b3e77600SGreg Clayton // RegisterInfo reg_info; 157b3e77600SGreg Clayton // if (abi->GetRegisterInfoByName(reg_name, reg_info)) 158b3e77600SGreg Clayton // { 159b3e77600SGreg Clayton // // Adjust the byte size and the offset to match the layout of registers in our struct 160b3e77600SGreg Clayton // reg_info.byte_size = child_valobj_sp->GetByteSize(); 161b3e77600SGreg Clayton // reg_info.byte_offset = child_valobj_sp->GetAddressOf(true, &addr_type) - base_addr; 162b3e77600SGreg Clayton // reg_info.kinds[eRegisterKindLLDB] = reg_num++; 163b3e77600SGreg Clayton // m_register_info_ap->AddRegister (reg_info, reg_name, empty_name, gpr_name); 164b3e77600SGreg Clayton // } 165b3e77600SGreg Clayton // else 166b3e77600SGreg Clayton // { 167b3e77600SGreg Clayton // printf ("not able to find register info for %s\n", reg_name.GetCString()); // REMOVE THIS printf before checkin!!! 168b3e77600SGreg Clayton // } 169b3e77600SGreg Clayton // } 170b3e77600SGreg Clayton // 171b3e77600SGreg Clayton // m_register_info_ap->Finalize(); 172b3e77600SGreg Clayton // } 173b3e77600SGreg Clayton } 174b3e77600SGreg Clayton assert (m_register_info_ap.get()); 175b3e77600SGreg Clayton return m_register_info_ap.get(); 176b3e77600SGreg Clayton } 177b3e77600SGreg Clayton 178b3e77600SGreg Clayton //------------------------------------------------------------------ 179b3e77600SGreg Clayton // PluginInterface protocol 180b3e77600SGreg Clayton //------------------------------------------------------------------ 181b3e77600SGreg Clayton const char * 182b3e77600SGreg Clayton OperatingSystemPython::GetPluginName() 183b3e77600SGreg Clayton { 184b3e77600SGreg Clayton return "OperatingSystemPython"; 185b3e77600SGreg Clayton } 186b3e77600SGreg Clayton 187b3e77600SGreg Clayton const char * 188b3e77600SGreg Clayton OperatingSystemPython::GetShortPluginName() 189b3e77600SGreg Clayton { 190b3e77600SGreg Clayton return GetPluginNameStatic(); 191b3e77600SGreg Clayton } 192b3e77600SGreg Clayton 193b3e77600SGreg Clayton uint32_t 194b3e77600SGreg Clayton OperatingSystemPython::GetPluginVersion() 195b3e77600SGreg Clayton { 196b3e77600SGreg Clayton return 1; 197b3e77600SGreg Clayton } 198b3e77600SGreg Clayton 199b3e77600SGreg Clayton bool 200b3e77600SGreg Clayton OperatingSystemPython::UpdateThreadList (ThreadList &old_thread_list, ThreadList &new_thread_list) 201b3e77600SGreg Clayton { 202b3e77600SGreg Clayton // TODO: python: call "dict get_thread_info()" on the 203b3e77600SGreg Clayton // python object that represents our instance of the OperatingSystem plug-in 204b3e77600SGreg Clayton // and parse the returned dictionary. We need to pass in the a Dictionary 205b3e77600SGreg Clayton // with the same kind of info we want back so we can reuse old threads, but 206b3e77600SGreg Clayton // only create new ones. 207b3e77600SGreg Clayton 208b3e77600SGreg Clayton // Make any constant strings once and cache the uniqued C string values 209b3e77600SGreg Clayton // so we don't have to rehash them each time through this function call 210b3e77600SGreg Clayton // dict thread_info_dict = python.get_thread_info() 211b3e77600SGreg Clayton // for thread_info in thread_info_dict: 212b3e77600SGreg Clayton // { 213b3e77600SGreg Clayton // ThreadSP thread_sp (old_thread_list.FindThreadByID (tid, false)); 214b3e77600SGreg Clayton // if (!thread_sp) 215b3e77600SGreg Clayton // thread_sp.reset (new ThreadMemory (m_process->shared_from_this(), tid, valobj_sp)); 216b3e77600SGreg Clayton // new_thread_list.AddThread(thread_sp); 217b3e77600SGreg Clayton // } 218b3e77600SGreg Clayton new_thread_list = old_thread_list; 219b3e77600SGreg Clayton return new_thread_list.GetSize(false) > 0; 220b3e77600SGreg Clayton } 221b3e77600SGreg Clayton 222b3e77600SGreg Clayton void 223b3e77600SGreg Clayton OperatingSystemPython::ThreadWasSelected (Thread *thread) 224b3e77600SGreg Clayton { 225b3e77600SGreg Clayton } 226b3e77600SGreg Clayton 227b3e77600SGreg Clayton RegisterContextSP 228b3e77600SGreg Clayton OperatingSystemPython::CreateRegisterContextForThread (Thread *thread) 229b3e77600SGreg Clayton { 230b3e77600SGreg Clayton // TODO: python: call "bytes get_register_context_data(SBThread thread)" 231b3e77600SGreg Clayton // and populate resulting data into thread 232b3e77600SGreg Clayton RegisterContextSP reg_ctx_sp; 233b3e77600SGreg Clayton // bytes b = get_register_context_data(thread) 234b3e77600SGreg Clayton // if (b) 235b3e77600SGreg Clayton // { 236b3e77600SGreg Clayton // reg_ctx_sp.reset (new RegisterContextMemory (*thread, 0, *GetDynamicRegisterInfo (), base_addr)); 237b3e77600SGreg Clayton // // set bytes 238b3e77600SGreg Clayton // } 239b3e77600SGreg Clayton return reg_ctx_sp; 240b3e77600SGreg Clayton } 241b3e77600SGreg Clayton 242b3e77600SGreg Clayton StopInfoSP 243b3e77600SGreg Clayton OperatingSystemPython::CreateThreadStopReason (lldb_private::Thread *thread) 244b3e77600SGreg Clayton { 245b3e77600SGreg Clayton // We should have gotten the thread stop info from the dictionary of data for 246b3e77600SGreg Clayton // the thread in the initial call to get_thread_info(), this should have been 247b3e77600SGreg Clayton // cached so we can return it here 248b3e77600SGreg Clayton StopInfoSP stop_info_sp; //(StopInfo::CreateStopReasonWithSignal (*thread, SIGSTOP)); 249b3e77600SGreg Clayton return stop_info_sp; 250b3e77600SGreg Clayton } 251b3e77600SGreg Clayton 252b3e77600SGreg Clayton 253b3e77600SGreg Clayton #endif // #ifndef LLDB_DISABLE_PYTHON 254