diff --git a/clang/lib/Driver/ToolChains/Gnu.cpp b/clang/lib/Driver/ToolChains/Gnu.cpp --- a/clang/lib/Driver/ToolChains/Gnu.cpp +++ b/clang/lib/Driver/ToolChains/Gnu.cpp @@ -1874,6 +1874,12 @@ .flag("-m64", /*Disallow=*/true) .flag("-mx32") .makeMultilib(); + Multilib Alt32sparc = MultilibBuilder() + .gccSuffix("/sparcv8plus") + .includeSuffix("/sparcv8plus") + .flag("-m32") + .flag("-m64", /*Disallow=*/true) + .makeMultilib(); // GCC toolchain for IAMCU doesn't have crtbegin.o, so look for libgcc.a. FilterNonExistent NonExistent( @@ -1885,10 +1891,14 @@ const bool IsX32 = TargetTriple.isX32(); if (TargetTriple.isArch32Bit() && !NonExistent(Alt32)) Want = WANT64; + if (TargetTriple.isArch32Bit() && !NonExistent(Alt32sparc)) + Want = WANT64; else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32)) Want = WANT64; else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64)) Want = WANT32; + else if (TargetTriple.isArch64Bit() && !NonExistent(Alt32sparc)) + Want = WANT64; else { if (TargetTriple.isArch32Bit()) Want = NeedsBiarchSuffix ? WANT64 : WANT32; @@ -1919,6 +1929,7 @@ Result.Multilibs.push_back(Alt64); Result.Multilibs.push_back(Alt32); Result.Multilibs.push_back(Altx32); + Result.Multilibs.push_back(Alt32sparc); Result.Multilibs.FilterOut(NonExistent); @@ -1932,7 +1943,8 @@ if (Result.SelectedMultilibs.back() == Alt64 || Result.SelectedMultilibs.back() == Alt32 || - Result.SelectedMultilibs.back() == Altx32) + Result.SelectedMultilibs.back() == Altx32 || + Result.SelectedMultilibs.back() == Alt32sparc) Result.BiarchSibling = Default; return true; diff --git a/clang/test/Driver/Inputs/solaris_sparc32_tree/usr/gcc/10/lib/gcc/sparcv9-sun-solaris2.11/10.4.0/32/crtbegin.o b/clang/test/Driver/Inputs/solaris_sparc32_tree/usr/gcc/10/lib/gcc/sparcv9-sun-solaris2.11/10.4.0/32/crtbegin.o new file mode 100644 diff --git a/clang/test/Driver/Inputs/solaris_sparc32_tree/usr/gcc/10/lib/gcc/sparcv9-sun-solaris2.11/10.4.0/crtbegin.o b/clang/test/Driver/Inputs/solaris_sparc32_tree/usr/gcc/10/lib/gcc/sparcv9-sun-solaris2.11/10.4.0/crtbegin.o new file mode 100644 diff --git a/clang/test/Driver/Inputs/solaris_sparcv8+_tree/usr/gcc/11/lib/gcc/sparcv9-sun-solaris2.11/11.3.0/crtbegin.o b/clang/test/Driver/Inputs/solaris_sparcv8+_tree/usr/gcc/11/lib/gcc/sparcv9-sun-solaris2.11/11.3.0/crtbegin.o new file mode 100644 diff --git a/clang/test/Driver/Inputs/solaris_sparcv8+_tree/usr/gcc/11/lib/gcc/sparcv9-sun-solaris2.11/11.3.0/sparcv8plus/crtbegin.o b/clang/test/Driver/Inputs/solaris_sparcv8+_tree/usr/gcc/11/lib/gcc/sparcv9-sun-solaris2.11/11.3.0/sparcv8plus/crtbegin.o new file mode 100644 diff --git a/clang/test/Driver/lit.local.cfg b/clang/test/Driver/lit.local.cfg --- a/clang/test/Driver/lit.local.cfg +++ b/clang/test/Driver/lit.local.cfg @@ -20,6 +20,7 @@ ".hipi", ".hlsl", ".yaml", + ".test", ] config.substitutions = list(config.substitutions) config.substitutions.insert( diff --git a/clang/test/Driver/solaris-sparc-gcc-search.test b/clang/test/Driver/solaris-sparc-gcc-search.test new file mode 100644 --- /dev/null +++ b/clang/test/Driver/solaris-sparc-gcc-search.test @@ -0,0 +1,56 @@ +/// Check that clang can handle both old-style (32) and new-style (sparcv8plus) +/// 32-bit sparc multilib subdirs. + +/// Check sparc-sun-solaris2.11, 32-bit, GCC 4.8 tree +// RUN: %clang -v 2>&1 --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain=%S/Inputs/solaris_sparc_tree/usr/gcc/4.8 \ +// RUN: | FileCheck --check-prefix=CHECK-SPARC32-GCC48 %s +// CHECK-SPARC32-GCC48: Selected GCC installation: {{.*}}4.8/lib/gcc/sparc-sun-solaris2.11/4.8.2 +// CHECK-SPARC32-GCC48-NEXT: Candidate multilib: .;@m32 +// CHECK-SPARC32-GCC48-NEXT: Candidate multilib: sparcv9;@m64 +// CHECK-SPARC32-GCC48-NEXT: Selected multilib: .;@m32 + +/// Check sparc-sun-solaris2.11, 32-bit, GCC 10 tree +// RUN: %clang -v 2>&1 --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain=%S/Inputs/solaris_sparc32_tree/usr/gcc/10 \ +// RUN: | FileCheck --check-prefix=CHECK-SPARC32-GCC10 %s +// CHECK-SPARC32-GCC10: Selected GCC installation: {{.*}}10/lib/gcc/sparcv9-sun-solaris2.11/10.4.0 +// CHECK-SPARC32-GCC10-NEXT: Candidate multilib: .;@m64 +// CHECK-SPARC32-GCC10-NEXT: Candidate multilib: 32;@m32 +// CHECK-SPARC32-GCC10-NEXT: Selected multilib: 32;@m32 + +/// Check sparc-sun-solaris2.11, 32-bit, GCC 11 tree +// RUN: %clang -v 2>&1 --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain=%S/Inputs/solaris_sparcv8+_tree/usr/gcc/11 \ +// RUN: | FileCheck --check-prefix=CHECK-SPARC32-GCC11 %s +// CHECK-SPARC32-GCC11: Selected GCC installation: {{.*}}11/lib/gcc/sparcv9-sun-solaris2.11/11.3.0 +// CHECK-SPARC32-GCC11-NEXT: Candidate multilib: .;@m64 +// CHECK-SPARC32-GCC11-NEXT: Candidate multilib: sparcv8plus;@m32 +// CHECK-SPARC32-GCC11-NEXT: Selected multilib: sparcv8plus;@m32 + +/// Check sparcv9-sun-solaris2.11, 64-bit, GCC 4.8 tree +// RUN: %clang -v 2>&1 --target=sparcv9-sun-solaris2.11 \ +// RUN: --gcc-toolchain=%S/Inputs/solaris_sparc_tree/usr/gcc/4.8 \ +// RUN: | FileCheck --check-prefix=CHECK-SPARC64-GCC48 %s +// CHECK-SPARC64-GCC48: Selected GCC installation: {{.*}}gcc/4.8/lib/gcc/sparc-sun-solaris2.11/4.8.2 +// CHECK-SPARC64-GCC48-NEXT: Candidate multilib: .;@m32 +// CHECK-SPARC64-GCC48-NEXT: Candidate multilib: sparcv9;@m64 +// CHECK-SPARC64-GCC48-NEXT: Selected multilib: sparcv9;@m64 + +/// Check sparcv9-sun-solaris2.11, 64-bit, GCC 10 tree +// RUN: %clang -v 2>&1 --target=sparcv9-sun-solaris2.11 \ +// RUN: --gcc-toolchain=%S/Inputs/solaris_sparc32_tree/usr/gcc/10 \ +// RUN: | FileCheck --check-prefix=CHECK-SPARC64-GCC10 %s +// CHECK-SPARC64-GCC10: Selected GCC installation: {{.*}}10/lib/gcc/sparcv9-sun-solaris2.11/10.4.0 +// CHECK-SPARC64-GCC10-NEXT: Candidate multilib: .;@m64 +// CHECK-SPARC64-GCC10-NEXT: Candidate multilib: 32;@m32 +// CHECK-SPARC64-GCC10-NEXT: Selected multilib: .;@m64 + +/// Check sparcv9-sun-solaris2.11, 64-bit, GCC 11 tree +// RUN: %clang -v 2>&1 --target=sparcv9-sun-solaris2.11 \ +// RUN: --gcc-toolchain=%S/Inputs/solaris_sparcv8+_tree/usr/gcc/11 \ +// RUN: | FileCheck --check-prefix=CHECK-SPARC64-GCC11 %s +// CHECK-SPARC64-GCC11: Selected GCC installation: {{.*}}11/lib/gcc/sparcv9-sun-solaris2.11/11.3.0 +// CHECK-SPARC64-GCC11-NEXT: Candidate multilib: .;@m64 +// CHECK-SPARC64-GCC11-NEXT: Candidate multilib: sparcv8plus;@m32 +// CHECK-SPARC64-GCC11-NEXT: Selected multilib: .;@m64