From ead45e0174579d47baba4e5a8ab0549ffc448f34 Mon Sep 17 00:00:00 2001 From: Greg Clayton Date: Thu, 25 Oct 2012 17:56:31 +0000 Subject: Allow operating system plug-ins to specify the address for registers so we don't have to create data up front. llvm-svn: 166701 --- .../Python/OperatingSystemPython.cpp | 58 ++++++++++++++-------- 1 file changed, 37 insertions(+), 21 deletions(-) (limited to 'lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp') diff --git a/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp b/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp index 6ff4156..b7a0bb9 100644 --- a/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp +++ b/lldb/source/Plugins/OperatingSystem/Python/OperatingSystemPython.cpp @@ -202,6 +202,7 @@ OperatingSystemPython::UpdateThreadList (ThreadList &old_thread_list, ThreadList PythonDataString queue_pystr("queue"); PythonDataString state_pystr("state"); PythonDataString stop_reason_pystr("stop_reason"); + PythonDataString reg_data_addr_pystr ("register_data_addr"); const uint32_t num_threads = threads_array.GetSize(); for (uint32_t i=0; iPrintf ("OperatingSystemPython::CreateRegisterContextForThread (tid = 0x%llx) fetching register data from python", thread->GetID()); - - auto object_sp = m_interpreter->OSPlugin_QueryForRegisterContextData (m_interpreter->MakeScriptObject(m_python_object), - thread->GetID()); - - if (!object_sp) - return RegisterContextSP(); - - PythonDataString reg_context_data((PyObject*)object_sp->GetObject()); - if (reg_context_data) + if (reg_data_addr != LLDB_INVALID_ADDRESS) { - DataBufferSP data_sp (new DataBufferHeap (reg_context_data.GetString(), - reg_context_data.GetSize())); - if (data_sp->GetByteSize()) + // The registers data is in contiguous memory, just create the register + // context using the address provided + if (log) + log->Printf ("OperatingSystemPython::CreateRegisterContextForThread (tid = 0x%llx, reg_data_addr = 0x%llx) creating memory register context", thread->GetID(), reg_data_addr); + reg_ctx_sp.reset (new RegisterContextMemory (*thread, 0, *GetDynamicRegisterInfo (), reg_data_addr)); + } + else + { + // No register data address is provided, query the python plug-in to let + // it make up the data as it sees fit + if (log) + log->Printf ("OperatingSystemPython::CreateRegisterContextForThread (tid = 0x%llx) fetching register data from python", thread->GetID()); + + auto object_sp = m_interpreter->OSPlugin_QueryForRegisterContextData (m_interpreter->MakeScriptObject(m_python_object), + thread->GetID()); + + if (!object_sp) + return RegisterContextSP(); + + PythonDataString reg_context_data((PyObject*)object_sp->GetObject()); + if (reg_context_data) { - RegisterContextMemory *reg_ctx_memory = new RegisterContextMemory (*thread, 0, *GetDynamicRegisterInfo (), LLDB_INVALID_ADDRESS); - if (reg_ctx_memory) + DataBufferSP data_sp (new DataBufferHeap (reg_context_data.GetString(), + reg_context_data.GetSize())); + if (data_sp->GetByteSize()) { - reg_ctx_sp.reset(reg_ctx_memory); - reg_ctx_memory->SetAllRegisterData (data_sp); + RegisterContextMemory *reg_ctx_memory = new RegisterContextMemory (*thread, 0, *GetDynamicRegisterInfo (), LLDB_INVALID_ADDRESS); + if (reg_ctx_memory) + { + reg_ctx_sp.reset(reg_ctx_memory); + reg_ctx_memory->SetAllRegisterData (data_sp); + } } } } -- cgit v1.1