================ @@ -1048,70 +1048,107 @@ DynamicLoaderDarwin::GetThreadLocalData(const lldb::ModuleSP module_sp, std::lock_guard<std::recursive_mutex> guard(m_mutex); - const uint32_t addr_size = m_process->GetAddressByteSize(); + lldb_private::Address tls_addr; + if (!module_sp->ResolveFileAddress(tls_file_addr, tls_addr)) + return LLDB_INVALID_ADDRESS; + + Target &target = m_process->GetTarget(); uint8_t buf[sizeof(lldb::addr_t) * 3]; + const uint32_t addr_size = m_process->GetAddressByteSize(); + const size_t tls_data_size = addr_size * 3; + Status error; + const size_t bytes_read = target.ReadMemory( + tls_addr, buf, tls_data_size, error, /*force_live_memory = */ true); + if (bytes_read != tls_data_size || error.Fail()) + return LLDB_INVALID_ADDRESS; - lldb_private::Address tls_addr; - if (module_sp->ResolveFileAddress(tls_file_addr, tls_addr)) { - Status error; - const size_t tsl_data_size = addr_size * 3; - Target &target = m_process->GetTarget(); - if (target.ReadMemory(tls_addr, buf, tsl_data_size, error, true) == - tsl_data_size) { - const ByteOrder byte_order = m_process->GetByteOrder(); - DataExtractor data(buf, sizeof(buf), byte_order, addr_size); - lldb::offset_t offset = addr_size; // Skip the first pointer - const lldb::addr_t pthread_key = data.GetAddress(&offset); - const lldb::addr_t tls_offset = data.GetAddress(&offset); - if (pthread_key != 0) { - // First check to see if we have already figured out the location of - // TLS data for the pthread_key on a specific thread yet. If we have we - // can re-use it since its location will not change unless the process - // execs. - const tid_t tid = thread_sp->GetID(); - auto tid_pos = m_tid_to_tls_map.find(tid); - if (tid_pos != m_tid_to_tls_map.end()) { - auto tls_pos = tid_pos->second.find(pthread_key); - if (tls_pos != tid_pos->second.end()) { - return tls_pos->second + tls_offset; - } + DataExtractor data(buf, sizeof(buf), m_process->GetByteOrder(), addr_size); + lldb::offset_t offset = 0; + const lldb::addr_t thunk_addr = data.GetAddress(&offset); + const lldb::addr_t key = data.GetAddress(&offset); + const lldb::addr_t tls_offset = data.GetAddress(&offset); + + TypeSystemClangSP scratch_ts_sp = + ScratchTypeSystemClang::GetForTarget(target); + if (!scratch_ts_sp) + return LLVM_INVALID_ADDRESS; + CompilerType clang_void_ptr_type = + scratch_ts_sp->GetBasicType(eBasicTypeVoid).GetPointerType(); + EvaluateExpressionOptions options; + DiagnosticManager execution_errors; + ExecutionContext exe_ctx(thread_sp); + + // On modern apple platforms, there is a small data structure that looks + // approximately like this: + // struct TLS_Thunk { + // void *(*get_addr)(struct TLS_Thunk *); + // size_t key; + // size_t offset; + // } ---------------- JDevlieghere wrote:
+1 as this is also shared between the "old" and "new" implementation. https://github.com/llvm/llvm-project/pull/77854 _______________________________________________ lldb-commits mailing list lldb-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits