Author: jkorous Date: Tue Oct 15 10:51:59 2019 New Revision: 374926 URL: http://llvm.org/viewvc/llvm-project?rev=374926&view=rev Log: Reland [Driver] Fix -working-directory issues
Don't change the default VFS in Driver, update tests & reland. This reverts commit 999f8a7416f8edc54ef92e715fd23c532bcc74d4. 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/gen-cdb-fragment.c 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=374926&r1=374925&r2=374926&view=diff ============================================================================== --- cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td (original) +++ cfe/trunk/include/clang/Basic/DiagnosticDriverKinds.td Tue Oct 15 10:51:59 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=374926&r1=374925&r2=374926&view=diff ============================================================================== --- cfe/trunk/lib/Driver/Driver.cpp (original) +++ cfe/trunk/lib/Driver/Driver.cpp Tue Oct 15 10:51:59 2019 @@ -1012,6 +1012,11 @@ Compilation *Driver::BuildCompilation(Ar } } + // Check for working directory option before accessing any files + if (Arg *WD = Args.getLastArg(options::OPT_working_directory)) + if (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; @@ -1993,20 +1998,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; @@ -2032,12 +2028,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=374926&r1=374925&r2=374926&view=diff ============================================================================== --- cfe/trunk/lib/Driver/ToolChains/Clang.cpp (original) +++ cfe/trunk/lib/Driver/ToolChains/Clang.cpp Tue Oct 15 10:51:59 2019 @@ -519,16 +519,15 @@ getFramePointerKind(const ArgList &Args, } /// Add a CC1 option to specify the debug compilation directory. -static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) { +static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs, + const llvm::vfs::FileSystem &VFS) { if (Arg *A = Args.getLastArg(options::OPT_fdebug_compilation_dir)) { CmdArgs.push_back("-fdebug-compilation-dir"); CmdArgs.push_back(A->getValue()); - } else { - SmallString<128> cwd; - if (!llvm::sys::fs::current_path(cwd)) { - CmdArgs.push_back("-fdebug-compilation-dir"); - CmdArgs.push_back(Args.MakeArgString(cwd)); - } + } else if (llvm::ErrorOr<std::string> CWD = + VFS.getCurrentWorkingDirectory()) { + CmdArgs.push_back("-fdebug-compilation-dir"); + CmdArgs.push_back(Args.MakeArgString(*CWD)); } } @@ -808,13 +807,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("-coverage-notes-file"); @@ -1937,13 +1931,14 @@ void Clang::DumpCompilationDatabase(Comp CompilationDatabase = std::move(File); } auto &CDB = *CompilationDatabase; - SmallString<128> Buf; - if (llvm::sys::fs::current_path(Buf)) - Buf = "."; - CDB << "{ \"directory\": \"" << escape(Buf) << "\""; + auto CWD = D.getVFS().getCurrentWorkingDirectory(); + if (!CWD) + CWD = "."; + CDB << "{ \"directory\": \"" << escape(*CWD) << "\""; CDB << ", \"file\": \"" << escape(Input.getFilename()) << "\""; CDB << ", \"output\": \"" << escape(Output.getFilename()) << "\""; CDB << ", \"arguments\": [\"" << escape(D.ClangExecutable) << "\""; + SmallString<128> Buf; Buf = "-x"; Buf += types::getTypeName(Input.getType()); CDB << ", \"" << escape(Buf) << "\""; @@ -4377,7 +4372,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); @@ -6138,7 +6133,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/gen-cdb-fragment.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/gen-cdb-fragment.c?rev=374926&r1=374925&r2=374926&view=diff ============================================================================== --- cfe/trunk/test/Driver/gen-cdb-fragment.c (original) +++ cfe/trunk/test/Driver/gen-cdb-fragment.c Tue Oct 15 10:51:59 2019 @@ -15,6 +15,14 @@ // RUN: %clang -target x86_64-apple-macos10.15 -S %s -o - -gen-cdb-fragment-path %t.cdb // RUN: ls %t.cdb | FileCheck --check-prefix=CHECK-LS %s +// Working directory arg is respected. +// RUN: rm -rf %t.cdb +// RUN: mkdir %t.cdb +// RUN: %clang -target x86_64-apple-macos10.15 -working-directory %t.cdb -c %s -o - -gen-cdb-fragment-path "." +// RUN: ls %t.cdb | FileCheck --check-prefix=CHECK-LS %s +// RUN: cat %t.cdb/*.json | FileCheck --check-prefix=CHECK-CWD %s +// CHECK-CWD: "directory": "{{.*}}.cdb" + // -### does not emit the CDB fragment // RUN: rm -rf %t.cdb // RUN: mkdir %t.cdb Modified: cfe/trunk/test/Driver/working-directory.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/working-directory.c?rev=374926&r1=374925&r2=374926&view=diff ============================================================================== --- cfe/trunk/test/Driver/working-directory.c (original) +++ cfe/trunk/test/Driver/working-directory.c Tue Oct 15 10:51:59 2019 @@ -1,3 +1,12 @@ -// RUN: %clang -### -working-directory /no/such/dir/ input 2>&1 | FileCheck %s +// RUN: %clang -### -coverage -working-directory /no/such/dir/ input 2>&1 | FileCheck %s +// RUN: %clang -### -coverage -working-directory %p/Inputs no_such_file.cpp -c 2>&1 | FileCheck %s --check-prefix=CHECK_NO_FILE +// RUN: %clang -### -coverage -working-directory %p/Inputs pchfile.cpp -c 2>&1 | FileCheck %s --check-prefix=CHECK_WORKS +// RUN: fail please -//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