From: Rainer Orth Date: Mon, 5 Aug 2019 14:06:16 +0000 (+0000) Subject: [Driver] Properly use values-X[ca].o, values-xpg[46].o on Solaris X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0e2d6da234b539673a71b6b011827a075876cbe4;p=clang [Driver] Properly use values-X[ca].o, values-xpg[46].o on Solaris Builtins-*-sunos :: compiler_rt_logbf_test.c currently FAILs on Solaris, both SPARC and x86, 32 and 64-bit. It turned out that this is due to different behaviour of logb depending on the C standard compiled for, as documented on logb(3M): RETURN VALUES Upon successful completion, these functions return the exponent of x. If x is subnormal: o For SUSv3-conforming applications compiled with the c99 com- piler driver (see standards(7)), the exponent of x as if x were normalized is returned. o Otherwise, if compiled with the cc compiler driver, -1022, -126, and -16382 are returned for logb(), logbf(), and logbl(), respectively. Studio c99 and gcc control this by linking with the appropriate version of values-xpg[46].o, but clang uses neither of those. The following patch fixes this by following what gcc does, as corrected some time ago in Fix use of Solaris values-Xc.o (PR target/40411) https://gcc.gnu.org/ml/gcc-patches/2018-01/msg02350.html and https://gcc.gnu.org/ml/gcc-patches/2018-01/msg02384.html. Tested on x86_64-pc-solaris2.11, sparcv9-sun-solaris2.11, and x86_64-pc-linux-gnu. Differential Revision: https://reviews.llvm.org/D64793 git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@367866 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/Driver/ToolChains/Solaris.cpp b/lib/Driver/ToolChains/Solaris.cpp index 86b9ba9542..c40d2f1ac3 100644 --- a/lib/Driver/ToolChains/Solaris.cpp +++ b/lib/Driver/ToolChains/Solaris.cpp @@ -8,6 +8,7 @@ #include "Solaris.h" #include "CommonArgs.h" +#include "clang/Basic/LangStandard.h" #include "clang/Config/config.h" #include "clang/Driver/Compilation.h" #include "clang/Driver/Driver.h" @@ -86,8 +87,28 @@ void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA, Args.MakeArgString(getToolChain().GetFilePath("crt1.o"))); CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o"))); + + const Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi); + bool HaveAnsi = false; + const LangStandard *LangStd = nullptr; + if (Std) { + HaveAnsi = Std->getOption().matches(options::OPT_ansi); + if (!HaveAnsi) + LangStd = LangStandard::getLangStandardForName(Std->getValue()); + } + + const char *values_X = "values-Xa.o"; + // Use values-Xc.o for -ansi, -std=c*, -std=iso9899:199409. + if (HaveAnsi || (LangStd && !LangStd->isGNUMode())) + values_X = "values-Xc.o"; + CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(values_X))); + + const char *values_xpg = "values-xpg6.o"; + // Use values-xpg4.o for -std=c90, -std=gnu90, -std=iso9899:199409. + if (LangStd && LangStd->getLanguage() == Language::C && !LangStd->isC99()) + values_xpg = "values-xpg4.o"; CmdArgs.push_back( - Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o"))); + Args.MakeArgString(getToolChain().GetFilePath(values_xpg))); CmdArgs.push_back( Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o"))); } diff --git a/test/Driver/Inputs/solaris_sparc_tree/usr/lib/values-Xa.o b/test/Driver/Inputs/solaris_sparc_tree/usr/lib/values-Xa.o new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/Inputs/solaris_sparc_tree/usr/lib/values-Xc.o b/test/Driver/Inputs/solaris_sparc_tree/usr/lib/values-Xc.o new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/Inputs/solaris_sparc_tree/usr/lib/values-xpg4.o b/test/Driver/Inputs/solaris_sparc_tree/usr/lib/values-xpg4.o new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/Inputs/solaris_sparc_tree/usr/lib/values-xpg6.o b/test/Driver/Inputs/solaris_sparc_tree/usr/lib/values-xpg6.o new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/Inputs/solaris_x86_tree/usr/lib/values-Xa.o b/test/Driver/Inputs/solaris_x86_tree/usr/lib/values-Xa.o new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/Inputs/solaris_x86_tree/usr/lib/values-Xc.o b/test/Driver/Inputs/solaris_x86_tree/usr/lib/values-Xc.o new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/Inputs/solaris_x86_tree/usr/lib/values-xpg4.o b/test/Driver/Inputs/solaris_x86_tree/usr/lib/values-xpg4.o new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/Inputs/solaris_x86_tree/usr/lib/values-xpg6.o b/test/Driver/Inputs/solaris_x86_tree/usr/lib/values-xpg6.o new file mode 100644 index 0000000000..e69de29bb2 diff --git a/test/Driver/solaris-ld-values.c b/test/Driver/solaris-ld-values.c new file mode 100644 index 0000000000..95601da974 --- /dev/null +++ b/test/Driver/solaris-ld-values.c @@ -0,0 +1,77 @@ +// General tests that the correct versions of values-*.o are used on +// Solaris targets sane. Note that we use sysroot to make these tests +// independent of the host system. + +// Check sparc-sun-solaris2.11, 32bit +// RUN: %clang -no-canonical-prefixes -ansi %s -### -o %t.o 2>&1 \ +// RUN: --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_sparc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-SPARC32-ANSI %s +// CHECK-LD-SPARC32-ANSI: values-Xc.o +// CHECK-LD-SPARC32-ANSI: values-xpg6.o + +// RUN: %clang -no-canonical-prefixes -std=c89 %s -### -o %t.o 2>&1 \ +// RUN: --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_sparc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-SPARC32-C89 %s +// CHECK-LD-SPARC32-C89: values-Xc.o +// CHECK-LD-SPARC32-C89: values-xpg4.o + +// RUN: %clang -no-canonical-prefixes -std=c90 %s -### -o %t.o 2>&1 \ +// RUN: --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_sparc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-SPARC32-C90 %s +// CHECK-LD-SPARC32-C90: values-Xc.o +// CHECK-LD-SPARC32-C90: values-xpg4.o + +// RUN: %clang -no-canonical-prefixes -std=iso9899:199409 %s -### -o %t.o 2>&1 \ +// RUN: --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_sparc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-SPARC32-C94 %s +// CHECK-LD-SPARC32-C94: values-Xc.o +// CHECK-LD-SPARC32-C94: values-xpg4.o + +// RUN: %clang -no-canonical-prefixes -std=c11 %s -### -o %t.o 2>&1 \ +// RUN: --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_sparc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-SPARC32-C11 %s +// CHECK-LD-SPARC32-C11: values-Xc.o +// CHECK-LD-SPARC32-C11: values-xpg6.o + +// RUN: %clang -no-canonical-prefixes -std=gnu89 %s -### -o %t.o 2>&1 \ +// RUN: --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_sparc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-SPARC32-GNU89 %s +// CHECK-LD-SPARC32-GNU89: values-Xa.o +// CHECK-LD-SPARC32-GNU89: values-xpg4.o + +// RUN: %clang -no-canonical-prefixes -std=gnu90 %s -### -o %t.o 2>&1 \ +// RUN: --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_sparc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-SPARC32-GNU90 %s +// CHECK-LD-SPARC32-GNU90: values-Xa.o +// CHECK-LD-SPARC32-GNU90: values-xpg4.o + +// RUN: %clang -no-canonical-prefixes -std=gnu11 %s -### -o %t.o 2>&1 \ +// RUN: --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_sparc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-SPARC32-GNU11 %s +// CHECK-LD-SPARC32-GNU11: values-Xa.o +// CHECK-LD-SPARC32-GNU11: values-xpg6.o + +// Check i386-pc-solaris2.11, 32bit +// RUN: %clang -no-canonical-prefixes -ansi %s -### -o %t.o 2>&1 \ +// RUN: --target=i386-pc-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_x86_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-X32-ANSI %s +// CHECK-LD-X32-ANSI: values-Xc.o +// CHECK-LD-X32-ANSI: values-xpg6.o diff --git a/test/Driver/solaris-ld-values.cpp b/test/Driver/solaris-ld-values.cpp new file mode 100644 index 0000000000..a190f12c51 --- /dev/null +++ b/test/Driver/solaris-ld-values.cpp @@ -0,0 +1,45 @@ +// General tests that the correct versions of values-*.o are used on +// Solaris targets sane. Note that we use sysroot to make these tests +// independent of the host system. + +// Check sparc-sun-solaris2.11, 32bit +// RUN: %clang -no-canonical-prefixes -ansi %s -### -o %t.o 2>&1 \ +// RUN: --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_sparc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-SPARC32-ANSI %s +// CHECK-LD-SPARC32-ANSI: values-Xc.o +// CHECK-LD-SPARC32-ANSI: values-xpg6.o + +// RUN: %clang -no-canonical-prefixes -std=c++98 %s -### -o %t.o 2>&1 \ +// RUN: --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_sparc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-SPARC32-CPP98 %s +// CHECK-LD-SPARC32-CPP98: values-Xc.o +// CHECK-LD-SPARC32-CPP98: values-xpg6.o + +// RUN: %clang -no-canonical-prefixes -std=c++11 %s -### -o %t.o 2>&1 \ +// RUN: --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_sparc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-SPARC32-CPP11 %s +// CHECK-LD-SPARC32-CPP11: values-Xc.o +// CHECK-LD-SPARC32-CPP11: values-xpg6.o + +// RUN: %clang -no-canonical-prefixes -std=gnu++98 %s -### -o %t.o 2>&1 \ +// RUN: --target=sparc-sun-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_sparc_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-SPARC32-GNUPP98 %s +// CHECK-LD-SPARC32-GNUPP98: values-Xa.o +// CHECK-LD-SPARC32-GNUPP98: values-xpg6.o + +// Check i386-pc-solaris2.11, 32bit +// RUN: %clang -no-canonical-prefixes -ANSI %s -### -o %t.o 2>&1 \ +// RUN: --target=i386-pc-solaris2.11 \ +// RUN: --gcc-toolchain="" \ +// RUN: --sysroot=%S/Inputs/solaris_x86_tree \ +// RUN: | FileCheck --check-prefix=CHECK-LD-X32-ANSI %s +// CHECK-LD-X32-ANSI: values-Xa.o +// CHECK-LD-X32-ANSI: values-xpg6.o