[llvm] 8eafd93 - [Support] Set `OF_Delete` for `InMemoryBuffer`'s call to `openFileForWrite` under `commit` (#140109)

via llvm-commits llvm-commits at lists.llvm.org
Fri May 16 06:40:48 PDT 2025


Author: Douglas
Date: 2025-05-16T06:40:45-07:00
New Revision: 8eafd93034063971f08a06faa7a75a616b9866b6

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

LOG: [Support] Set `OF_Delete` for `InMemoryBuffer`'s call to `openFileForWrite` under `commit` (#140109)

https://github.com/llvm/llvm-project/pull/134787 unintentionally enabled
`--mmap-output-file` by default under LLD which caused the Windows-only
test `lld\test\ELF\link-open-file.test` to fail. This failure uncovered
what appears to be an inconsistency on Windows between
`createOnDiskBuffer` and `createInMemoryBuffer` with respect to `DELETE`
access for the output file.

The output file created by `createOnDiskBuffer` sets the flag
`OF_Delete` as part of `fs::TempFile::create` while the output file
created by `createInMemoryBuffer` sets `OF_None` under
`InMemoryBuffer::commit`.

The test `lld\test\ELF\link-open-file.test` ensures that if
`FILE_SHARE_DELETE` is _not_ specified for an output file that LLD is
expected to overwrite, LLD should fail. This only happens if: "the file
or device has been opened for delete access" which is only done for
`fs::TempFile::create`.

See
https://learn.microsoft.com/en-us/windows/win32/api/fileapi/nf-fileapi-createfilew#FILE_SHARE_DELETE.

Therefore, I propose setting `OF_Delete` for `InMemoryBuffer::commit`'s
call to `openFileForWrite` to stay consistent with
`fs::TempFile::create`.

Added: 
    

Modified: 
    lld/test/ELF/link-open-file.test
    llvm/lib/Support/FileOutputBuffer.cpp

Removed: 
    


################################################################################
diff  --git a/lld/test/ELF/link-open-file.test b/lld/test/ELF/link-open-file.test
index 17c7ba95e6ebe..8693a53ead5d5 100644
--- a/lld/test/ELF/link-open-file.test
+++ b/lld/test/ELF/link-open-file.test
@@ -10,8 +10,10 @@
 ## FILE_SHARE_WRITE  = 2
 ## FILE_SHARE_DELETE = 4
 
-# RUN:     %python %s %t.o 7
-# RUN: not %python %s %t.o 3 2>&1 | FileCheck %s
+# RUN:     %python %s %t.o 7 false
+# RUN: not %python %s %t.o 3 false 2>&1 | FileCheck %s
+# RUN:     %python %s %t.o 7 true
+# RUN: not %python %s %t.o 3 true 2>&1 | FileCheck %s
 # CHECK: error: failed to write output '{{.*}}': {{.*}}
 
 import contextlib
@@ -26,6 +28,7 @@ import time
 
 object_file = sys.argv[1]
 share_flags = int(sys.argv[2])
+use_mmap = bool(sys.argv[3])
 
 @contextlib.contextmanager
 def open_with_share_flags(filename, share_flags):
@@ -55,7 +58,10 @@ os.makedirs(outdir)
 elf = os.path.join(outdir, 'output_file.elf')
 open(elf, 'wb').close()
 with open_with_share_flags(elf, share_flags):
-    subprocess.check_call(['ld.lld.exe', object_file, '-o', elf])
+    args = ['ld.lld.exe', object_file, '-o', elf]
+    if use_mmap:
+        args.append("--mmap-output-file")
+    subprocess.check_call(args)
 
 ## Check the linker wrote the output file.
 with open(elf, 'rb') as f:

diff  --git a/llvm/lib/Support/FileOutputBuffer.cpp b/llvm/lib/Support/FileOutputBuffer.cpp
index a2396d7629488..c8b035986fb5b 100644
--- a/llvm/lib/Support/FileOutputBuffer.cpp
+++ b/llvm/lib/Support/FileOutputBuffer.cpp
@@ -99,7 +99,7 @@ class InMemoryBuffer : public FileOutputBuffer {
     int FD;
     std::error_code EC;
     if (auto EC =
-            openFileForWrite(FinalPath, FD, CD_CreateAlways, OF_None, Mode))
+            openFileForWrite(FinalPath, FD, CD_CreateAlways, OF_Delete, Mode))
       return errorCodeToError(EC);
     raw_fd_ostream OS(FD, /*shouldClose=*/true, /*unbuffered=*/true);
     OS << StringRef((const char *)Buffer.base(), BufferSize);


        


More information about the llvm-commits mailing list