https://github.com/charles-zablit updated 
https://github.com/llvm/llvm-project/pull/194950

>From 8ceef819fa137135bc29472853c9d4585f946057 Mon Sep 17 00:00:00 2001
From: Charles Zablit <[email protected]>
Date: Wed, 27 May 2026 15:23:42 +0100
Subject: [PATCH] [lldb][windows] fix command source hitting EOF

---
 lldb/include/lldb/Host/FileBase.h             |  3 ++
 lldb/include/lldb/Host/windows/FileWindows.h  |  2 +
 lldb/source/Host/common/File.cpp              | 52 ++++++++++---------
 lldb/source/Host/windows/FileWindows.cpp      |  5 ++
 .../python_api/file_handle/TestFileHandle.py  |  1 -
 5 files changed, 38 insertions(+), 25 deletions(-)

diff --git a/lldb/include/lldb/Host/FileBase.h 
b/lldb/include/lldb/Host/FileBase.h
index 62773de1e0273..54ca89f3201c6 100644
--- a/lldb/include/lldb/Host/FileBase.h
+++ b/lldb/include/lldb/Host/FileBase.h
@@ -374,6 +374,9 @@ class File : public IOObject {
   /// appropriate platform-specific terminal probing.
   virtual void CalculateInteractiveAndTerminal();
 
+  /// Called after a stream is successfully opened from a descriptor.
+  virtual void OnStreamOpened() {}
+
 private:
   File(const File &) = delete;
   const File &operator=(const File &) = delete;
diff --git a/lldb/include/lldb/Host/windows/FileWindows.h 
b/lldb/include/lldb/Host/windows/FileWindows.h
index a704e7e508684..b7a4981553ac8 100644
--- a/lldb/include/lldb/Host/windows/FileWindows.h
+++ b/lldb/include/lldb/Host/windows/FileWindows.h
@@ -48,6 +48,8 @@ class NativeFileWindows : public NativeFileBase {
   bool TryWriteStreamUnlocked(const void *buf, size_t &num_bytes,
                               Status &error) override;
 
+  void OnStreamOpened() override;
+
 private:
   /// Set when this file wraps stdin/stdout/stderr connected to a console;
   /// triggers the raw_fd_ostream path for correct non-ASCII output.
diff --git a/lldb/source/Host/common/File.cpp b/lldb/source/Host/common/File.cpp
index 07a1377133a32..a7bf4989a2826 100644
--- a/lldb/source/Host/common/File.cpp
+++ b/lldb/source/Host/common/File.cpp
@@ -264,30 +264,34 @@ IOObject::WaitableHandle 
NativeFileBase::GetWaitableHandle() {
 
 FILE *NativeFileBase::GetStream() {
   ValueGuard stream_guard = StreamIsValid();
-  if (!stream_guard) {
-    if (ValueGuard descriptor_guard = DescriptorIsValid()) {
-      auto mode = GetStreamOpenModeFromOptions(m_options);
-      if (!mode)
-        llvm::consumeError(mode.takeError());
-      else {
-        if (!m_own_descriptor) {
-          // We must duplicate the file descriptor if we don't own it because
-          // when you call fdopen, the stream will own the fd.
-          m_descriptor = Dup(m_descriptor);
-          m_own_descriptor = true;
-        }
-
-        m_stream = llvm::sys::RetryAfterSignal(nullptr, ::fdopen, m_descriptor,
-                                               mode.get());
-
-        // If we got a stream, then we own the stream and should no longer own
-        // the descriptor because fclose() will close it for us
-
-        if (m_stream) {
-          m_own_stream = true;
-          m_own_descriptor = false;
-        }
-      }
+  if (stream_guard)
+    return m_stream;
+
+  ValueGuard descriptor_guard = DescriptorIsValid();
+  if (!descriptor_guard)
+    return m_stream;
+
+  auto mode = GetStreamOpenModeFromOptions(m_options);
+  if (!mode)
+    llvm::consumeError(mode.takeError());
+  else {
+    if (!m_own_descriptor) {
+      // We must duplicate the file descriptor if we don't own it because
+      // when you call fdopen, the stream will own the fd.
+      m_descriptor = Dup(m_descriptor);
+      m_own_descriptor = true;
+    }
+
+    m_stream = llvm::sys::RetryAfterSignal(nullptr, ::fdopen, m_descriptor,
+                                           mode.get());
+
+    // If we got a stream, then we own the stream and should no longer own
+    // the descriptor because fclose() will close it for us
+
+    if (m_stream) {
+      m_own_stream = true;
+      m_own_descriptor = false;
+      OnStreamOpened();
     }
   }
   return m_stream;
diff --git a/lldb/source/Host/windows/FileWindows.cpp 
b/lldb/source/Host/windows/FileWindows.cpp
index 2058424d6c841..fc60c1815b066 100644
--- a/lldb/source/Host/windows/FileWindows.cpp
+++ b/lldb/source/Host/windows/FileWindows.cpp
@@ -143,4 +143,9 @@ Status NativeFileWindows::Write(const void *buf, size_t 
&num_bytes,
   return error;
 }
 
+void NativeFileWindows::OnStreamOpened() {
+  if ((m_options & OpenOptionsModeMask) == eOpenOptionReadOnly)
+    setvbuf(m_stream, nullptr, _IONBF, 0);
+}
+
 char NativeFileWindows::ID = 0;
diff --git a/lldb/test/API/python_api/file_handle/TestFileHandle.py 
b/lldb/test/API/python_api/file_handle/TestFileHandle.py
index a0e66199d3f54..1c93282a265e5 100644
--- a/lldb/test/API/python_api/file_handle/TestFileHandle.py
+++ b/lldb/test/API/python_api/file_handle/TestFileHandle.py
@@ -679,7 +679,6 @@ def test_stdout_file(self):
             lines = [x for x in f.read().strip().split() if x != "7"]
             self.assertEqual(lines, ["foobar"])
 
-    @skipIf(hostoslist=["windows"])
     def test_stdout_file_interactive(self):
         """Ensure when we read stdin from a file, outputs from python goes to 
the right I/O stream."""
         with open(self.in_filename, "w") as f:

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

Reply via email to