Keruspe updated this revision to Diff 229682.
Keruspe added a comment.
Herald added subscribers: ormris, atanasyan.

Mark some tests as XFAIL on exherbo because the filesystem layout is different


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D70306/new/

https://reviews.llvm.org/D70306

Files:
  clang/lib/Driver/ToolChains/Linux.cpp
  clang/test/Driver/android-ndk-standalone.cpp
  clang/test/Driver/arm-multilibs.c
  clang/test/Driver/cross-linux.c
  clang/test/Driver/dyld-prefix.c
  clang/test/Driver/linux-header-search.cpp
  clang/test/Driver/linux-ld.c
  clang/test/Driver/mips-cs.cpp
  clang/test/Driver/mips-fsf.cpp
  clang/test/Driver/mips-img.cpp
  clang/test/Headers/arm-fp16-header.c
  clang/test/Headers/arm-neon-header.c
  clang/test/lit.cfg.py

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')
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/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/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/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-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/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/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/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/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/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/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/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/<triple>/include and not
+  // /usr/include/<triple>
+  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/<triple>/9.2.0/../../..
+  //          = /usr/lib/
+  //   LibDir + "/../include" = /usr/include
+  // addLibStdCXXIncludePaths would then check if "/usr/include/c++/<version>"
+  // exists, and add that as include path when what we want is
+  // "/usr/<triple>/include/c++/<version>"
+  // 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",
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to