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;
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;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits