I've reverted this in r371027 as discussed on PR43204.
On Wed, May 29, 2019 at 12:18 AM Michael J. Spencer via cfe-commits <cfe-commits@lists.llvm.org> wrote: > > Author: mspencer > Date: Tue May 28 15:21:47 2019 > New Revision: 361885 > > URL: http://llvm.org/viewvc/llvm-project?rev=361885&view=rev > Log: > [Driver] Fix -working-directory issues > > Currently the `-working-directory` option does not actually impact the working > directory for all of the clang driver, it only impacts how files are looked up > to make sure they exist. This means that that clang passes the wrong paths > to -fdebug-compilation-dir and -coverage-notes-file. > > This patch fixes that by changing all the places in the driver where we > convert > to absolute paths to use the VFS, and then calling setCurrentWorkingDirectory > on > the VFS. This also changes the default VFS for `Driver` to use a virtualized > working directory, instead of changing the process's working directory. > > Differential Revision: https://reviews.llvm.org/D62271 > > Modified: > cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td > cfe/trunk/lib/Driver/Driver.cpp > cfe/trunk/lib/Driver/ToolChains/Clang.cpp > cfe/trunk/test/Driver/working-directory.c > > Modified: cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td?rev=361885&r1=361884&r2=361885&view=diff > ============================================================================== > --- cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td (original) > +++ cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td Tue May 28 > 15:21:47 2019 > @@ -91,6 +91,8 @@ def err_no_external_assembler : Error< > "there is no external assembler that can be used on this platform">; > def err_drv_unable_to_remove_file : Error< > "unable to remove file: %0">; > +def err_drv_unable_to_set_working_directory : Error < > + "unable to set working directory: %0">; > def err_drv_command_failure : Error< > "unable to execute command: %0">; > def err_drv_invalid_darwin_version : Error< > > Modified: cfe/trunk/lib/Driver/Driver.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=361885&r1=361884&r2=361885&view=diff > ============================================================================== > --- cfe/trunk/lib/Driver/Driver.cpp (original) > +++ cfe/trunk/lib/Driver/Driver.cpp Tue May 28 15:21:47 2019 > @@ -133,7 +133,7 @@ Driver::Driver(StringRef ClangExecutable > > // Provide a sane fallback if no VFS is specified. > if (!this->VFS) > - this->VFS = llvm::vfs::getRealFileSystem(); > + this->VFS = llvm::vfs::createPhysicalFileSystem().release(); > > Name = llvm::sys::path::filename(ClangExecutable); > Dir = llvm::sys::path::parent_path(ClangExecutable); > @@ -1005,6 +1005,11 @@ Compilation *Driver::BuildCompilation(Ar > } > } > > + // Check for working directory option before accessing any files > + if (Arg *WD = Args.getLastArg(options::OPT_working_directory)) > + if (std::error_code EC = VFS->setCurrentWorkingDirectory(WD->getValue())) > + Diag(diag::err_drv_unable_to_set_working_directory) << WD->getValue(); > + > // FIXME: This stuff needs to go into the Compilation, not the driver. > bool CCCPrintPhases; > > @@ -1984,20 +1989,11 @@ bool Driver::DiagnoseInputExistence(cons > if (Value == "-") > return true; > > - SmallString<64> Path(Value); > - if (Arg *WorkDir = Args.getLastArg(options::OPT_working_directory)) { > - if (!llvm::sys::path::is_absolute(Path)) { > - SmallString<64> Directory(WorkDir->getValue()); > - llvm::sys::path::append(Directory, Value); > - Path.assign(Directory); > - } > - } > - > - if (getVFS().exists(Path)) > + if (getVFS().exists(Value)) > return true; > > if (IsCLMode()) { > - if (!llvm::sys::path::is_absolute(Twine(Path)) && > + if (!llvm::sys::path::is_absolute(Twine(Value)) && > llvm::sys::Process::FindInEnvPath("LIB", Value)) > return true; > > @@ -2023,12 +2019,12 @@ bool Driver::DiagnoseInputExistence(cons > if (getOpts().findNearest(Value, Nearest, IncludedFlagsBitmask, > ExcludedFlagsBitmask) <= 1) { > Diag(clang::diag::err_drv_no_such_file_with_suggestion) > - << Path << Nearest; > + << Value << Nearest; > return false; > } > } > > - Diag(clang::diag::err_drv_no_such_file) << Path; > + Diag(clang::diag::err_drv_no_such_file) << Value; > return false; > } > > > Modified: cfe/trunk/lib/Driver/ToolChains/Clang.cpp > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/ToolChains/Clang.cpp?rev=361885&r1=361884&r2=361885&view=diff > ============================================================================== > --- cfe/trunk/lib/Driver/ToolChains/Clang.cpp (original) > +++ cfe/trunk/lib/Driver/ToolChains/Clang.cpp Tue May 28 15:21:47 2019 > @@ -616,11 +616,11 @@ static bool shouldUseLeafFramePointer(co > } > > /// Add a CC1 option to specify the debug compilation directory. > -static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) { > - SmallString<128> cwd; > - if (!llvm::sys::fs::current_path(cwd)) { > +static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs, > + const llvm::vfs::FileSystem &VFS) { > + if (llvm::ErrorOr<std::string> CWD = VFS.getCurrentWorkingDirectory()) { > CmdArgs.push_back("-fdebug-compilation-dir"); > - CmdArgs.push_back(Args.MakeArgString(cwd)); > + CmdArgs.push_back(Args.MakeArgString(*CWD)); > } > } > > @@ -885,13 +885,8 @@ static void addPGOAndCoverageFlags(const > else > OutputFilename = llvm::sys::path::filename(Output.getBaseInput()); > SmallString<128> CoverageFilename = OutputFilename; > - if (llvm::sys::path::is_relative(CoverageFilename)) { > - SmallString<128> Pwd; > - if (!llvm::sys::fs::current_path(Pwd)) { > - llvm::sys::path::append(Pwd, CoverageFilename); > - CoverageFilename.swap(Pwd); > - } > - } > + if (llvm::sys::path::is_relative(CoverageFilename)) > + (void)D.getVFS().makeAbsolute(CoverageFilename); > llvm::sys::path::replace_extension(CoverageFilename, "gcno"); > CmdArgs.push_back(Args.MakeArgString(CoverageFilename)); > > @@ -4354,7 +4349,7 @@ void Clang::ConstructJob(Compilation &C, > CmdArgs.push_back("-fno-autolink"); > > // Add in -fdebug-compilation-dir if necessary. > - addDebugCompDirArg(Args, CmdArgs); > + addDebugCompDirArg(Args, CmdArgs, D.getVFS()); > > addDebugPrefixMapArg(D, Args, CmdArgs); > > @@ -6065,7 +6060,7 @@ void ClangAs::ConstructJob(Compilation & > DebugInfoKind = (WantDebug ? codegenoptions::LimitedDebugInfo > : codegenoptions::NoDebugInfo); > // Add the -fdebug-compilation-dir flag if needed. > - addDebugCompDirArg(Args, CmdArgs); > + addDebugCompDirArg(Args, CmdArgs, C.getDriver().getVFS()); > > addDebugPrefixMapArg(getToolChain().getDriver(), Args, CmdArgs); > > > Modified: cfe/trunk/test/Driver/working-directory.c > URL: > http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/working-directory.c?rev=361885&r1=361884&r2=361885&view=diff > ============================================================================== > --- cfe/trunk/test/Driver/working-directory.c (original) > +++ cfe/trunk/test/Driver/working-directory.c Tue May 28 15:21:47 2019 > @@ -1,3 +1,11 @@ > // RUN: %clang -### -working-directory /no/such/dir/ input 2>&1 | FileCheck > %s > +// RUN: %clang -### -working-directory %p/Inputs no_such_file.cpp -c 2>&1 | > FileCheck %s --check-prefix=CHECK_NO_FILE > +// RUN: %clang -### -working-directory %p/Inputs pchfile.cpp -c 2>&1 | > FileCheck %s --check-prefix=CHECK_WORKS > > -//CHECK: no such file or directory: '/no/such/dir/input' > +// CHECK: unable to set working directory: /no/such/dir/ > + > +// CHECK_NO_FILE: no such file or directory: 'no_such_file.cpp' > + > +// CHECK_WORKS: "-coverage-notes-file" > "{{[^"]+}}test{{/|\\\\}}Driver{{/|\\\\}}Inputs{{/|\\\\}}pchfile.gcno" > +// CHECK_WORKS: "-working-directory" > "{{[^"]+}}test{{/|\\\\}}Driver{{/|\\\\}}Inputs" > +// CHECK_WORKS: "-fdebug-compilation-dir" > "{{[^"]+}}test{{/|\\\\}}Driver{{/|\\\\}}Inputs" > > > _______________________________________________ > cfe-commits mailing list > cfe-commits@lists.llvm.org > https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits