[PATCH] D95497: Frontend: Respect -working-directory when checking if output files can be written
Duncan P. N. Exon Smith via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 26 19:39:21 PST 2021
dexonsmith created this revision.
dexonsmith added a reviewer: erik.pilkington.
Herald added a subscriber: ributzka.
dexonsmith requested review of this revision.
Herald added a project: clang.
Call `FixupRelativePath` when opening output files to ensure that
`-working-directory` is used when checking up front for write failures,
not just when finalizing the files at the end. This also moves the
temporary file into the same directory as the output file.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D95497
Files:
clang/lib/Frontend/CompilerInstance.cpp
clang/test/Frontend/output-paths.c
Index: clang/test/Frontend/output-paths.c
===================================================================
--- clang/test/Frontend/output-paths.c
+++ clang/test/Frontend/output-paths.c
@@ -2,3 +2,9 @@
// RUN: FileCheck -check-prefix=OUTPUTFAIL -input-file=%t %s
// OUTPUTFAIL: error: unable to open output file '{{.*}}doesnotexist{{.}}somename': '{{[nN]}}o such file or directory'
+
+// Check that -working-directory is respected when diagnosing output failures.
+//
+// RUN: rm -rf %t.d && mkdir -p %t.d/%basename_t-inner.d
+// RUN: %clang_cc1 -emit-llvm -working-directory %t.d -E -o %basename_t-inner.d/somename %s -verify
+// expected-no-diagnostics
Index: clang/lib/Frontend/CompilerInstance.cpp
===================================================================
--- clang/lib/Frontend/CompilerInstance.cpp
+++ clang/lib/Frontend/CompilerInstance.cpp
@@ -661,11 +661,7 @@
if (OF.TempFilename.empty())
continue;
- // If '-working-directory' was passed, the output filename should be
- // relative to that.
- SmallString<128> NewOutFile(OF.Filename);
- FileMgr->FixupRelativePath(NewOutFile);
- std::error_code EC = llvm::sys::fs::rename(OF.TempFilename, NewOutFile);
+ std::error_code EC = llvm::sys::fs::rename(OF.TempFilename, OF.Filename);
if (!EC)
continue;
getDiagnostics().Report(diag::err_unable_to_rename_temp)
@@ -730,6 +726,15 @@
assert((!CreateMissingDirectories || UseTemporary) &&
"CreateMissingDirectories is only allowed when using temporary files");
+ // If '-working-directory' was passed, the output filename should be
+ // relative to that.
+ Optional<SmallString<128>> AbsPath;
+ if (!llvm::sys::path::is_absolute(OutputPath)) {
+ AbsPath.emplace(OutputPath);
+ FileMgr->FixupRelativePath(*AbsPath);
+ OutputPath = *AbsPath;
+ }
+
std::unique_ptr<llvm::raw_fd_ostream> OS;
Optional<StringRef> OSFile;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D95497.319451.patch
Type: text/x-patch
Size: 1919 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20210127/4641d4f1/attachment.bin>
More information about the cfe-commits
mailing list