Author: Fangrui Song Date: 2021-03-19T15:42:18-07:00 New Revision: 4c2da8641087f7b734337a6e6306329cd2535d60
URL: https://github.com/llvm/llvm-project/commit/4c2da8641087f7b734337a6e6306329cd2535d60 DIFF: https://github.com/llvm/llvm-project/commit/4c2da8641087f7b734337a6e6306329cd2535d60.diff LOG: [Driver] Suppress GCC detection under -B In GCC, if `-B $prefix` is specified, `$prefix` is used to find executable files and startup files. `$prefix/include` is added as an include search directory. Clang overloads -B with GCC installation detection semantics which make the behavior less predictable (due to the "largest GCC version wins" rule) and interact poorly with --gcc-toolchain (--gcc-toolchain can be overridden by -B). * `clang++ foo.cpp` detects GCC installation under `/usr`. * `clang++ --gcc-toolchain=Inputs foo.cpp` detects GCC installation under `Inputs`. * `clang++ -BA --gcc-toolchain=B foo.cpp` detects GCC installation under A and B and the larger version wins. With this patch, only B is used for detection. * `clang++ -BA foo.cpp` detects GCC installation under `A` and `/usr`, and the larger GCC version wins. With this patch `A` is not used for detection. This patch changes -B to drop the GCC detection semantics. Its executable searching semantics are preserved. --gcc-toolchain is the recommended option to specify the GCC installation detection directory. ( Note: Clang detects GCC installation in various target dependent directories. `$sysroot/usr` (sysroot defaults to "") is a common directory used by most targets. Such a directory is expected to contain something like `lib{,32,64}/gcc{,-cross}/$triple`. Clang will then construct library/include paths from the directory. ) Differential Revision: https://reviews.llvm.org/D97993 Added: Modified: clang/docs/ReleaseNotes.rst clang/lib/Driver/ToolChains/Gnu.cpp clang/test/Driver/android-ndk-standalone.cpp clang/test/Driver/android-standalone.cpp clang/test/Driver/gcc-toolchain.cpp clang/test/Driver/print-multi-directory.c Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index c78445b9be6f..d4c9f53b82c0 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -72,6 +72,13 @@ Modified Compiler Flags ----------------------- - -Wshadow now also checks for shadowed structured bindings +- ``-B <prefix>`` (when ``<prefix>`` is a directory) was overloaded to additionally + detect GCC installations under ``<prefix>`` (``lib{,32,64}/gcc{,-cross}/$triple``). + This behavior was incompatible with GCC, caused interop issues with + ``--gcc-toolchain``, and was thus dropped. Specify ``--gcc-toolchain=<dir>`` + instead. ``-B``'s other GCC-compatible semantics are preserved: + ``$prefix/$triple-$file`` and ``$prefix$file`` are searched for executables, + libraries, includes, and data files used by the compiler. Removed Compiler Flags ------------------------- diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp index fbf2f29e0514..38971288e38f 100644 --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -1909,9 +1909,7 @@ void Generic_GCC::GCCInstallationDetector::init( CandidateBiarchTripleAliases); // Compute the set of prefixes for our search. - SmallVector<std::string, 8> Prefixes(D.PrefixDirs.begin(), - D.PrefixDirs.end()); - + SmallVector<std::string, 8> Prefixes; StringRef GCCToolchainDir = getGCCToolchainDir(Args, D.SysRoot); if (GCCToolchainDir != "") { if (GCCToolchainDir.back() == '/') diff --git a/clang/test/Driver/android-ndk-standalone.cpp b/clang/test/Driver/android-ndk-standalone.cpp index c4d939934782..8581963ae00d 100644 --- a/clang/test/Driver/android-ndk-standalone.cpp +++ b/clang/test/Driver/android-ndk-standalone.cpp @@ -3,7 +3,7 @@ // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target arm-linux-androideabi21 \ -// RUN: -B%S/Inputs/basic_android_ndk_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_ndk_tree \ // RUN: --sysroot=%S/Inputs/basic_android_ndk_tree/sysroot \ // RUN: | FileCheck %s // CHECK: {{.*}}clang{{.*}}" "-cc1" @@ -34,7 +34,7 @@ // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target arm-linux-androideabi14 \ -// RUN: -B%S/Inputs/basic_android_ndk_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_ndk_tree \ // RUN: --sysroot=%S/Inputs/basic_android_ndk_tree/sysroot \ // RUN: | FileCheck --check-prefix=CHECK-14 %s // CHECK-14: "-L{{.*}}/sysroot/usr/lib/arm-linux-androideabi/14" @@ -42,7 +42,7 @@ // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target arm-linux-androideabi21 -stdlib=libstdc++ \ -// RUN: -B%S/Inputs/basic_android_ndk_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_ndk_tree \ // RUN: --sysroot=%S/Inputs/basic_android_ndk_tree/sysroot \ // RUN: | FileCheck --check-prefix=CHECK-STDCXX %s // CHECK-STDCXX: {{.*}}clang{{.*}}" "-cc1" @@ -76,7 +76,7 @@ // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target armv7a-none-linux-androideabi21 \ -// RUN: -B%S/Inputs/basic_android_ndk_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_ndk_tree \ // RUN: --sysroot=%S/Inputs/basic_android_ndk_tree/sysroot \ // RUN: | FileCheck --check-prefix=CHECK-ARMV7 %s // CHECK-ARMV7: {{.*}}clang{{.*}}" "-cc1" @@ -109,19 +109,19 @@ // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target arm-linux-androideabi21 \ // RUN: -march=armv7 \ -// RUN: -B%S/Inputs/basic_android_ndk_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_ndk_tree \ // RUN: --sysroot=%S/Inputs/basic_android_ndk_tree/sysroot \ // RUN: | FileCheck --check-prefix=CHECK-ARMV7 %s // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target arm-linux-androideabi21 \ // RUN: -march=armv7a \ -// RUN: -B%S/Inputs/basic_android_ndk_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_ndk_tree \ // RUN: --sysroot=%S/Inputs/basic_android_ndk_tree/sysroot \ // RUN: | FileCheck --check-prefix=CHECK-ARMV7 %s // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target arm-linux-androideabi21 \ // RUN: -march=armv7-a \ -// RUN: -B%S/Inputs/basic_android_ndk_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_ndk_tree \ // RUN: --sysroot=%S/Inputs/basic_android_ndk_tree/sysroot \ // RUN: | FileCheck --check-prefix=CHECK-ARMV7 %s // @@ -129,7 +129,7 @@ // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target arm-linux-androideabi21 \ // RUN: -mthumb \ -// RUN: -B%S/Inputs/basic_android_ndk_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_ndk_tree \ // RUN: --sysroot=%S/Inputs/basic_android_ndk_tree/sysroot \ // RUN: | FileCheck --check-prefix=CHECK-THUMB %s // CHECK-THUMB: {{.*}}clang{{.*}}" "-cc1" @@ -163,7 +163,7 @@ // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target arm-linux-androideabi21 \ // RUN: -march=armv7-a -mthumb \ -// RUN: -B%S/Inputs/basic_android_ndk_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_ndk_tree \ // RUN: --sysroot=%S/Inputs/basic_android_ndk_tree/sysroot \ // RUN: | FileCheck --check-prefix=CHECK-ARMV7THUMB %s // CHECK-ARMV7THUMB: {{.*}}clang{{.*}}" "-cc1" @@ -195,7 +195,7 @@ // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target arm-linux-androideabi21 \ // RUN: -march=armv7-a -mthumb \ -// RUN: -B%S/Inputs/basic_android_ndk_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_ndk_tree \ // RUN: --sysroot=%S/Inputs/basic_android_ndk_tree/sysroot \ // RUN: -print-multi-lib \ // RUN: | FileCheck --check-prefix=CHECK-ARM-MULTILIBS %s @@ -209,13 +209,13 @@ // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target armv7a-none-linux-androideabi21 \ // RUN: -mthumb \ -// RUN: -B%S/Inputs/basic_android_ndk_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_ndk_tree \ // RUN: --sysroot=%S/Inputs/basic_android_ndk_tree/sysroot \ // RUN: | FileCheck --check-prefix=CHECK-ARMV7THUMB %s // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target aarch64-linux-android21 \ -// RUN: -B%S/Inputs/basic_android_ndk_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_ndk_tree \ // RUN: --sysroot=%S/Inputs/basic_android_ndk_tree/sysroot \ // RUN: | FileCheck --check-prefix=CHECK-AARCH64 %s // CHECK-AARCH64: {{.*}}clang{{.*}}" "-cc1" @@ -231,7 +231,7 @@ // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target arm64-linux-android21 \ -// RUN: -B%S/Inputs/basic_android_ndk_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_ndk_tree \ // RUN: --sysroot=%S/Inputs/basic_android_ndk_tree/sysroot \ // RUN: | FileCheck --check-prefix=CHECK-ARM64 %s // CHECK-ARM64: {{.*}}clang{{.*}}" "-cc1" @@ -248,7 +248,7 @@ // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target mipsel-linux-android21 \ // RUN: -mips32 \ -// RUN: -B%S/Inputs/basic_android_ndk_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_ndk_tree \ // RUN: --sysroot=%S/Inputs/basic_android_ndk_tree/sysroot \ // RUN: | FileCheck --check-prefix=CHECK-MIPS %s // CHECK-MIPS: {{.*}}clang{{.*}}" "-cc1" @@ -263,7 +263,7 @@ // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target i686-linux-android21 \ -// RUN: -B%S/Inputs/basic_android_ndk_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_ndk_tree \ // RUN: --sysroot=%S/Inputs/basic_android_ndk_tree/sysroot \ // RUN: | FileCheck --check-prefix=CHECK-I686 %s // CHECK-I686: {{.*}}clang{{.*}}" "-cc1" @@ -279,7 +279,7 @@ // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target x86_64-linux-android21 \ -// RUN: -B%S/Inputs/basic_android_ndk_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_ndk_tree \ // RUN: --sysroot=%S/Inputs/basic_android_ndk_tree/sysroot \ // RUN: | FileCheck --check-prefix=CHECK-X86_64 %s // CHECK-X86_64: {{.*}}clang{{.*}}" "-cc1" diff --git a/clang/test/Driver/android-standalone.cpp b/clang/test/Driver/android-standalone.cpp index 0f8cf0b1355e..c238fc734716 100644 --- a/clang/test/Driver/android-standalone.cpp +++ b/clang/test/Driver/android-standalone.cpp @@ -3,7 +3,7 @@ // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target arm-linux-androideabi -stdlib=libstdc++ \ -// RUN: -B%S/Inputs/basic_android_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_tree \ // RUN: --sysroot=%S/Inputs/basic_android_tree/sysroot \ // RUN: | FileCheck %s // CHECK: {{.*}}clang{{.*}}" "-cc1" @@ -18,7 +18,7 @@ // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target aarch64-linux-android -stdlib=libstdc++ \ -// RUN: -B%S/Inputs/basic_android_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_tree \ // RUN: --sysroot=%S/Inputs/basic_android_tree/sysroot \ // RUN: | FileCheck --check-prefix=CHECK-AARCH64 %s // CHECK-AARCH64: {{.*}}clang{{.*}}" "-cc1" @@ -33,7 +33,7 @@ // // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target arm64-linux-android -stdlib=libstdc++ \ -// RUN: -B%S/Inputs/basic_android_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_tree \ // RUN: --sysroot=%S/Inputs/basic_android_tree/sysroot \ // RUN: | FileCheck --check-prefix=CHECK-ARM64 %s // CHECK-ARM64: {{.*}}clang{{.*}}" "-cc1" @@ -49,7 +49,7 @@ // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target mipsel-linux-android \ // RUN: -mips32 -stdlib=libstdc++ \ -// RUN: -B%S/Inputs/basic_android_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_tree \ // RUN: --sysroot=%S/Inputs/basic_android_tree/sysroot \ // RUN: | FileCheck --check-prefix=CHECK-MIPS %s // CHECK-MIPS: {{.*}}clang{{.*}}" "-cc1" @@ -65,7 +65,7 @@ // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target mipsel-linux-android \ // RUN: -march=mips32 -mips32r2 -stdlib=libstdc++ \ -// RUN: -B%S/Inputs/basic_android_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_tree \ // RUN: --sysroot=%S/Inputs/basic_android_tree/sysroot \ // RUN: | FileCheck --check-prefix=CHECK-MIPSR2 %s // CHECK-MIPSR2: {{.*}}clang{{.*}}" "-cc1" @@ -81,7 +81,7 @@ // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target mipsel-linux-android \ // RUN: -mips32 -march=mips32r2 -stdlib=libstdc++ \ -// RUN: -B%S/Inputs/basic_android_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_tree \ // RUN: --sysroot=%S/Inputs/basic_android_tree/sysroot \ // RUN: | FileCheck --check-prefix=CHECK-MIPSR2-A %s // CHECK-MIPSR2-A: {{.*}}clang{{.*}}" "-cc1" diff --git a/clang/test/Driver/gcc-toolchain.cpp b/clang/test/Driver/gcc-toolchain.cpp index 6c872f4255c3..cddf9b1bdbca 100644 --- a/clang/test/Driver/gcc-toolchain.cpp +++ b/clang/test/Driver/gcc-toolchain.cpp @@ -29,3 +29,14 @@ // CHECK: "{{[^"]*}}/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5{{/|\\\\}}crtbegin.o" // CHECK: "-L[[TOOLCHAIN]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5" // CHECK: "-L[[TOOLCHAIN]]/usr/lib/i386-linux-gnu/gcc/i686-linux-gnu/4.5/../../../.." + +/// Test we don't detect GCC installation under -B. +// RUN: %clangxx -no-canonical-prefixes %s -### -o %t 2>&1 \ +// RUN: --target=aarch64-suse-linux --gcc-toolchain=%S/Inputs/opensuse_42.2_aarch64_tree/usr | \ +// RUN: FileCheck %s --check-prefix=AARCH64 +// RUN: %clangxx -no-canonical-prefixes %s -### -o %t 2>&1 \ +// RUN: --target=aarch64-suse-linux -B%S/Inputs/opensuse_42.2_aarch64_tree/usr | \ +// RUN: FileCheck %s --check-prefix=NO_AARCH64 + +// AARCH64: Inputs{{[^"]+}}aarch64-suse-linux/{{[^"]+}}crt1.o" +// NO_AARCH64-NOT: Inputs{{[^"]+}}aarch64-suse-linux/{{[^"]+}}crt1.o" diff --git a/clang/test/Driver/print-multi-directory.c b/clang/test/Driver/print-multi-directory.c index 5fb6a118e115..2504c28ba994 100644 --- a/clang/test/Driver/print-multi-directory.c +++ b/clang/test/Driver/print-multi-directory.c @@ -19,7 +19,7 @@ // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>/dev/null \ // RUN: -target arm-linux-androideabi21 \ // RUN: -mthumb \ -// RUN: -B%S/Inputs/basic_android_ndk_tree \ +// RUN: --gcc-toolchain=%S/Inputs/basic_android_ndk_tree \ // RUN: --sysroot=%S/Inputs/basic_android_ndk_tree/sysroot \ // RUN: -print-multi-directory \ // RUN: | FileCheck --match-full-lines --check-prefix=CHECK-ARM-MULTILIBS %s _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits