Author: Charles Zablit
Date: 2026-08-11T15:30:16+02:00
New Revision: d3186b091c06216502f668871fcafb2b848e2201

URL: 
https://github.com/llvm/llvm-project/commit/d3186b091c06216502f668871fcafb2b848e2201
DIFF: 
https://github.com/llvm/llvm-project/commit/d3186b091c06216502f668871fcafb2b848e2201.diff

LOG: [lldb][Windows] Expose each thread's TEB address as extended thread info 
(#213301)

A Windows thread's local storage is accessed through its Thread
Environment Block
([TEB](https://learn.microsoft.com/en-us/windows/win32/api/winternl/ns-winternl-teb)),
but nothing in the target exposes that address, so a language runtime
cannot resolve a variable local to the thread in the debuggee.

This patch publishes the thread's TEB from
`TargetThreadWindows::FetchThreadExtendedInfo` under the "teb_address"
key.

This is required for:
- https://github.com/swiftlang/llvm-project/pull/13597

Added: 
    

Modified: 
    lldb/source/Plugins/Process/Windows/Common/TargetThreadWindows.cpp
    lldb/source/Plugins/Process/Windows/Common/TargetThreadWindows.h

Removed: 
    


################################################################################
diff  --git 
a/lldb/source/Plugins/Process/Windows/Common/TargetThreadWindows.cpp 
b/lldb/source/Plugins/Process/Windows/Common/TargetThreadWindows.cpp
index f94533a701817..38d08fff0d755 100644
--- a/lldb/source/Plugins/Process/Windows/Common/TargetThreadWindows.cpp
+++ b/lldb/source/Plugins/Process/Windows/Common/TargetThreadWindows.cpp
@@ -44,6 +44,46 @@ void TargetThreadWindows::RefreshStateAfterStop() {
 
 void TargetThreadWindows::WillResume(lldb::StateType resume_state) {}
 
+StructuredData::ObjectSP TargetThreadWindows::FetchThreadExtendedInfo() {
+  struct ThreadBasicInformation {
+    LONG ExitStatus;
+    PVOID TebBaseAddress;
+    struct {
+      HANDLE UniqueProcess;
+      HANDLE UniqueThread;
+    } ClientId;
+    ULONG_PTR AffinityMask;
+    LONG Priority;
+    LONG BasePriority;
+  };
+  using NtQueryInformationThreadFn =
+      LONG(WINAPI *)(HANDLE ThreadHandle, ULONG ThreadInformationClass,
+                     PVOID ThreadInformation, ULONG ThreadInformationLength,
+                     PULONG ReturnLength);
+
+  static LazyImport<NtQueryInformationThreadFn> s_query_information_thread{
+      L"Kernel32.dll", "NtQueryInformationThread"};
+  if (!s_query_information_thread)
+    return StructuredData::ObjectSP();
+  auto NtQueryInformationThread = *s_query_information_thread;
+
+  HANDLE handle = m_host_thread.GetNativeThread().GetSystemHandle();
+  if (!handle || handle == INVALID_HANDLE_VALUE)
+    return StructuredData::ObjectSP();
+
+  ThreadBasicInformation info = {};
+  // ThreadInformationClass 0 is ThreadBasicInformation.
+  if (NtQueryInformationThread(handle, 0, &info, sizeof(info), nullptr) < 0)
+    return StructuredData::ObjectSP();
+  if (!info.TebBaseAddress)
+    return StructuredData::ObjectSP();
+
+  auto dict = std::make_shared<StructuredData::Dictionary>();
+  dict->AddIntegerItem("teb_address",
+                       reinterpret_cast<uint64_t>(info.TebBaseAddress));
+  return dict;
+}
+
 void TargetThreadWindows::DidStop() {}
 
 RegisterContextSP TargetThreadWindows::GetRegisterContext() {

diff  --git a/lldb/source/Plugins/Process/Windows/Common/TargetThreadWindows.h 
b/lldb/source/Plugins/Process/Windows/Common/TargetThreadWindows.h
index 2b8d4d9b1864d..4bdd1b351b3fe 100644
--- a/lldb/source/Plugins/Process/Windows/Common/TargetThreadWindows.h
+++ b/lldb/source/Plugins/Process/Windows/Common/TargetThreadWindows.h
@@ -34,6 +34,10 @@ class TargetThreadWindows : public lldb_private::Thread {
   bool CalculateStopInfo() override;
   const char *GetName() override;
 
+  /// Exposes this thread's TEB address under the "teb_address" key, so that
+  /// language runtimes can resolve thread-local storage.
+  lldb_private::StructuredData::ObjectSP FetchThreadExtendedInfo() override;
+
   Status DoResume();
 
   HostThread GetHostThread() const { return m_host_thread; }


        
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to