]> granicus.if.org Git - clang/commit
[Driver] Properly use values-X[ca].o, values-xpg[46].o on Solaris
authorRainer Orth <ro@gcc.gnu.org>
Mon, 5 Aug 2019 14:06:16 +0000 (14:06 +0000)
committerRainer Orth <ro@gcc.gnu.org>
Mon, 5 Aug 2019 14:06:16 +0000 (14:06 +0000)
commit0e2d6da234b539673a71b6b011827a075876cbe4
treef8cf2b8b7d2b404c57acbb8da5836dd9b23e3e30
parente3656d7fcf5dc0d1f72b7f417ce7c79b9881e344
[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
lib/Driver/ToolChains/Solaris.cpp
test/Driver/Inputs/solaris_sparc_tree/usr/lib/values-Xa.o [new file with mode: 0644]
test/Driver/Inputs/solaris_sparc_tree/usr/lib/values-Xc.o [new file with mode: 0644]
test/Driver/Inputs/solaris_sparc_tree/usr/lib/values-xpg4.o [new file with mode: 0644]
test/Driver/Inputs/solaris_sparc_tree/usr/lib/values-xpg6.o [new file with mode: 0644]
test/Driver/Inputs/solaris_x86_tree/usr/lib/values-Xa.o [new file with mode: 0644]
test/Driver/Inputs/solaris_x86_tree/usr/lib/values-Xc.o [new file with mode: 0644]
test/Driver/Inputs/solaris_x86_tree/usr/lib/values-xpg4.o [new file with mode: 0644]
test/Driver/Inputs/solaris_x86_tree/usr/lib/values-xpg6.o [new file with mode: 0644]
test/Driver/solaris-ld-values.c [new file with mode: 0644]
test/Driver/solaris-ld-values.cpp [new file with mode: 0644]