Skip to content

Commit

Permalink
[Driver] Allow for sparcv8plus subdir with Solaris/SPARC GCC
Browse files Browse the repository at this point in the history
Since GCC 11, the bundled Solaris/SPARC GCC uses the `sparcv8plus`
subdirectory for 32-bit objects, just like upstream GCC.  Before that, it
used `32` instead from a local patch.

Since `clang` doesn't know about that `sparcv8plus` subdirectory, it
wouldn't properly use GCC 11+ installations.

The new `solaris-sparc-gcc-search.test` testcase wasn't run initially (like
the existing `crash-report-null.test`) because the `.test` suffix wasn't
handled.

Tested on `sparcv9-sun-solaris2.11`, `amd64-pc-solaris2.11`, and
`x86_64-pc-linux-gnu`.

Differential Revision: https://reviews.llvm.org/D157013
  • Loading branch information
rorth committed Aug 3, 2023
1 parent 673d963 commit 43dfe0f
Show file tree
Hide file tree
Showing 7 changed files with 70 additions and 1 deletion.
14 changes: 13 additions & 1 deletion clang/lib/Driver/ToolChains/Gnu.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1874,6 +1874,12 @@ static bool findBiarchMultilibs(const Driver &D,
.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(
Expand All @@ -1885,10 +1891,14 @@ static bool findBiarchMultilibs(const Driver &D,
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;
Expand Down Expand Up @@ -1919,6 +1929,7 @@ static bool findBiarchMultilibs(const Driver &D,
Result.Multilibs.push_back(Alt64);
Result.Multilibs.push_back(Alt32);
Result.Multilibs.push_back(Altx32);
Result.Multilibs.push_back(Alt32sparc);

Result.Multilibs.FilterOut(NonExistent);

Expand All @@ -1932,7 +1943,8 @@ static bool findBiarchMultilibs(const Driver &D,

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;
Expand Down
1 change: 1 addition & 0 deletions clang/test/Driver/lit.local.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ config.suffixes = [
".hipi",
".hlsl",
".yaml",
".test",
]
config.substitutions = list(config.substitutions)
config.substitutions.insert(
Expand Down
56 changes: 56 additions & 0 deletions clang/test/Driver/solaris-sparc-gcc-search.test
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit 43dfe0f

Please sign in to comment.