-
Notifications
You must be signed in to change notification settings - Fork 12.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[clang][Driver] Correct tool search path priority
Summary: As seen in: https://bugs.llvm.org/show_bug.cgi?id=45693 When clang looks for a tool it has a set of possible names for it, in priority order. Previously it would look for these names in the program path. Then look for all the names in the PATH. This means that aarch64-none-elf-gcc on the PATH would lose to gcc in the program path. (which was /usr/bin in the bug's case) This changes that logic to search each name in both possible locations, then move to the next name. Which is more what you would expect to happen when using a non default triple. (-B prefixes maybe should follow this logic too, but are not changed in this patch) Subscribers: kristof.beyls, cfe-commits Tags: #clang Differential Revision: https://reviews.llvm.org/D79988
- Loading branch information
1 parent
4bcd08e
commit 028571d
Showing
3 changed files
with
131 additions
and
16 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,106 @@ | ||
/// Don't create symlinks on Windows | ||
// UNSUPPORTED: system-windows | ||
|
||
/// Check the priority used when searching for tools | ||
/// Names and locations are usually in this order: | ||
/// <triple>-tool, tool, <default triple>-tool | ||
/// program path, PATH | ||
/// (from highest to lowest priority) | ||
/// A higher priority name found in a lower priority | ||
/// location will win over a lower priority name in a | ||
/// higher priority location. | ||
/// Prefix dirs (added with -B) override the location, | ||
/// so only name priority is accounted for, unless we fail to find | ||
/// anything at all in the prefix. | ||
|
||
/// Copy clang to a new dir which will be its | ||
/// "program path" for these tests | ||
// RUN: rm -rf %t && mkdir -p %t | ||
// RUN: ln -s %clang %t/clang | ||
|
||
/// No gccs at all, nothing is found | ||
// RUN: env "PATH=" %t/clang -### -target notreal-none-elf %s 2>&1 | \ | ||
// RUN: FileCheck --check-prefix=NO_NOTREAL_GCC %s | ||
// NO_NOTREAL_GCC-NOT: notreal-none-elf-gcc | ||
// NO_NOTREAL_GCC-NOT: /gcc | ||
|
||
/// <triple>-gcc in program path is found | ||
// RUN: touch %t/notreal-none-elf-gcc && chmod +x %t/notreal-none-elf-gcc | ||
// RUN: env "PATH=" %t/clang -### -target notreal-none-elf %s 2>&1 | \ | ||
// RUN: FileCheck --check-prefix=PROG_PATH_NOTREAL_GCC %s | ||
// PROG_PATH_NOTREAL_GCC: notreal-none-elf-gcc | ||
|
||
/// <triple>-gcc on the PATH is found | ||
// RUN: mkdir -p %t/env | ||
// RUN: rm %t/notreal-none-elf-gcc | ||
// RUN: touch %t/env/notreal-none-elf-gcc && chmod +x %t/env/notreal-none-elf-gcc | ||
// RUN: env "PATH=%t/env/" %t/clang -### -target notreal-none-elf %s 2>&1 | \ | ||
// RUN: FileCheck --check-prefix=ENV_PATH_NOTREAL_GCC %s | ||
// ENV_PATH_NOTREAL_GCC: env/notreal-none-elf-gcc | ||
|
||
/// <triple>-gcc in program path is preferred to one on the PATH | ||
// RUN: touch %t/notreal-none-elf-gcc && chmod +x %t/notreal-none-elf-gcc | ||
// RUN: env "PATH=%t/env/" %t/clang -### -target notreal-none-elf %s 2>&1 | \ | ||
// RUN: FileCheck --check-prefix=BOTH_NOTREAL_GCC %s | ||
// BOTH_NOTREAL_GCC: notreal-none-elf-gcc | ||
// BOTH_NOTREAL_GCC-NOT: env/notreal-none-elf-gcc | ||
|
||
/// On program path, <triple>-gcc is preferred to plain gcc | ||
// RUN: touch %t/gcc && chmod +x %t/gcc | ||
// RUN: env "PATH=" %t/clang -### -target notreal-none-elf %s 2>&1 | \ | ||
// RUN: FileCheck --check-prefix=NOTREAL_GCC_PREFERRED %s | ||
// NOTREAL_GCC_PREFERRED: notreal-none-elf-gcc | ||
// NOTREAL_GCC_PREFERRED-NOT: /gcc | ||
|
||
/// <triple>-gcc on the PATH is preferred to gcc in program path | ||
// RUN: rm %t/notreal-none-elf-gcc | ||
// RUN: env "PATH=%t/env/" %t/clang -### -target notreal-none-elf %s 2>&1 | \ | ||
// RUN: FileCheck --check-prefix=NOTREAL_PATH_OVER_GCC_PROG %s | ||
// NOTREAL_PATH_OVER_GCC_PROG: env/notreal-none-elf-gcc | ||
// NOTREAL_PATH_OVER_GCC_PROG-NOT: /gcc | ||
|
||
/// <triple>-gcc on the PATH is preferred to gcc on the PATH | ||
// RUN: rm %t/gcc | ||
// RUN: touch %t/env/gcc && chmod +x %t/env/gcc | ||
// RUN: env "PATH=%t/env/" %t/clang -### -target notreal-none-elf %s 2>&1 | \ | ||
// RUN: FileCheck --check-prefix=NOTREAL_PATH_OVER_GCC_PATH %s | ||
// NOTREAL_PATH_OVER_GCC_PATH: env/notreal-none-elf-gcc | ||
// NOTREAL_PATH_OVER_GCC_PATH-NOT: /gcc | ||
|
||
/// <default-triple>-gcc has lowest priority so <triple>-gcc | ||
/// on PATH beats default triple in program path | ||
// RUN: touch %t/%target_triple-gcc && chmod +x %t/%target_triple-gcc | ||
// RUN: env "PATH=%t/env/" %t/clang -### -target notreal-none-elf %s 2>&1 | \ | ||
// RUN: FileCheck --check-prefix=DEFAULT_TRIPLE_GCC %s | ||
// DEFAULT_TRIPLE_GCC: env/notreal-none-elf-gcc | ||
|
||
/// plain gcc on PATH beats default triple in program path | ||
// RUN: rm %t/env/notreal-none-elf-gcc | ||
// RUN: env "PATH=%t/env/" %t/clang -### -target notreal-none-elf %s 2>&1 | \ | ||
// RUN: FileCheck --check-prefix=DEFAULT_TRIPLE_NO_NOTREAL %s | ||
// DEFAULT_TRIPLE_NO_NOTREAL: env/gcc | ||
// DEFAULT_TRIPLE_NO_NOTREAL-NOT: -gcc | ||
|
||
/// default triple only chosen when no others are present | ||
// RUN: rm %t/env/gcc | ||
// RUN: env "PATH=%t/env/" %t/clang -### -target notreal-none-elf %s 2>&1 | \ | ||
// RUN: FileCheck --check-prefix=DEFAULT_TRIPLE_NO_OTHERS %s | ||
// DEFAULT_TRIPLE_NO_OTHERS: -gcc | ||
// DEFAULT_TRIPLE_NO_OTHERS-NOT: notreal-none-elf-gcc | ||
// DEFAULT_TRIPLE_NO_OTHERS-NOT: /gcc | ||
|
||
/// -B paths are searched separately so default triple will win | ||
/// if put in one of those even if other paths have higher priority names | ||
// RUN: mkdir -p %t/prefix | ||
// RUN: mv %t/%target_triple-gcc %t/prefix | ||
// RUN: touch %t/notreal-none-elf-gcc && chmod +x %t/notreal-none-elf-gcc | ||
// RUN: env "PATH=" %t/clang -### -target notreal-none-elf %s -B %t/prefix 2>&1 | \ | ||
// RUN: FileCheck --check-prefix=DEFAULT_TRIPLE_IN_PREFIX %s | ||
// DEFAULT_TRIPLE_IN_PREFIX: prefix/{{.*}}-gcc | ||
// DEFAULT_TRIPLE_IN_PREFIX-NOT: notreal-none-elf-gcc | ||
|
||
/// Only if there is nothing in the prefix will we search other paths | ||
// RUN: rm %t/prefix/%target_triple-gcc | ||
// RUN: env "PATH=" %t/clang -### -target notreal-none-elf %s -B %t/prefix 2>&1 | \ | ||
// RUN: FileCheck --check-prefix=EMPTY_PREFIX_DIR %s | ||
// EMPTY_PREFIX_DIR: notreal-none-elf-gcc |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters