config.gcc (powerpc*-linux*-*): Add support for 64-bit little endian Linux systems...
authorMichael Meissner <meissner@linux.vnet.ibm.com>
Wed, 17 Jan 2018 01:06:34 +0000 (01:06 +0000)
committerMichael Meissner <meissner@gcc.gnu.org>
Wed, 17 Jan 2018 01:06:34 +0000 (01:06 +0000)
2018-01-16  Michael Meissner  <meissner@linux.vnet.ibm.com>

* config.gcc (powerpc*-linux*-*): Add support for 64-bit little
endian Linux systems to optionally enable multilibs for selecting
the long double type if the user configured an explicit type.
* config/rs6000/rs6000.h (TARGET_IEEEQUAD_MULTILIB): Indicate we
have no long double multilibs if not defined.
* config/rs6000/rs6000.c (rs6000_option_override_internal): Do not
warn if the user used -mabi={ieee,ibm}longdouble and we built
multilibs for long double.
* config/rs6000/linux64.h (MULTILIB_DEFAULTS_IEEE): Define as the
appropriate multilib option.
(MULTILIB_DEFAULTS): Add MULTILIB_DEFAULTS_IEEE to the default
multilib options.
* config/rs6000/t-ldouble-linux64le-ibm: New configuration files
for building long double multilibs.
* config/rs6000/t-ldouble-linux64le-ieee: Likewise.

From-SVN: r256775

gcc/ChangeLog
gcc/config.gcc
gcc/config/rs6000/linux64.h
gcc/config/rs6000/rs6000.c
gcc/config/rs6000/rs6000.h
gcc/config/rs6000/t-ldouble-linux64le-ibm [new file with mode: 0644]
gcc/config/rs6000/t-ldouble-linux64le-ieee [new file with mode: 0644]

index a76a977a394108972c9c35293bd4866055255e0f..9034ebec2d4b0e503f3a32097d98b7677699e73c 100644 (file)
@@ -1,3 +1,21 @@
+2018-01-16  Michael Meissner  <meissner@linux.vnet.ibm.com>
+
+       * config.gcc (powerpc*-linux*-*): Add support for 64-bit little
+       endian Linux systems to optionally enable multilibs for selecting
+       the long double type if the user configured an explicit type.
+       * config/rs6000/rs6000.h (TARGET_IEEEQUAD_MULTILIB): Indicate we
+       have no long double multilibs if not defined.
+       * config/rs6000/rs6000.c (rs6000_option_override_internal): Do not
+       warn if the user used -mabi={ieee,ibm}longdouble and we built
+       multilibs for long double.
+       * config/rs6000/linux64.h (MULTILIB_DEFAULTS_IEEE): Define as the
+       appropriate multilib option.
+       (MULTILIB_DEFAULTS): Add MULTILIB_DEFAULTS_IEEE to the default
+       multilib options.
+       * config/rs6000/t-ldouble-linux64le-ibm: New configuration files
+       for building long double multilibs.
+       * config/rs6000/t-ldouble-linux64le-ieee: Likewise.
+
 2018-01-16  John David Anglin  <danglin@gcc.gnu.org>
 
        * config.gcc (hppa*-*-linux*): Change callee copies ABI to caller
index 311186b56eb2226020788edd77c4393371024a61..ec6822b9db1142812cd2704586875ddf96ef1a6d 100644 (file)
@@ -4407,6 +4407,16 @@ case "${target}" in
                elif test x$with_long_double_format = xibm; then
                    tm_defines="${tm_defines} TARGET_IEEEQUAD_DEFAULT=0"
                fi
+
+               case "${target}:${enable_multilib}:${with_long_double_format}" in
+                   powerpc64le*:yes:ieee | powerpc64le*:yes:ibm)
+                       tm_defines="${tm_defines} TARGET_IEEEQUAD_MULTILIB=1"
+                       tmake_file="${tmake_file} rs6000/t-ldouble-linux64le-${with_long_double_format}"
+                       ;;
+                   *)
+                       :
+                       ;;
+               esac
                ;;
 
        s390*-*-*)
index 44eab40a2349df5831d5abaf7e510a066edfd75f..90fe65662552e31b8b116d60230c160d78cc25d6 100644 (file)
@@ -245,11 +245,18 @@ extern int dot_symbols;
 #define DYNAMIC_LINKER_PREFIX  ""
 #endif
 
-#undef MULTILIB_DEFAULTS
+#if TARGET_IEEEQUAD_DEFAULT
+#define MULTILIB_DEFAULTS_IEEE "mabi=ieeelongdouble"
+
+#else  /* TARGET_IEEEQUAD_DEFAULT.  */
+#define MULTILIB_DEFAULTS_IEEE "mabi=ibmlongdouble"
+#endif /* TARGET_IEEEQUAD_DEFAULT.  */
+
+#undef MULTILIB_DEFAULTS
 #if DEFAULT_ARCH64_P
-#define MULTILIB_DEFAULTS { "m64" }
+#define MULTILIB_DEFAULTS { "m64", MULTILIB_DEFAULTS_IEEE }
 #else
-#define MULTILIB_DEFAULTS { "m32" }
+#define MULTILIB_DEFAULTS { "m32", MULTILIB_DEFAULTS_IEEE }
 #endif
 
 /* Split stack is only supported for 64 bit, and requires glibc >= 2.18.  */
index 2c22c63d74cd6260b603a3d7d051c5e3fcb1c389..dbd3beebb51c1c6437eee7180d0f70ae6cae0cf5 100644 (file)
@@ -4587,11 +4587,15 @@ rs6000_option_override_internal (bool global_init_p)
      systems will also set long double to be IEEE 128-bit.  AIX and Darwin
      explicitly redefine TARGET_IEEEQUAD and TARGET_IEEEQUAD_DEFAULT to 0, so
      those systems will not pick up this default.  Warn if the user changes the
-     default unless -Wno-psabi.  */
+     default unless either the user used the -Wno-psabi option, or the compiler
+     was built to enable multilibs to switch between the two long double
+     types.  */
   if (!global_options_set.x_rs6000_ieeequad)
     rs6000_ieeequad = TARGET_IEEEQUAD_DEFAULT;
 
-  else if (rs6000_ieeequad != TARGET_IEEEQUAD_DEFAULT && TARGET_LONG_DOUBLE_128)
+  else if (!TARGET_IEEEQUAD_MULTILIB
+          && rs6000_ieeequad != TARGET_IEEEQUAD_DEFAULT
+          && TARGET_LONG_DOUBLE_128)
     {
       static bool warned_change_long_double;
       if (!warned_change_long_double)
index 77b75dd756c0c6a7b701dd7f4d7ae428a6d65c9f..a218366f658a615469e4a956b2a07187131a319f 100644 (file)
@@ -564,6 +564,12 @@ extern int rs6000_vector_align[];
 #define TARGET_ALTIVEC_ABI rs6000_altivec_abi
 #define TARGET_LDBRX (TARGET_POPCNTD || rs6000_cpu == PROCESSOR_CELL)
 
+/* Define as 1 if we support multilibs for switching long double between IEEE
+   128-bit floating point and IBM extended double.  */
+#ifndef TARGET_IEEEQUAD_MULTILIB
+#define TARGET_IEEEQUAD_MULTILIB 0
+#endif
+
 /* ISA 2.01 allowed FCFID to be done in 32-bit, previously it was 64-bit only.
    Enable 32-bit fcfid's on any of the switches for newer ISA machines or
    XILINX.  */
diff --git a/gcc/config/rs6000/t-ldouble-linux64le-ibm b/gcc/config/rs6000/t-ldouble-linux64le-ibm
new file mode 100644 (file)
index 0000000..4b209e8
--- /dev/null
@@ -0,0 +1,26 @@
+# Long double multilib libraries for PowerPC 64-bit little endian systems using
+# IBM extended double as the long double type.
+#
+# Copyright (C) 2018 Free Software Foundation, Inc.
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GCC is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+MULTILIB_OPTIONS       += mabi=ieeelongdouble/mabi=ibmlongdouble
+MULTILIB_DIRNAMES      += ieee128 ibm128
+MULTILIB_OSDIRNAMES    += mabi.ibmlongdouble=../lib64$(call if_multiarch,:powerpc64-linux-gnu) \
+                          mabi.ieeelongdouble=../lib64/ieee128$(call if_multiarch,:powerpc64-linux-gnu) \
+                          ../lib64$(call if_multiarch,:powerpc64-linux-gnu)
diff --git a/gcc/config/rs6000/t-ldouble-linux64le-ieee b/gcc/config/rs6000/t-ldouble-linux64le-ieee
new file mode 100644 (file)
index 0000000..7d47953
--- /dev/null
@@ -0,0 +1,26 @@
+# Long double multilib libraries for PowerPC 64-bit little endian systems using
+# IEEE 128-bit floating point as the long double type.
+#
+# Copyright (C) 2018 Free Software Foundation, Inc.
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GCC is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+MULTILIB_OPTIONS       += mabi=ieeelongdouble/mabi=ibmlongdouble
+MULTILIB_DIRNAMES      += ieee128 ibm128
+MULTILIB_OSDIRNAMES    += mabi.ibmlongdouble=../lib64/ibm128$(call if_multiarch,:powerpc64-linux-gnu) \
+                          mabi.ieeelongdouble=../lib64$(call if_multiarch,:powerpc64-linux-gnu) \
+                          ../lib64$(call if_multiarch,:powerpc64-linux-gnu)