[llvm] Revert "[Lit] Change processRedirects to open all files in binary mode" (PR #196328)

via llvm-commits llvm-commits at lists.llvm.org
Thu May 7 07:33:37 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-testing-tools

Author: Benjamin Stott (BStott6)

<details>
<summary>Changes</summary>

Reverts llvm/llvm-project#<!-- -->194368 due to breaking tests on z/OS

---
Full diff: https://github.com/llvm/llvm-project/pull/196328.diff


4 Files Affected:

- (modified) llvm/utils/lit/lit/InprocBuiltins.py (+13-13) 
- (modified) llvm/utils/lit/lit/ShellEnvironment.py (+8-9) 
- (modified) llvm/utils/lit/lit/TestRunner.py (+3-3) 
- (modified) llvm/utils/lit/tests/shtest-glob.py (+1-1) 


``````````diff
diff --git a/llvm/utils/lit/lit/InprocBuiltins.py b/llvm/utils/lit/lit/InprocBuiltins.py
index 34a4d7eae1e88..b20aeb6993726 100644
--- a/llvm/utils/lit/lit/InprocBuiltins.py
+++ b/llvm/utils/lit/lit/InprocBuiltins.py
@@ -5,7 +5,7 @@
 import shutil
 import stat
 import subprocess
-from io import BytesIO, StringIO
+from io import StringIO
 
 import lit.util
 from lit.ShellEnvironment import (
@@ -70,7 +70,13 @@ def executeBuiltinEcho(cmd, shenv):
     is_redirected = True
     if stdout == subprocess.PIPE:
         is_redirected = False
-        stdout = BytesIO()
+        stdout = StringIO()
+    elif kIsWindows:
+        # Reopen stdout with `newline=""` to avoid CRLF translation.
+        # The versions of echo we are replacing on Windows all emit plain LF,
+        # and the LLVM tests now depend on this.
+        stdout = open(stdout.name, stdout.mode, encoding="utf-8", newline="")
+        opened_files.append((None, None, stdout, None))
 
     # Implement echo flags. We only support -e and -n, and not yet in
     # combination. We have to ignore unknown flags, because `echo "-D FOO"`
@@ -94,22 +100,16 @@ def maybeUnescape(arg):
 
     if args:
         for arg in args[:-1]:
-            stdout.write(maybeUnescape(arg).encode())
-            stdout.write(b" ")
-        stdout.write(maybeUnescape(args[-1]).encode())
+            stdout.write(maybeUnescape(arg))
+            stdout.write(" ")
+        stdout.write(maybeUnescape(args[-1]))
     if write_newline:
-        stdout.write("\n".encode())
+        stdout.write("\n")
 
     for name, mode, f, path in opened_files:
         f.close()
 
-    output = (
-        ""
-        if is_redirected
-        # TODO(BStott) remove decode once new interface for in-process builtin
-        # IO is introduced.
-        else stdout.getvalue().decode(encoding="utf8", errors="replace")
-    )
+    output = "" if is_redirected else stdout.getvalue()
     return ShellCommandResult(cmd, output, "", 0, False)
 
 
diff --git a/llvm/utils/lit/lit/ShellEnvironment.py b/llvm/utils/lit/lit/ShellEnvironment.py
index b4ff7b1a120f6..4f6753bd11b52 100644
--- a/llvm/utils/lit/lit/ShellEnvironment.py
+++ b/llvm/utils/lit/lit/ShellEnvironment.py
@@ -108,19 +108,19 @@ def processRedirects(cmd, stdin_source, cmd_shenv, opened_files):
     redirects = [(0,), (1,), (2,)]
     for op, filename in cmd.redirects:
         if op == (">", 2):
-            redirects[2] = [filename, "wb", None]
+            redirects[2] = [filename, "w", None]
         elif op == (">>", 2):
-            redirects[2] = [filename, "ab", None]
+            redirects[2] = [filename, "a", None]
         elif op == (">&", 2) and filename in "012":
             redirects[2] = redirects[int(filename)]
         elif op == (">&",) or op == ("&>",):
-            redirects[1] = redirects[2] = [filename, "wb", None]
+            redirects[1] = redirects[2] = [filename, "w", None]
         elif op == (">",):
-            redirects[1] = [filename, "wb", None]
+            redirects[1] = [filename, "w", None]
         elif op == (">>",):
-            redirects[1] = [filename, "ab", None]
+            redirects[1] = [filename, "a", None]
         elif op == ("<",):
-            redirects[0] = [filename, "rb", None]
+            redirects[0] = [filename, "r", None]
         else:
             raise InternalShellError(
                 cmd, "Unsupported redirect: %r" % ((op, filename),)
@@ -173,12 +173,11 @@ def processRedirects(cmd, stdin_source, cmd_shenv, opened_files):
         else:
             # Make sure relative paths are relative to the cwd.
             redir_filename = os.path.join(cmd_shenv.cwd, name)
-            fd = open(redir_filename, mode)
-
+            fd = open(redir_filename, mode, encoding="utf-8")
         # Workaround a Win32 and/or subprocess bug when appending.
         #
         # FIXME: Actually, this is probably an instance of PR6753.
-        if mode == "ab":
+        if mode == "a":
             fd.seek(0, 2)
         # Mutate the underlying redirect list so that we can redirect stdout
         # and stderr to the same place without opening the file twice.
diff --git a/llvm/utils/lit/lit/TestRunner.py b/llvm/utils/lit/lit/TestRunner.py
index 743f7bcccd533..32f47109053a6 100644
--- a/llvm/utils/lit/lit/TestRunner.py
+++ b/llvm/utils/lit/lit/TestRunner.py
@@ -520,11 +520,11 @@ def _executeShCmd(cmd, shenv, results, timeoutHelper):
         if procs[i].stdout is not None:
             out = procs[i].stdout.read()
         else:
-            out = b""
+            out = ""
         if procs[i].stderr is not None:
             err = procs[i].stderr.read()
         else:
-            err = b""
+            err = ""
         procData[i] = (out, err)
 
     # Read stderr out of the temp files.
@@ -567,7 +567,7 @@ def _executeShCmd(cmd, shenv, results, timeoutHelper):
         output_files = []
         if res != 0:
             for (name, mode, f, path) in sorted(opened_files):
-                if path is not None and mode in ("wb", "ab"):
+                if path is not None and mode in ("w", "a"):
                     try:
                         with open(path, "rb") as f:
                             data = f.read()
diff --git a/llvm/utils/lit/tests/shtest-glob.py b/llvm/utils/lit/tests/shtest-glob.py
index 95a53e4dd2223..ba609e036c166 100644
--- a/llvm/utils/lit/tests/shtest-glob.py
+++ b/llvm/utils/lit/tests/shtest-glob.py
@@ -5,7 +5,7 @@
 # END.
 
 # CHECK: UNRESOLVED: shtest-glob :: glob-echo.txt ({{[^)]*}})
-# CHECK: AttributeError: 'GlobItem' object has no attribute 'encode'
+# CHECK: TypeError: string argument expected, got 'GlobItem'
 
 # CHECK:      FAIL: shtest-glob :: glob-mkdir.txt ({{[^)]*}})
 # CHECK:      # | Error: 'mkdir' command failed, {{.*}}example_file1.input'

``````````

</details>


https://github.com/llvm/llvm-project/pull/196328


More information about the llvm-commits mailing list