[Support] Use FILE_SHARE_DELETE to fix RemoveFileOnSignal on Windows

Summary:
Tools like clang that use RemoveFileOnSignal on their output files
weren't actually able to clean up their outputs before this change.  Now
the call to llvm::sys::fs::remove succeeds and the temporary file is
deleted. This is a stop-gap to fix clang before implementing the
solution outlined in PR34070.

Reviewers: davide

Subscribers: llvm-commits, hiraditya

Differential Revision: https://reviews.llvm.org/D36337

llvm-svn: 310137
This commit is contained in:
Reid Kleckner 2017-08-04 21:52:00 +00:00
parent 7dbb1e179e
commit cefb333582
2 changed files with 11 additions and 3 deletions

View File

@ -0,0 +1,7 @@
// RUN: rm -rf %t && mkdir -p %t && cd %t
// RUN: not --crash %clang_cc1 %s -emit-llvm -o foo.ll
// RUN: ls . | FileCheck %s --allow-empty
// CHECK-NOT: foo.ll
#pragma clang __debug crash
FOO

View File

@ -925,9 +925,10 @@ std::error_code openFileForWrite(const Twine &Name, int &ResultFD,
if (Flags & F_RW)
Access |= GENERIC_READ;
HANDLE H = ::CreateFileW(PathUTF16.begin(), Access,
FILE_SHARE_READ | FILE_SHARE_WRITE, NULL,
CreationDisposition, FILE_ATTRIBUTE_NORMAL, NULL);
HANDLE H =
::CreateFileW(PathUTF16.begin(), Access,
FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE,
NULL, CreationDisposition, FILE_ATTRIBUTE_NORMAL, NULL);
if (H == INVALID_HANDLE_VALUE) {
DWORD LastError = ::GetLastError();