From 9ade6a9a747c49383ac747bd8ffaa6a0beaef71c Mon Sep 17 00:00:00 2001 From: Chandler Carruth Date: Wed, 5 Aug 2015 17:07:33 +0000 Subject: [PATCH] Fix a tiny bug in -no-canonical-prefixes that somehow we have never noticed until now. The code for setting up the driver's InstalledDir didn't respect -no-canonical-prefixes. Because of this, there are a few places in the driver where we would unexpectedly form absolute paths, notably when searching for and finding GCC installations to use, etc. The fix is straightforward, and I've added this path to '-v' both so we can test it sanely and so that it will be substantially more obvious the next time someone has to debug something here. Note that there is another bug that we don't actually *canonicalize* the installed directory! I don't really want to fix that because I don't have a realistic way to test the usage of this mode. I suspect that folks using the shared module cache would care about getting this right though, and so they might want to address it. I've left the appropriate FIXMEs so that it is clear what to change, and I've updated the test code to make it clear what is happening here. llvm-svn: 244065 --- clang/lib/Driver/Driver.cpp | 3 +++ clang/test/Driver/no-canonical-prefixes.c | 22 ++++++++++++++-------- clang/tools/driver/driver.cpp | 10 +++++++--- 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp index a39f7fc..548baf3 100644 --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -762,6 +762,9 @@ void Driver::PrintVersion(const Compilation &C, raw_ostream &OS) const { } else OS << "Thread model: " << TC.getThreadModel(); OS << '\n'; + + // Print out the install directory. + OS << "InstalledDir: " << InstalledDir << '\n'; } /// PrintDiagnosticCategories - Implement the --print-diagnostic-categories diff --git a/clang/test/Driver/no-canonical-prefixes.c b/clang/test/Driver/no-canonical-prefixes.c index b617cd4..7bc76be 100644 --- a/clang/test/Driver/no-canonical-prefixes.c +++ b/clang/test/Driver/no-canonical-prefixes.c @@ -1,11 +1,17 @@ // Due to ln -sf: // REQUIRES: shell -// RUN: mkdir -p %t -// RUN: cd %t +// RUN: mkdir -p %t.real +// RUN: cd %t.real // RUN: ln -sf %clang test-clang -// RUN: ./test-clang -v -S %s 2>&1 | FileCheck %s -// RUN: ./test-clang -v -S %s -no-canonical-prefixes 2>&1 | FileCheck --check-prefix=NCP %s - - -// CHECK: /clang{{.*}}" -cc1 -// NCP: test-clang" -cc1 +// RUN: cd .. +// RUN: ln -sf %t.real %t.fake +// RUN: cd %t.fake +// RUN: ./test-clang -v -S %s 2>&1 | FileCheck --check-prefix=CANONICAL %s +// RUN: ./test-clang -v -S %s -no-canonical-prefixes 2>&1 | FileCheck --check-prefix=NON-CANONICAL %s +// +// FIXME: This should really be '.real'. +// CANONICAL: InstalledDir: {{.*}}.fake +// CANONICAL: {{[/|\\]*}}clang{{.*}}" -cc1 +// +// NON-CANONICAL: InstalledDir: .{{$}} +// NON-CANONICAL: test-clang" -cc1 diff --git a/clang/tools/driver/driver.cpp b/clang/tools/driver/driver.cpp index d6817a8..40c5a61 100644 --- a/clang/tools/driver/driver.cpp +++ b/clang/tools/driver/driver.cpp @@ -344,7 +344,7 @@ CreateAndPopulateDiagOpts(ArrayRef argv) { } static void SetInstallDir(SmallVectorImpl &argv, - Driver &TheDriver) { + Driver &TheDriver, bool CanonicalPrefixes) { // Attempt to find the original path used to invoke the driver, to determine // the installed path. We do this manually, because we want to support that // path being a symlink. @@ -355,7 +355,11 @@ static void SetInstallDir(SmallVectorImpl &argv, if (llvm::ErrorOr Tmp = llvm::sys::findProgramByName( llvm::sys::path::filename(InstalledPath.str()))) InstalledPath = *Tmp; - llvm::sys::fs::make_absolute(InstalledPath); + + // FIXME: We don't actually canonicalize this, we just make it absolute. + if (CanonicalPrefixes) + llvm::sys::fs::make_absolute(InstalledPath); + InstalledPath = llvm::sys::path::parent_path(InstalledPath); if (llvm::sys::fs::exists(InstalledPath.c_str())) TheDriver.setInstalledDir(InstalledPath); @@ -473,7 +477,7 @@ int main(int argc_, const char **argv_) { ProcessWarningOptions(Diags, *DiagOpts, /*ReportDiags=*/false); Driver TheDriver(Path, llvm::sys::getDefaultTargetTriple(), Diags); - SetInstallDir(argv, TheDriver); + SetInstallDir(argv, TheDriver, CanonicalPrefixes); llvm::InitializeAllTargets(); insertArgsFromProgramName(ProgName, DS, argv, SavedStrings); -- 2.7.4