ThreadList::ExpressionExecutionThreadPusher::ExpressionExecutionThreadPusher( lldb::ThreadSP thread_sp) : m_thread_list(nullptr), m_tid(LLDB_INVALID_THREAD_ID) { if (thread_sp) { m_tid = thread_sp->GetID(); m_thread_list = &thread_sp->GetProcess()->GetThreadList(); m_thread_list->PushExpressionExecutionThread(m_tid); } }
void ExecutionContextRef::SetThreadSP (const lldb::ThreadSP &thread_sp) { if (thread_sp) { m_thread_wp = thread_sp; m_tid = thread_sp->GetID(); SetProcessSP (thread_sp->GetProcess()); } else { ClearThread(); m_process_wp.reset(); m_target_wp.reset(); } }
bool OperatingSystem::IsOperatingSystemPluginThread (const lldb::ThreadSP &thread_sp) { if (thread_sp) return thread_sp->IsOperatingSystemPluginThread(); return false; }
lldb::addr_t DynamicLoaderPOSIXDYLD::GetThreadLocalData (const lldb::ModuleSP module, const lldb::ThreadSP thread) { auto it = m_loaded_modules.find (module); if (it == m_loaded_modules.end()) return LLDB_INVALID_ADDRESS; addr_t link_map = it->second; if (link_map == LLDB_INVALID_ADDRESS) return LLDB_INVALID_ADDRESS; const DYLDRendezvous::ThreadInfo &metadata = m_rendezvous.GetThreadInfo(); if (!metadata.valid) return LLDB_INVALID_ADDRESS; // Get the thread pointer. addr_t tp = thread->GetThreadPointer (); if (tp == LLDB_INVALID_ADDRESS) return LLDB_INVALID_ADDRESS; // Find the module's modid. int modid_size = 4; // FIXME(spucci): This isn't right for big-endian 64-bit int64_t modid = ReadUnsignedIntWithSizeInBytes (link_map + metadata.modid_offset, modid_size); if (modid == -1) return LLDB_INVALID_ADDRESS; // Lookup the DTV structure for this thread. addr_t dtv_ptr = tp + metadata.dtv_offset; addr_t dtv = ReadPointer (dtv_ptr); if (dtv == LLDB_INVALID_ADDRESS) return LLDB_INVALID_ADDRESS; // Find the TLS block for this module. addr_t dtv_slot = dtv + metadata.dtv_slot_size*modid; addr_t tls_block = ReadPointer (dtv_slot + metadata.tls_offset); Module *mod = module.get(); Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_DYNAMIC_LOADER)); if (log) log->Printf("DynamicLoaderPOSIXDYLD::Performed TLS lookup: " "module=%s, link_map=0x%" PRIx64 ", tp=0x%" PRIx64 ", modid=%" PRId64 ", tls_block=0x%" PRIx64 "\n", mod->GetObjectName().AsCString(""), link_map, tp, (int64_t)modid, tls_block); return tls_block; }
void ExecutionContext::SetContext (const lldb::ThreadSP &thread_sp) { m_frame_sp.reset(); m_thread_sp = thread_sp; if (thread_sp) { m_process_sp = thread_sp->GetProcess(); if (m_process_sp) m_target_sp = m_process_sp->GetTarget().shared_from_this(); else m_target_sp.reset(); } else { m_target_sp.reset(); m_process_sp.reset(); } }