Skip to content

Commit 43dfe0f

Browse files
committed
[Driver] Allow for sparcv8plus subdir with Solaris/SPARC GCC
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
1 parent 673d963 commit 43dfe0f

File tree

7 files changed

+70
-1
lines changed

7 files changed

+70
-1
lines changed

clang/lib/Driver/ToolChains/Gnu.cpp

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1874,6 +1874,12 @@ static bool findBiarchMultilibs(const Driver &D,
18741874
.flag("-m64", /*Disallow=*/true)
18751875
.flag("-mx32")
18761876
.makeMultilib();
1877+
Multilib Alt32sparc = MultilibBuilder()
1878+
.gccSuffix("/sparcv8plus")
1879+
.includeSuffix("/sparcv8plus")
1880+
.flag("-m32")
1881+
.flag("-m64", /*Disallow=*/true)
1882+
.makeMultilib();
18771883

18781884
// GCC toolchain for IAMCU doesn't have crtbegin.o, so look for libgcc.a.
18791885
FilterNonExistent NonExistent(
@@ -1885,10 +1891,14 @@ static bool findBiarchMultilibs(const Driver &D,
18851891
const bool IsX32 = TargetTriple.isX32();
18861892
if (TargetTriple.isArch32Bit() && !NonExistent(Alt32))
18871893
Want = WANT64;
1894+
if (TargetTriple.isArch32Bit() && !NonExistent(Alt32sparc))
1895+
Want = WANT64;
18881896
else if (TargetTriple.isArch64Bit() && IsX32 && !NonExistent(Altx32))
18891897
Want = WANT64;
18901898
else if (TargetTriple.isArch64Bit() && !IsX32 && !NonExistent(Alt64))
18911899
Want = WANT32;
1900+
else if (TargetTriple.isArch64Bit() && !NonExistent(Alt32sparc))
1901+
Want = WANT64;
18921902
else {
18931903
if (TargetTriple.isArch32Bit())
18941904
Want = NeedsBiarchSuffix ? WANT64 : WANT32;
@@ -1919,6 +1929,7 @@ static bool findBiarchMultilibs(const Driver &D,
19191929
Result.Multilibs.push_back(Alt64);
19201930
Result.Multilibs.push_back(Alt32);
19211931
Result.Multilibs.push_back(Altx32);
1932+
Result.Multilibs.push_back(Alt32sparc);
19221933

19231934
Result.Multilibs.FilterOut(NonExistent);
19241935

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

19331944
if (Result.SelectedMultilibs.back() == Alt64 ||
19341945
Result.SelectedMultilibs.back() == Alt32 ||
1935-
Result.SelectedMultilibs.back() == Altx32)
1946+
Result.SelectedMultilibs.back() == Altx32 ||
1947+
Result.SelectedMultilibs.back() == Alt32sparc)
19361948
Result.BiarchSibling = Default;
19371949

19381950
return true;

clang/test/Driver/Inputs/solaris_sparc32_tree/usr/gcc/10/lib/gcc/sparcv9-sun-solaris2.11/10.4.0/32/crtbegin.o

Whitespace-only changes.

clang/test/Driver/Inputs/solaris_sparc32_tree/usr/gcc/10/lib/gcc/sparcv9-sun-solaris2.11/10.4.0/crtbegin.o

Whitespace-only changes.

clang/test/Driver/Inputs/solaris_sparcv8+_tree/usr/gcc/11/lib/gcc/sparcv9-sun-solaris2.11/11.3.0/crtbegin.o

Whitespace-only changes.

clang/test/Driver/Inputs/solaris_sparcv8+_tree/usr/gcc/11/lib/gcc/sparcv9-sun-solaris2.11/11.3.0/sparcv8plus/crtbegin.o

Whitespace-only changes.

clang/test/Driver/lit.local.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ config.suffixes = [
2020
".hipi",
2121
".hlsl",
2222
".yaml",
23+
".test",
2324
]
2425
config.substitutions = list(config.substitutions)
2526
config.substitutions.insert(
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/// Check that clang can handle both old-style (32) and new-style (sparcv8plus)
2+
/// 32-bit sparc multilib subdirs.
3+
4+
/// Check sparc-sun-solaris2.11, 32-bit, GCC 4.8 tree
5+
// RUN: %clang -v 2>&1 --target=sparc-sun-solaris2.11 \
6+
// RUN: --gcc-toolchain=%S/Inputs/solaris_sparc_tree/usr/gcc/4.8 \
7+
// RUN: | FileCheck --check-prefix=CHECK-SPARC32-GCC48 %s
8+
// CHECK-SPARC32-GCC48: Selected GCC installation: {{.*}}4.8/lib/gcc/sparc-sun-solaris2.11/4.8.2
9+
// CHECK-SPARC32-GCC48-NEXT: Candidate multilib: .;@m32
10+
// CHECK-SPARC32-GCC48-NEXT: Candidate multilib: sparcv9;@m64
11+
// CHECK-SPARC32-GCC48-NEXT: Selected multilib: .;@m32
12+
13+
/// Check sparc-sun-solaris2.11, 32-bit, GCC 10 tree
14+
// RUN: %clang -v 2>&1 --target=sparc-sun-solaris2.11 \
15+
// RUN: --gcc-toolchain=%S/Inputs/solaris_sparc32_tree/usr/gcc/10 \
16+
// RUN: | FileCheck --check-prefix=CHECK-SPARC32-GCC10 %s
17+
// CHECK-SPARC32-GCC10: Selected GCC installation: {{.*}}10/lib/gcc/sparcv9-sun-solaris2.11/10.4.0
18+
// CHECK-SPARC32-GCC10-NEXT: Candidate multilib: .;@m64
19+
// CHECK-SPARC32-GCC10-NEXT: Candidate multilib: 32;@m32
20+
// CHECK-SPARC32-GCC10-NEXT: Selected multilib: 32;@m32
21+
22+
/// Check sparc-sun-solaris2.11, 32-bit, GCC 11 tree
23+
// RUN: %clang -v 2>&1 --target=sparc-sun-solaris2.11 \
24+
// RUN: --gcc-toolchain=%S/Inputs/solaris_sparcv8+_tree/usr/gcc/11 \
25+
// RUN: | FileCheck --check-prefix=CHECK-SPARC32-GCC11 %s
26+
// CHECK-SPARC32-GCC11: Selected GCC installation: {{.*}}11/lib/gcc/sparcv9-sun-solaris2.11/11.3.0
27+
// CHECK-SPARC32-GCC11-NEXT: Candidate multilib: .;@m64
28+
// CHECK-SPARC32-GCC11-NEXT: Candidate multilib: sparcv8plus;@m32
29+
// CHECK-SPARC32-GCC11-NEXT: Selected multilib: sparcv8plus;@m32
30+
31+
/// Check sparcv9-sun-solaris2.11, 64-bit, GCC 4.8 tree
32+
// RUN: %clang -v 2>&1 --target=sparcv9-sun-solaris2.11 \
33+
// RUN: --gcc-toolchain=%S/Inputs/solaris_sparc_tree/usr/gcc/4.8 \
34+
// RUN: | FileCheck --check-prefix=CHECK-SPARC64-GCC48 %s
35+
// CHECK-SPARC64-GCC48: Selected GCC installation: {{.*}}gcc/4.8/lib/gcc/sparc-sun-solaris2.11/4.8.2
36+
// CHECK-SPARC64-GCC48-NEXT: Candidate multilib: .;@m32
37+
// CHECK-SPARC64-GCC48-NEXT: Candidate multilib: sparcv9;@m64
38+
// CHECK-SPARC64-GCC48-NEXT: Selected multilib: sparcv9;@m64
39+
40+
/// Check sparcv9-sun-solaris2.11, 64-bit, GCC 10 tree
41+
// RUN: %clang -v 2>&1 --target=sparcv9-sun-solaris2.11 \
42+
// RUN: --gcc-toolchain=%S/Inputs/solaris_sparc32_tree/usr/gcc/10 \
43+
// RUN: | FileCheck --check-prefix=CHECK-SPARC64-GCC10 %s
44+
// CHECK-SPARC64-GCC10: Selected GCC installation: {{.*}}10/lib/gcc/sparcv9-sun-solaris2.11/10.4.0
45+
// CHECK-SPARC64-GCC10-NEXT: Candidate multilib: .;@m64
46+
// CHECK-SPARC64-GCC10-NEXT: Candidate multilib: 32;@m32
47+
// CHECK-SPARC64-GCC10-NEXT: Selected multilib: .;@m64
48+
49+
/// Check sparcv9-sun-solaris2.11, 64-bit, GCC 11 tree
50+
// RUN: %clang -v 2>&1 --target=sparcv9-sun-solaris2.11 \
51+
// RUN: --gcc-toolchain=%S/Inputs/solaris_sparcv8+_tree/usr/gcc/11 \
52+
// RUN: | FileCheck --check-prefix=CHECK-SPARC64-GCC11 %s
53+
// CHECK-SPARC64-GCC11: Selected GCC installation: {{.*}}11/lib/gcc/sparcv9-sun-solaris2.11/11.3.0
54+
// CHECK-SPARC64-GCC11-NEXT: Candidate multilib: .;@m64
55+
// CHECK-SPARC64-GCC11-NEXT: Candidate multilib: sparcv8plus;@m32
56+
// CHECK-SPARC64-GCC11-NEXT: Selected multilib: .;@m64

0 commit comments

Comments
 (0)