diff --git a/clang/lib/Driver/ToolChain.cpp b/clang/lib/Driver/ToolChain.cpp --- a/clang/lib/Driver/ToolChain.cpp +++ b/clang/lib/Driver/ToolChain.cpp @@ -537,7 +537,17 @@ path_list Paths; auto addPathForTriple = [this, &Paths](const llvm::Triple &Triple) { SmallString<128> P(D.ResourceDir); - llvm::sys::path::append(P, "lib", Triple.str()); + llvm::Triple CanonicalTriple; + if (Triple.hasEnvironment()) + CanonicalTriple = + llvm::Triple(llvm::Triple::getArchTypeName(Triple.getArch()), + Triple.getVendorName(), Triple.getOSName(), + Triple.getEnvironmentName()); + else + CanonicalTriple = + llvm::Triple(llvm::Triple::getArchTypeName(Triple.getArch()), + Triple.getVendorName(), Triple.getOSName()); + llvm::sys::path::append(P, "lib", CanonicalTriple.str()); Paths.push_back(std::string(P.str())); }; diff --git a/clang/test/Driver/Inputs/debian_sparc64_tree/lib/sparc64-linux-gnu/Scrt1.o b/clang/test/Driver/Inputs/debian_sparc64_tree/lib/sparc64-linux-gnu/Scrt1.o new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_sparc64_tree/lib/sparc64-linux-gnu/crti.o b/clang/test/Driver/Inputs/debian_sparc64_tree/lib/sparc64-linux-gnu/crti.o new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_sparc64_tree/lib/sparc64-linux-gnu/crtn.o b/clang/test/Driver/Inputs/debian_sparc64_tree/lib/sparc64-linux-gnu/crtn.o new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_sparc64_tree/usr/lib/gcc/sparc64-linux-gnu/12/crtbeginS.o b/clang/test/Driver/Inputs/debian_sparc64_tree/usr/lib/gcc/sparc64-linux-gnu/12/crtbeginS.o new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_sparc64_tree/usr/lib/gcc/sparc64-linux-gnu/12/crtendS.o b/clang/test/Driver/Inputs/debian_sparc64_tree/usr/lib/gcc/sparc64-linux-gnu/12/crtendS.o new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_sparc64_tree/usr/lib/gcc/sparc64-linux-gnu/12/libgcc.a b/clang/test/Driver/Inputs/debian_sparc64_tree/usr/lib/gcc/sparc64-linux-gnu/12/libgcc.a new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_sparc64_tree/usr/lib/gcc/sparc64-linux-gnu/12/libgcc_s.so b/clang/test/Driver/Inputs/debian_sparc64_tree/usr/lib/gcc/sparc64-linux-gnu/12/libgcc_s.so new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_sparc64_tree/usr/lib/sparc64-linux-gnu/libc.so b/clang/test/Driver/Inputs/debian_sparc64_tree/usr/lib/sparc64-linux-gnu/libc.so new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_sparc64_tree/usr/lib/sparc64-linux-gnu/libdl.so b/clang/test/Driver/Inputs/debian_sparc64_tree/usr/lib/sparc64-linux-gnu/libdl.so new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_sparc64_tree/usr/lib/sparc64-linux-gnu/libm.so b/clang/test/Driver/Inputs/debian_sparc64_tree/usr/lib/sparc64-linux-gnu/libm.so new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_sparc64_tree/usr/lib/sparc64-linux-gnu/libpthread.so b/clang/test/Driver/Inputs/debian_sparc64_tree/usr/lib/sparc64-linux-gnu/libpthread.so new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_sparc64_tree/usr/lib/sparc64-linux-gnu/libresolv.so b/clang/test/Driver/Inputs/debian_sparc64_tree/usr/lib/sparc64-linux-gnu/libresolv.so new file mode 100644 diff --git a/clang/test/Driver/Inputs/debian_sparc64_tree/usr/lib/sparc64-linux-gnu/librt.so b/clang/test/Driver/Inputs/debian_sparc64_tree/usr/lib/sparc64-linux-gnu/librt.so new file mode 100644 diff --git a/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/sparcv9-unknown-linux-gnu/libclang_rt.ubsan_standalone.a b/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/sparcv9-unknown-linux-gnu/libclang_rt.ubsan_standalone.a new file mode 100644 diff --git a/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/x86_64-pc-solaris2.11/libclang_rt.ubsan_standalone.a b/clang/test/Driver/Inputs/resource_dir_with_per_target_subdir/lib/x86_64-pc-solaris2.11/libclang_rt.ubsan_standalone.a new file mode 100644 diff --git a/clang/test/Driver/noncanon-per-target-runtime-dir.c b/clang/test/Driver/noncanon-per-target-runtime-dir.c new file mode 100644 --- /dev/null +++ b/clang/test/Driver/noncanon-per-target-runtime-dir.c @@ -0,0 +1,20 @@ +/// Check that clang's and compiler-rt's ideas of per-target runtime dirs match. + +// RUN: %clang -### %s 2>&1 \ +// RUN: --target=amd64-pc-solaris2.11 -fsanitize=undefined \ +// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \ +// RUN: --sysroot=%S/Inputs/solaris_x86_tree \ +// RUN: | FileCheck --check-prefix=CHECK-SOLARIS-AMD64 %s + +// CHECK-SOLARIS-AMD64: x86_64-pc-solaris2.11/libclang_rt.ubsan_standalone.a +// CHECK-SOLARIS-AMD64-NOT: lib/sunos/libclang_rt.ubsan_standalone-x86_64.a" + +// RUN: %clang -### %s 2>&1 \ +// RUN: --target=sparc64-unknown-linux-gnu -fsanitize=undefined \ +// RUN: -resource-dir=%S/Inputs/resource_dir_with_per_target_subdir \ +// RUN: --sysroot=%S/Inputs/debian_sparc64_tree \ +// RUN: | FileCheck --check-prefix=CHECK-DEBIAN-SPARC64 %s + +// CHECK-DEBIAN-SPARC64: sparcv9-unknown-linux-gnu/libclang_rt.ubsan_standalone.a +// CHECK-DEBIAN-SPARC64-NOT: lib/linux/libclang_rt.ubsan_standalone-sparcv9.a" + diff --git a/clang/test/Driver/runtime-layout.c b/clang/test/Driver/runtime-layout.c new file mode 100644 --- /dev/null +++ b/clang/test/Driver/runtime-layout.c @@ -0,0 +1,56 @@ +/// Check that clang's idea of runtime dir layout matches e.g. compiler-rt's. + +/// Classical runtime layout. +// RUN: mkdir -p %t-classic/lib/sunos + +/// Canonical triple, 64-bit. +// RUN: %clang -print-runtime-dir --target=x86_64-pc-solaris2.11 \ +// RUN: -resource-dir=%t-classic \ +// RUN: | FileCheck --check-prefix=RUNTIME-DIR-CLASSIC %s + +/// Non-canonical triple, 64-bit. +// RUN: %clang -print-runtime-dir --target=amd64-pc-solaris2.11 \ +// RUN: -resource-dir=%t-classic \ +// RUN: | FileCheck --check-prefix=RUNTIME-DIR-CLASSIC %s + +/// Canonical triple, 32-bit. +// RUN: %clang -print-runtime-dir --target=i386-pc-solaris2.11 \ +// RUN: -resource-dir=%t-classic \ +// RUN: | FileCheck --check-prefix=RUNTIME-DIR-CLASSIC %s + +/// Non-canonical triple, 32-bit. +// RUN: %clang -print-runtime-dir --target=i686-pc-solaris2.11 \ +// RUN: -resource-dir=%t-classic \ +// RUN: | FileCheck --check-prefix=RUNTIME-DIR-CLASSIC %s + +// RUNTIME-DIR-CLASSIC: {{.*}}/lib/sunos + +/// New runtime layout. + +// RUN: mkdir -p %t-runtime/lib/x86_64-pc-solaris2.11 + +/// Canonical triple, 64-bit. +// RUN: %clang -print-runtime-dir --target=x86_64-pc-solaris2.11 \ +// RUN: -resource-dir=%t-runtime \ +// RUN: | FileCheck --check-prefix=RUNTIME-DIR-X86_64 %s + +/// Non-canonical triple, 64-bit. +// RUN: %clang -print-runtime-dir --target=amd64-pc-solaris2.11 \ +// RUN: -resource-dir=%t-runtime \ +// RUN: | FileCheck --check-prefix=RUNTIME-DIR-X86_64 %s + +// RUNTIME-DIR-X86_64: {{.*}}/lib/x86_64-pc-solaris2.11 + +// RUN: mkdir -p %t-runtime/lib/i386-pc-solaris2.11 + +/// Canonical triple, 32-bit. +// RUN: %clang -print-runtime-dir --target=i386-pc-solaris2.11 \ +// RUN: -resource-dir=%t-runtime \ +// RUN: | FileCheck --check-prefix=RUNTIME-DIR-I386 %s + +/// Non-canonical triple, 32-bit. +// RUN: %clang -print-runtime-dir --target=i686-pc-solaris2.11 \ +// RUN: -resource-dir=%t-runtime \ +// RUN: | FileCheck --check-prefix=RUNTIME-DIR-I386 %s + +// RUNTIME-DIR-I386: {{.*}}/lib/i386-pc-solaris2.11