diff options
author | Rainer Orth <ro@gcc.gnu.org> | 2023-09-07 19:14:55 +0200 |
---|---|---|
committer | Tobias Hieta <tobias@hieta.se> | 2023-11-13 08:27:47 +0100 |
commit | 05422e1dcf94d2f5178818450ff0fce816755a7e (patch) | |
tree | fe9844bc5e23444f6d3f585d2104cfc2f7af6e0f | |
parent | [clang-repl] Fix BUILD_SHARED_LIBS symbols from libclangInterpreter on MinGW ... (diff) | |
download | llvm-project-05422e1dcf94d2f5178818450ff0fce816755a7e.tar.gz llvm-project-05422e1dcf94d2f5178818450ff0fce816755a7e.tar.bz2 llvm-project-05422e1dcf94d2f5178818450ff0fce816755a7e.zip |
[Driver] Fix linking with -lm on Solaris (#65632)
As noticed in D158846, the Solaris driver deviates from other targets in
that it links every executable with `-lm`, but doesn't for shared
objects. For C code, this is unnecessary, while for C++ `libm` is always
needed, even for shared objects.
This patch fixes this by following the `Gnu.cpp` precedent. It adjusts
the `solaris-ld.c` test accordingly, adding some more tests.
Tested on `amd64-pc-solaris2.11`, `sparcv9-sun-solaris2.11`, and
`x86_64-pc-linux-gnu`.
(cherry picked from commit 1e6b0df3503567488e7df2d574c90f8f31a001a2)
-rw-r--r-- | clang/lib/Driver/ToolChains/Solaris.cpp | 9 | ||||
-rw-r--r-- | clang/test/Driver/solaris-ld.c | 21 |
2 files changed, 22 insertions, 8 deletions
diff --git a/clang/lib/Driver/ToolChains/Solaris.cpp b/clang/lib/Driver/ToolChains/Solaris.cpp index de5a69e4ca3f..85619a91554e 100644 --- a/clang/lib/Driver/ToolChains/Solaris.cpp +++ b/clang/lib/Driver/ToolChains/Solaris.cpp @@ -64,6 +64,7 @@ void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA, const InputInfoList &Inputs, const ArgList &Args, const char *LinkingOutput) const { + const Driver &D = getToolChain().getDriver(); const bool IsPIE = getPIE(Args, getToolChain()); ArgStringList CmdArgs; @@ -152,8 +153,11 @@ void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA, if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs, options::OPT_r)) { - if (getToolChain().ShouldLinkCXXStdlib(Args)) - getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); + if (D.CCCIsCXX()) { + if (getToolChain().ShouldLinkCXXStdlib(Args)) + getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs); + CmdArgs.push_back("-lm"); + } if (Args.hasArg(options::OPT_fstack_protector) || Args.hasArg(options::OPT_fstack_protector_strong) || Args.hasArg(options::OPT_fstack_protector_all)) { @@ -172,7 +176,6 @@ void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA, CmdArgs.push_back("-lc"); if (!Args.hasArg(options::OPT_shared)) { CmdArgs.push_back("-lgcc"); - CmdArgs.push_back("-lm"); } const SanitizerArgs &SA = getToolChain().getSanitizerArgs(Args); if (NeedsSanitizerDeps) { diff --git a/clang/test/Driver/solaris-ld.c b/clang/test/Driver/solaris-ld.c index 8d97a5a3695b..a172fcb2e481 100644 --- a/clang/test/Driver/solaris-ld.c +++ b/clang/test/Driver/solaris-ld.c @@ -20,7 +20,6 @@ // CHECK-LD-SPARC32-SAME: "-lgcc_s" // CHECK-LD-SPARC32-SAME: "-lc" // CHECK-LD-SPARC32-SAME: "-lgcc" -// CHECK-LD-SPARC32-SAME: "-lm" // CHECK-LD-SPARC32-SAME: "[[SYSROOT]]/usr/gcc/4.8/lib/gcc/sparc-sun-solaris2.11/4.8.2{{/|\\\\}}crtend.o" // CHECK-LD-SPARC32-SAME: "[[SYSROOT]]/usr/lib{{/|\\\\}}crtn.o" @@ -43,7 +42,6 @@ // CHECK-LD-SPARC64-SAME: "-lgcc_s" // CHECK-LD-SPARC64-SAME: "-lc" // CHECK-LD-SPARC64-SAME: "-lgcc" -// CHECK-LD-SPARC64-SAME: "-lm" // CHECK-LD-SPARC64-SAME: "[[SYSROOT]]/usr/gcc/4.8/lib/gcc/sparc-sun-solaris2.11/4.8.2/sparcv9{{/|\\\\}}crtend.o" // CHECK-LD-SPARC64-SAME: "[[SYSROOT]]/usr/lib/sparcv9{{/|\\\\}}crtn.o" @@ -66,7 +64,6 @@ // CHECK-LD-X32-SAME: "-lgcc_s" // CHECK-LD-X32-SAME: "-lc" // CHECK-LD-X32-SAME: "-lgcc" -// CHECK-LD-X32-SAME: "-lm" // CHECK-LD-X32-SAME: "[[SYSROOT]]/usr/gcc/4.9/lib/gcc/i386-pc-solaris2.11/4.9.4{{/|\\\\}}crtend.o" // CHECK-LD-X32-SAME: "[[SYSROOT]]/usr/lib{{/|\\\\}}crtn.o" @@ -90,7 +87,6 @@ // CHECK-LD-X64-SAME: "-lgcc_s" // CHECK-LD-X64-SAME: "-lc" // CHECK-LD-X64-SAME: "-lgcc" -// CHECK-LD-X64-SAME: "-lm" // CHECK-LD-X64-SAME: "[[SYSROOT]]/usr/gcc/4.9/lib/gcc/i386-pc-solaris2.11/4.9.4/amd64{{/|\\\\}}crtend.o" // CHECK-LD-X64-SAME: "[[SYSROOT]]/usr/lib/amd64{{/|\\\\}}crtn.o" @@ -104,7 +100,22 @@ // CHECK-SPARC32-SHARED-SAME: "-lgcc_s" // CHECK-SPARC32-SHARED-SAME: "-lc" // CHECK-SPARC32-SHARED-NOT: "-lgcc" -// CHECK-SPARC32-SHARED-NOT: "-lm" + +// Check that libm is only linked with clang++. +// RUN: %clang -### %s --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain="" --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-NOLIBM %s +// RUN: %clang -### %s -shared --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain="" --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-NOLIBM %s +// RUN: %clangxx -### %s --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain="" --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-LIBM %s +// RUN: %clangxx -### %s -shared --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain="" --sysroot=%S/Inputs/solaris_sparc_tree 2>&1 \ +// RUN: | FileCheck --check-prefix=CHECK-LIBM %s +// CHECK-LIBM: "-lm" +// CHECK-NOLIBM-NOT: "-lm" // Check the right ld flags are present with -pie. // RUN: %clang --target=sparc-sun-solaris2.11 -### %s -pie \ |