Index: include/lldb/Target/Process.h =================================================================== --- include/lldb/Target/Process.h +++ include/lldb/Target/Process.h @@ -1838,38 +1838,6 @@ GetImageInfoAddress (); //------------------------------------------------------------------ - /// Retrieves the per-thread data area. - /// Most OSs maintain a per-thread pointer (e.g. the FS register on - /// x64), which we return the value of here. - /// - /// @param[in] thread - /// The specific thread to query data for. - /// - /// @return - /// LLDB_INVALID_ADDRESS if not supported, otherwise the thread - /// pointer value. - //------------------------------------------------------------------ - virtual lldb::addr_t - GetThreadPointer (const lldb::ThreadSP thread); - - //------------------------------------------------------------------ - /// Retrieves the per-module TLS block for a given thread. - /// - /// @param[in] module - /// The module to query TLS data for. - /// - /// @param[in] thread - /// The specific thread to query TLS data for. - /// - /// @return - /// If the given thread has TLS data allocated for the - /// module, the address of the TLS block. Otherwise - /// LLDB_INVALID_ADDRESS is returned. - //------------------------------------------------------------------ - virtual lldb::addr_t - GetThreadLocalData (const lldb::ModuleSP module, const lldb::ThreadSP thread); - - //------------------------------------------------------------------ /// Load a shared library into this process. /// /// Try and load a shared library into the current process. This Index: include/lldb/Target/Thread.h =================================================================== --- include/lldb/Target/Thread.h +++ include/lldb/Target/Thread.h @@ -455,6 +455,33 @@ DumpUsingSettingsFormat (Stream &strm, uint32_t frame_idx); //------------------------------------------------------------------ + /// Retrieves the per-thread data area. + /// Most OSs maintain a per-thread pointer (e.g. the FS register on + /// x64), which we return the value of here. + /// + /// @return + /// LLDB_INVALID_ADDRESS if not supported, otherwise the thread + /// pointer value. + //------------------------------------------------------------------ + virtual lldb::addr_t + GetThreadPointer (); + + //------------------------------------------------------------------ + /// Retrieves the per-module TLS block for a thread. + /// + /// @param[in] module + /// The module to query TLS data for. + /// + /// @return + /// If the thread has TLS data allocated for the + /// module, the address of the TLS block. Otherwise + /// LLDB_INVALID_ADDRESS is returned. + //------------------------------------------------------------------ + virtual lldb::addr_t + GetThreadLocalData (const lldb::ModuleSP module); + + + //------------------------------------------------------------------ // Thread Plan Providers: // This section provides the basic thread plans that the Process control // machinery uses to run the target. ThreadPlan.h provides more details on Index: source/Expression/DWARFExpression.cpp =================================================================== --- source/Expression/DWARFExpression.cpp +++ source/Expression/DWARFExpression.cpp @@ -38,6 +38,7 @@ #include "lldb/Target/RegisterContext.h" #include "lldb/Target/StackFrame.h" #include "lldb/Target/StackID.h" +#include "lldb/Target/Thread.h" using namespace lldb; using namespace lldb_private; @@ -238,11 +239,13 @@ DWARFExpression::DWARFExpression(lldb::ModuleSP module_sp, const DataExtractor& data, lldb::offset_t data_offset, lldb::offset_t data_length) : - m_module_wp(module_sp), + m_module_wp(), m_data(data, data_offset, data_length), m_reg_kind (eRegisterKindDWARF), m_loclist_slide(LLDB_INVALID_ADDRESS) { + if (module_sp) + m_module_wp = module_sp; } //---------------------------------------------------------------------- @@ -1232,12 +1235,6 @@ ) const { ModuleSP module_sp = m_module_wp.lock(); - if (!module_sp.get()) - { - if (error_ptr) - error_ptr->SetErrorString("Module was unloaded."); - return false; - } if (IsLocationList()) { @@ -2694,17 +2691,17 @@ return false; } - if (!exe_ctx) + if (!exe_ctx || !opcode_ctx) { if (error_ptr) - error_ptr->SetErrorString("No thread context to evaluate TLS within."); + error_ptr->SetErrorString("No context to evaluate TLS within."); return false; } - ThreadSP thread_sp = exe_ctx->GetThreadSP(); + Thread *thread = exe_ctx->GetThreadPtr(); // Lookup the TLS block address for this thread and module. - addr_t tls_addr = process->GetThreadLocalData (opcode_ctx, thread_sp); + addr_t tls_addr = thread->GetThreadLocalData (opcode_ctx); if (tls_addr == LLDB_INVALID_ADDRESS) { Index: source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp =================================================================== --- source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp +++ source/Plugins/DynamicLoader/POSIX-DYLD/DynamicLoaderPOSIXDYLD.cpp @@ -584,7 +584,7 @@ return LLDB_INVALID_ADDRESS; // Get the thread pointer. - addr_t tp = m_process->GetThreadPointer (thread); + addr_t tp = thread->GetThreadPointer (); if (tp == LLDB_INVALID_ADDRESS) return LLDB_INVALID_ADDRESS; Index: source/Plugins/Process/POSIX/POSIXThread.h =================================================================== --- source/Plugins/Process/POSIX/POSIXThread.h +++ source/Plugins/Process/POSIX/POSIXThread.h @@ -59,6 +59,9 @@ virtual lldb::RegisterContextSP CreateRegisterContextForFrame (lldb_private::StackFrame *frame); + virtual lldb::addr_t + GetThreadPointer (); + //-------------------------------------------------------------------------- // These functions provide a mapping from the register offset // back to the register index or name for use in debugging or log Index: source/Plugins/Process/POSIX/POSIXThread.cpp =================================================================== --- source/Plugins/Process/POSIX/POSIXThread.cpp +++ source/Plugins/Process/POSIX/POSIXThread.cpp @@ -230,6 +230,17 @@ return reg_ctx_sp; } +lldb::addr_t +POSIXThread::GetThreadPointer () +{ + ProcessMonitor &monitor = GetMonitor(); + addr_t addr; + if (monitor.ReadThreadPointer (GetID(), addr)) + return addr; + else + return LLDB_INVALID_ADDRESS; +} + bool POSIXThread::CalculateStopInfo() { Index: source/Plugins/Process/POSIX/ProcessPOSIX.h =================================================================== --- source/Plugins/Process/POSIX/ProcessPOSIX.h +++ source/Plugins/Process/POSIX/ProcessPOSIX.h @@ -141,9 +141,6 @@ virtual lldb::addr_t GetImageInfoAddress(); - virtual lldb::addr_t - GetThreadPointer (const lldb::ThreadSP thread); - virtual size_t PutSTDIN(const char *buf, size_t len, lldb_private::Error &error); Index: source/Plugins/Process/POSIX/ProcessPOSIX.cpp =================================================================== --- source/Plugins/Process/POSIX/ProcessPOSIX.cpp +++ source/Plugins/Process/POSIX/ProcessPOSIX.cpp @@ -296,17 +296,6 @@ return LLDB_INVALID_ADDRESS; } -lldb::addr_t -ProcessPOSIX::GetThreadPointer (const lldb::ThreadSP thread) -{ - assert(m_monitor); - addr_t addr; - if (m_monitor->ReadThreadPointer (thread->GetID(), addr)) - return addr; - else - return LLDB_INVALID_ADDRESS; -} - Error ProcessPOSIX::DoHalt(bool &caused_stop) { Index: source/Target/Process.cpp =================================================================== --- source/Target/Process.cpp +++ source/Target/Process.cpp @@ -1780,23 +1780,6 @@ return LLDB_INVALID_ADDRESS; } -lldb::addr_t -Process::GetThreadPointer (const lldb::ThreadSP thread) -{ - return LLDB_INVALID_ADDRESS; -} - -addr_t -Process::GetThreadLocalData (const ModuleSP module, const ThreadSP thread) -{ - DynamicLoader *loader = GetDynamicLoader(); - if (loader) - return loader->GetThreadLocalData (module, thread); - else - return LLDB_INVALID_ADDRESS; -} - - //---------------------------------------------------------------------- // LoadImage // Index: source/Target/Thread.cpp =================================================================== --- source/Target/Thread.cpp +++ source/Target/Thread.cpp @@ -1857,6 +1857,24 @@ { } +lldb::addr_t +Thread::GetThreadPointer () +{ + return LLDB_INVALID_ADDRESS; +} + +addr_t +Thread::GetThreadLocalData (const ModuleSP module) +{ + // The default implementation is to ask the dynamic loader for it. + // This can be overridden for specific platforms. + DynamicLoader *loader = GetProcess()->GetDynamicLoader(); + if (loader) + return loader->GetThreadLocalData (module, shared_from_this()); + else + return LLDB_INVALID_ADDRESS; +} + lldb::StackFrameSP Thread::GetStackFrameSPForStackFramePtr (StackFrame *stack_frame_ptr) {