r361885 - [Driver] Fix -working-directory issues

Hans Wennborg via cfe-commits cfe-commits at lists.llvm.org
Thu Sep 5 01:46:18 PDT 2019


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 at 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 at lists.llvm.org
> https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits


More information about the cfe-commits mailing list