Index: clang/lib/Driver/ToolChains/Linux.cpp =================================================================== --- clang/lib/Driver/ToolChains/Linux.cpp +++ clang/lib/Driver/ToolChains/Linux.cpp @@ -350,9 +350,21 @@ // // Note that this matches the GCC behavior. See the below comment for where // Clang diverges from GCC's behavior. - addPathIfExists(D, LibPath + "/../" + GCCTriple.str() + "/lib/../" + - OSLibDir + SelectedMultilib.osSuffix(), - Paths); + // + // On Exherbo, the GCC installation will reside in e.g. + // /usr/x86_64-pc-linux-gnu/lib/gcc/armv7-unknown-linux-gnueabihf/9.2.0 + // while the matching lib path is + // /usr/armv7-unknown-linux-gnueabihf/lib + if (Distro == Distro::Exherbo) + addPathIfExists(D, + LibPath + "/../../" + GCCTriple.str() + "/lib/../" + + OSLibDir + SelectedMultilib.osSuffix(), + Paths); + else + addPathIfExists(D, + LibPath + "/../" + GCCTriple.str() + "/lib/../" + + OSLibDir + SelectedMultilib.osSuffix(), + Paths); // If the GCC installation we found is inside of the sysroot, we want to // prefer libraries installed in the parent prefix of the GCC installation. @@ -844,6 +856,39 @@ if (getTriple().isAndroid()) MultiarchIncludeDirs = AndroidMultiarchIncludeDirs; + // Exherbo's multiarch layout is /usr//include and not + // /usr/include/ + const Distro Distro(D.getVFS()); + const StringRef ExherboMultiarchIncludeDirs[] = {"/usr/" + getTriple().str() + + "/include"}; + const StringRef ExherboX86_64MuslMultiarchIncludeDirs[] = { + "/usr/x86_64-pc-linux-musl/include"}; + const StringRef ExherboX86_64MultiarchIncludeDirs[] = { + "/usr/x86_64-pc-linux-gnu/include"}; + const StringRef ExherboI686MuslMultiarchIncludeDirs[] = { + "/usr/i686-pc-linux-musl/include"}; + const StringRef ExherboI686MultiarchIncludeDirs[] = { + "/usr/i686-pc-linux-gnu/include"}; + if (Distro == Distro::Exherbo) { + switch (getTriple().getArch()) { + case llvm::Triple::x86_64: + if (getTriple().isMusl()) + MultiarchIncludeDirs = ExherboX86_64MuslMultiarchIncludeDirs; + else + MultiarchIncludeDirs = ExherboX86_64MultiarchIncludeDirs; + break; + case llvm::Triple::x86: + if (getTriple().isMusl()) + MultiarchIncludeDirs = ExherboI686MuslMultiarchIncludeDirs; + else + MultiarchIncludeDirs = ExherboI686MultiarchIncludeDirs; + break; + default: + MultiarchIncludeDirs = ExherboMultiarchIncludeDirs; + break; + } + } + for (StringRef Dir : MultiarchIncludeDirs) { if (D.getVFS().exists(SysRoot + Dir)) { addExternCSystemInclude(DriverArgs, CC1Args, SysRoot + Dir); @@ -917,12 +962,30 @@ StringRef LibDir = GCCInstallation.getParentLibPath(); StringRef InstallDir = GCCInstallation.getInstallPath(); StringRef TripleStr = GCCInstallation.getTriple().str(); + const Driver &D = getDriver(); const Multilib &Multilib = GCCInstallation.getMultilib(); - const std::string GCCMultiarchTriple = getMultiarchTriple( - getDriver(), GCCInstallation.getTriple(), getDriver().SysRoot); + const std::string GCCMultiarchTriple = + getMultiarchTriple(D, GCCInstallation.getTriple(), D.SysRoot); const std::string TargetMultiarchTriple = - getMultiarchTriple(getDriver(), getTriple(), getDriver().SysRoot); + getMultiarchTriple(D, getTriple(), D.SysRoot); const GCCVersion &Version = GCCInstallation.getVersion(); + const Distro Distro(D.getVFS()); + + // On Exherbo the consecutive addLibStdCXXIncludePaths call would evaluate to: + // LibDir = /usr/lib/gcc//9.2.0/../../.. + // = /usr/lib/ + // LibDir + "/../include" = /usr/include + // addLibStdCXXIncludePaths would then check if "/usr/include/c++/" + // exists, and add that as include path when what we want is + // "/usr//include/c++/" + // Note that "/../../" is needed and not just "/../" as /usr/include points to + // /usr/host/include + if (Distro == Distro::Exherbo && + addLibStdCXXIncludePaths( + LibDir.str() + "/../../" + TripleStr + "/include", + "/c++/" + Version.Text, TripleStr, GCCMultiarchTriple, + TargetMultiarchTriple, Multilib.includeSuffix(), DriverArgs, CC1Args)) + return; // The primary search for libstdc++ supports multiarch variants. if (addLibStdCXXIncludePaths(LibDir.str() + "/../include", Index: clang/test/Driver/android-ndk-standalone.cpp =================================================================== --- clang/test/Driver/android-ndk-standalone.cpp +++ clang/test/Driver/android-ndk-standalone.cpp @@ -1,6 +1,8 @@ +// XFAIL: exherbo + // Test header and library paths when Clang is used with Android standalone // toolchain. -// + // RUN: %clang -no-canonical-prefixes %s -### -o %t.o 2>&1 \ // RUN: -target arm-linux-androideabi21 \ // RUN: -B%S/Inputs/basic_android_ndk_tree \ Index: clang/test/Driver/arm-multilibs.c =================================================================== --- clang/test/Driver/arm-multilibs.c +++ clang/test/Driver/arm-multilibs.c @@ -1,3 +1,5 @@ +// XFAIL: exherbo + // RUN: %clang -target armv7-linux-gnueabi --sysroot=%S/Inputs/multilib_arm_linux_tree -### -c %s -o /dev/null 2>&1 | FileCheck -check-prefix CHECK-ARM %s // RUN: %clang -target thumbv7-linux-gnueabi --sysroot=%S/Inputs/multilib_arm_linux_tree -### -c %s -o /dev/null 2>&1 | FileCheck -check-prefix CHECK-ARM %s Index: clang/test/Driver/cross-linux.c =================================================================== --- clang/test/Driver/cross-linux.c +++ clang/test/Driver/cross-linux.c @@ -1,3 +1,5 @@ +// XFAIL: exherbo + // RUN: %clang -### -o %t %s 2>&1 -no-integrated-as -fuse-ld=ld \ // RUN: --gcc-toolchain=%S/Inputs/basic_cross_linux_tree/usr \ // RUN: --target=i386-unknown-linux-gnu \ Index: clang/test/Driver/dyld-prefix.c =================================================================== --- clang/test/Driver/dyld-prefix.c +++ clang/test/Driver/dyld-prefix.c @@ -1,3 +1,5 @@ +// XFAIL: exherbo + // RUN: touch %t.o // RUN: %clang -target i386-unknown-linux --dyld-prefix /foo -### %t.o 2>&1 | FileCheck --check-prefix=CHECK-32 %s Index: clang/test/Driver/linux-header-search.cpp =================================================================== --- clang/test/Driver/linux-header-search.cpp +++ clang/test/Driver/linux-header-search.cpp @@ -1,3 +1,5 @@ +// XFAIL: exherbo + // General tests that the header search paths detected by the driver and passed // to CC1 are sane. // Index: clang/test/Driver/linux-ld.c =================================================================== --- clang/test/Driver/linux-ld.c +++ clang/test/Driver/linux-ld.c @@ -1,3 +1,5 @@ +// XFAIL: exherbo + // General tests that ld invocations on Linux targets sane. Note that we use // sysroot to make these tests independent of the host system. // Index: clang/test/Driver/mips-cs.cpp =================================================================== --- clang/test/Driver/mips-cs.cpp +++ clang/test/Driver/mips-cs.cpp @@ -1,4 +1,5 @@ // REQUIRES: mips-registered-target +// XFAIL: exherbo // // Check frontend and linker invocations on Mentor Graphics MIPS toolchain. // Index: clang/test/Driver/mips-fsf.cpp =================================================================== --- clang/test/Driver/mips-fsf.cpp +++ clang/test/Driver/mips-fsf.cpp @@ -1,4 +1,5 @@ // REQUIRES: mips-registered-target +// XFAIL: exherbo // Check frontend and linker invocations on FSF MIPS toolchain. // Index: clang/test/Driver/mips-img.cpp =================================================================== --- clang/test/Driver/mips-img.cpp +++ clang/test/Driver/mips-img.cpp @@ -1,4 +1,5 @@ // REQUIRES: mips-registered-target +// XFAIL: exherbo // Check frontend and linker invocations on the IMG MIPS toolchain. // Index: clang/test/Headers/arm-fp16-header.c =================================================================== --- clang/test/Headers/arm-fp16-header.c +++ clang/test/Headers/arm-fp16-header.c @@ -1,3 +1,5 @@ +// XFAIL: exherbo + // RUN: %clang -fsyntax-only -ffreestanding --target=aarch64-none-eabi -march=armv8.2-a+fp16 -std=c89 -xc %s // RUN: %clang -fsyntax-only -Wall -Werror -ffreestanding --target=aarch64-none-eabi -march=armv8.2-a+fp16 -std=c99 -xc %s // RUN: %clang -fsyntax-only -Wall -Werror -ffreestanding --target=aarch64-none-eabi -march=armv8.2-a+fp16 -std=c11 -xc %s Index: clang/test/Headers/arm-neon-header.c =================================================================== --- clang/test/Headers/arm-neon-header.c +++ clang/test/Headers/arm-neon-header.c @@ -1,3 +1,5 @@ +// XFAIL: exherbo + // RUN: %clang_cc1 -triple thumbv7-apple-darwin10 -target-cpu cortex-a8 -fsyntax-only -Wvector-conversions -ffreestanding %s // RUN: %clang_cc1 -triple thumbv7-apple-darwin10 -target-cpu cortex-a8 -fsyntax-only -flax-vector-conversions=none -ffreestanding %s // RUN: %clang_cc1 -x c++ -triple thumbv7-apple-darwin10 -target-cpu cortex-a8 -fsyntax-only -Wvector-conversions -ffreestanding %s Index: clang/test/lit.cfg.py =================================================================== --- clang/test/lit.cfg.py +++ clang/test/lit.cfg.py @@ -193,3 +193,6 @@ if config.enable_shared: config.available_features.add("enable_shared") + +if os.path.exists('/etc/exherbo-release'): + config.available_features.add('exherbo')