Remove LIBGCC2_TF_CEXT target macro.
authorJoseph Myers <joseph@codesourcery.com>
Thu, 18 Sep 2014 23:27:26 +0000 (00:27 +0100)
committerJoseph Myers <jsm28@gcc.gnu.org>
Thu, 18 Sep 2014 23:27:26 +0000 (00:27 +0100)
This patch removes the (undocumented) LIBGCC2_TF_CEXT target macro,
replacing it by -fbuilding-libgcc predefines (and thereby gets rid of
another LIBGCC2_LONG_DOUBLE_TYPE_SIZE conditional, though some more
patches are needed before that target macro can be eliminated).  This
macro indicated the suffix used on __builtin_huge_val,
__builtin_copysign, __builtin_fabs built-in function names to produce
the names for a given floating-point mode.

Predefines are added for all floating-point modes supported for
libgcc, not just TFmode.  These are fully accurate for modes
corresponding to float, double and long double.  For other modes, the
suffix for *constants* is determined by the targetm.c.mode_for_suffix
hook (the limit to two possible suffixes 'w' and 'q' being hardcoded
in various places).  This is in fact the suffix for built-in functions
as well where such functions exist.

* For i386, the *q functions always exist (whether or not TFmode is
  used for long double).  The *w functions never exist (but this
  doesn't matter for libgcc, since no i386 configuration treats XFmode
  as a supported scalar mode if long double is TFmode; if __float80
  were to be supported for 64-bit Android, properly such functions
  ought to be added).

* For ia64, the *q functions exist for non-HP-UX (under HP-UX, long
  double is TFmode, so they aren't needed).  The *w functions never
  exist.  This is an issue for this libgcc code for the XFmode complex
  functions in libgcc on HP-UX; as I understand it, right now those
  will accidentally be using TFmode versions of those three functions,
  so involving unnecessary conversions, while the sanity check on CEXT
  accidentally passes because all it tests is the sizes of the types.

Because of the lack of 'w' functions, the patch uses 'l' when the
constant suffix is 'w', matching what the existing libgcc code would
do for IA64 HP-UX in that case.

Ideally there would be generic code to create such built-in functions
for all supported floating-point types.  That may be something to
consider if support for TS 18661-3 (standard bindings for IEEE
754-2008, defining names such as _Float128, and function names such as
copysignf128) is added in future.

Bootstrapped with no regressions on x86_64-unknown-linux-gnu.

gcc:
* system.h (LIBGCC2_TF_CEXT): Poison.
* config/i386/cygming.h (LIBGCC2_TF_CEXT): Remove.
* config/i386/darwin.h (LIBGCC2_TF_CEXT): Likewise.
* config/i386/dragonfly.h (LIBGCC2_TF_CEXT): Likewise.
* config/i386/freebsd.h (LIBGCC2_TF_CEXT): Likewise.
* config/i386/gnu-user-common.h (LIBGCC2_TF_CEXT): Likewise.
* config/i386/openbsdelf.h (LIBGCC2_TF_CEXT): Likewise.
* config/i386/sol2.h (LIBGCC2_TF_CEXT): Likewise.
* config/ia64/ia64.h (LIBGCC2_TF_CEXT): Likewise.
* config/ia64/linux.h (LIBGCC2_TF_CEXT): Likewise.

gcc/c-family:
* c-cppbuiltin.c (c_cpp_builtins): Define __LIBGCC_*_FUNC_EXT__
for supported floating-point modes.

libgcc:
* libgcc2.c (CEXT): Define using __LIBGCC_*_FUNC_EXT__.

From-SVN: r215368

15 files changed:
gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-cppbuiltin.c
gcc/config/i386/cygming.h
gcc/config/i386/darwin.h
gcc/config/i386/dragonfly.h
gcc/config/i386/freebsd.h
gcc/config/i386/gnu-user-common.h
gcc/config/i386/openbsdelf.h
gcc/config/i386/sol2.h
gcc/config/ia64/ia64.h
gcc/config/ia64/linux.h
gcc/system.h
libgcc/ChangeLog
libgcc/libgcc2.c

index 37749c7b4b9e30efd54f53e67fe89e94f63af7c1..0c7b2154857267ae5a6745aa562cd4b027b7b817 100644 (file)
@@ -1,3 +1,16 @@
+2014-09-18  Joseph Myers  <joseph@codesourcery.com>
+
+       * system.h (LIBGCC2_TF_CEXT): Poison.
+       * config/i386/cygming.h (LIBGCC2_TF_CEXT): Remove.
+       * config/i386/darwin.h (LIBGCC2_TF_CEXT): Likewise.
+       * config/i386/dragonfly.h (LIBGCC2_TF_CEXT): Likewise.
+       * config/i386/freebsd.h (LIBGCC2_TF_CEXT): Likewise.
+       * config/i386/gnu-user-common.h (LIBGCC2_TF_CEXT): Likewise.
+       * config/i386/openbsdelf.h (LIBGCC2_TF_CEXT): Likewise.
+       * config/i386/sol2.h (LIBGCC2_TF_CEXT): Likewise.
+       * config/ia64/ia64.h (LIBGCC2_TF_CEXT): Likewise.
+       * config/ia64/linux.h (LIBGCC2_TF_CEXT): Likewise.
+
 2014-09-19  Kito Cheng  <kito@0xlab.org>
 
        * except.h: Fix header guard.
index 0b22cf6d2aca24824ecdffac505d6d2e9e49136a..efe74173f17fa958fb34f5725f42ebc379fed8ab 100644 (file)
@@ -1,3 +1,8 @@
+2014-09-18  Joseph Myers  <joseph@codesourcery.com>
+
+       * c-cppbuiltin.c (c_cpp_builtins): Define __LIBGCC_*_FUNC_EXT__
+       for supported floating-point modes.
+
 2014-09-15  Manuel López-Ibáñez  <manu@gcc.gnu.org>
 
        * c.opt (Wpsabi): Use LangEnabledBy.
index b4095a05f2d7b9adca076b09e250669501ec2638..9e2040b67d5404ca24906cb6f625aabb16936ccd 100644 (file)
@@ -956,6 +956,28 @@ c_cpp_builtins (cpp_reader *pfile)
                                        + sizeof ("__LIBGCC_HAS__MODE__"));
          sprintf (macro_name, "__LIBGCC_HAS_%s_MODE__", name);
          cpp_define (pfile, macro_name);
+         macro_name = (char *) alloca (strlen (name)
+                                       + sizeof ("__LIBGCC__FUNC_EXT__"));
+         sprintf (macro_name, "__LIBGCC_%s_FUNC_EXT__", name);
+         const char *suffix;
+         if (mode == TYPE_MODE (double_type_node))
+           suffix = "";
+         else if (mode == TYPE_MODE (float_type_node))
+           suffix = "f";
+         else if (mode == TYPE_MODE (long_double_type_node))
+           suffix = "l";
+         /* ??? The following assumes the built-in functions (defined
+            in target-specific code) match the suffixes used for
+            constants.  Because in fact such functions are not
+            defined for the 'w' suffix, 'l' is used there
+            instead.  */
+         else if (mode == targetm.c.mode_for_suffix ('q'))
+           suffix = "q";
+         else if (mode == targetm.c.mode_for_suffix ('w'))
+           suffix = "l";
+         else
+           gcc_unreachable ();
+         builtin_define_with_value (macro_name, suffix, 0);
        }
 
       /* For libgcc crtstuff.c and libgcc2.c.  */
index a2c3773a966838447fbe850b9b914783c4685477..95b8f6fb966f60435d00d7e661b26f7d769575aa 100644 (file)
@@ -339,9 +339,6 @@ do {                                                \
 #define ASM_OUTPUT_ALIGNED_BSS(FILE, DECL, NAME, SIZE, ALIGN) \
   asm_output_aligned_bss ((FILE), (DECL), (NAME), (SIZE), (ALIGN))
 
-/* Put all *tf routines in libgcc.  */
-#define LIBGCC2_TF_CEXT q
-
 /* Output function declarations at the end of the file.  */
 #undef TARGET_ASM_FILE_END
 #define TARGET_ASM_FILE_END i386_pe_file_end
index cafc98a9ad28d5d778183e15dd06642cf523621a..c1a55c1dd09e6ccad6ed95eb5032845db2e49bcd 100644 (file)
@@ -153,9 +153,6 @@ extern int darwin_emit_branch_islands;
 
 #define SHIFT_DOUBLE_OMITS_COUNT 0
 
-/* Put all *tf routines in libgcc.  */
-#define LIBGCC2_TF_CEXT q
-
 #undef TARGET_ASM_FILE_END
 #define TARGET_ASM_FILE_END darwin_file_end
 
index b46a13ecfa5487bbabc6746890c44a2750547f38..095112822995682a1e7487802f23e5dbc8b5575b 100644 (file)
@@ -89,9 +89,6 @@ see the files COPYING3 and COPYING.RUNTIME respectively.  If not, see
 #undef TARGET_96_ROUND_53_LONG_DOUBLE
 #define TARGET_96_ROUND_53_LONG_DOUBLE (!TARGET_64BIT)
 
-/* Put all *tf routines in libgcc.  */
-#define LIBGCC2_TF_CEXT q
-
 /* Static stack checking is supported by means of probes.  */
 #define STACK_CHECK_STATIC_BUILTIN 1
 
index b09bfd023fe3a91485d6a8d39ffa6ab68bcadb90..e341f6b02c9282d08f0a6071214708994ed2d92f 100644 (file)
@@ -131,9 +131,6 @@ along with GCC; see the file COPYING3.  If not see
 #undef TARGET_96_ROUND_53_LONG_DOUBLE
 #define TARGET_96_ROUND_53_LONG_DOUBLE (!TARGET_64BIT)
 
-/* Put all *tf routines in libgcc.  */
-#define LIBGCC2_TF_CEXT q
-
 /* Static stack checking is supported by means of probes.  */
 #define STACK_CHECK_STATIC_BUILTIN 1
 
index 5f1973567c3fcae6536eaca4cc2b7cea94d9afed..0e619961bc9cb66f01f76606f36d454166f533b3 100644 (file)
@@ -57,9 +57,6 @@ along with GCC; see the file COPYING3.  If not see
   GNU_USER_TARGET_MATHFILE_SPEC " " \
   GNU_USER_TARGET_ENDFILE_SPEC
 
-/* Put all *tf routines in libgcc.  */
-#define LIBGCC2_TF_CEXT q
-
 #define TARGET_ASM_FILE_END file_end_indicate_exec_stack
 
 /* The stack pointer needs to be moved while checking the stack.  */
index 8e2eceab93353dfe4eee7074a33de4c31d23e63d..470fbedd6c316385e1326ba71083f9cbd322fd27 100644 (file)
@@ -111,6 +111,3 @@ along with GCC; see the file COPYING3.  If not see
 #define OBSD_HAS_CORRECT_SPECS
 
 #define HAVE_ENABLE_EXECUTE_STACK
-
-/* Put all *tf routines in libgcc.  */
-#define LIBGCC2_TF_CEXT q
index be1e6fcff0de6a34cde38f404398448a70bc28d1..79ad8c1ffa2815ddb78ef52437b500793369a676 100644 (file)
@@ -236,6 +236,3 @@ along with GCC; see the file COPYING3.  If not see
 #ifndef USE_GLD
 #define USE_HIDDEN_LINKONCE 0
 #endif
-
-/* Put all *tf routines in libgcc.  */
-#define LIBGCC2_TF_CEXT q
index dd14b8af65f7280f358b64b6e5248190b953b8e5..4cc80a9c8eab6fa9964119da33772410f07bc50f 100644 (file)
@@ -258,9 +258,6 @@ while (0)
 #define LIBGCC2_LONG_DOUBLE_TYPE_SIZE  (TARGET_ABI_OPEN_VMS ? 64 : 80)
 
 
-/* On HP-UX, we use the l suffix for TFmode in libgcc2.c.  */
-#define LIBGCC2_TF_CEXT l
-
 #define DEFAULT_SIGNED_CHAR 1
 
 /* A C expression for a string describing the name of the data type to use for
index bd1b582fa800b349693b144b133d26cb796baad2..e4b12ec64e54da047adcb4b4fe8eb1bbe7ee5b3c 100644 (file)
@@ -76,10 +76,6 @@ do {                                         \
 #undef LINK_EH_SPEC
 #define LINK_EH_SPEC ""
 
-/* Put all *tf routines in libgcc.  */
-#undef LIBGCC2_TF_CEXT
-#define LIBGCC2_TF_CEXT q
-
 #undef TARGET_INIT_LIBFUNCS
 #define TARGET_INIT_LIBFUNCS ia64_soft_fp_init_libfuncs
 
index 416837c8a6ffeaf41eea51d06fc51bf9008b22ed..3208a9d6f8c52cf8802ac5bb7d89926719bd2d6b 100644 (file)
@@ -936,7 +936,7 @@ extern void fancy_abort (const char *, int, const char *) ATTRIBUTE_NORETURN;
        EXTRA_CONSTRAINT_STR EXTRA_MEMORY_CONSTRAINT                       \
        EXTRA_ADDRESS_CONSTRAINT CONST_DOUBLE_OK_FOR_CONSTRAINT_P          \
        CALLER_SAVE_PROFITABLE LARGEST_EXPONENT_IS_NORMAL                  \
-       ROUND_TOWARDS_ZERO SF_SIZE DF_SIZE XF_SIZE TF_SIZE
+       ROUND_TOWARDS_ZERO SF_SIZE DF_SIZE XF_SIZE TF_SIZE LIBGCC2_TF_CEXT
 
 /* Hooks that are no longer used.  */
  #pragma GCC poison LANG_HOOKS_FUNCTION_MARK LANG_HOOKS_FUNCTION_FREE  \
index fa432395c4e98bb6c4de89c488ccd7ea628ae5e6..3673651497f4f7c3908a5d028555105b1d3a9d73 100644 (file)
@@ -1,3 +1,7 @@
+2014-09-18  Joseph Myers  <joseph@codesourcery.com>
+
+       * libgcc2.c (CEXT): Define using __LIBGCC_*_FUNC_EXT__.
+
 2014-09-18  Joseph Myers  <joseph@codesourcery.com>
 
        * config/i386/sfp-machine.h (FP_TRAPPING_EXCEPTIONS): Treat clear
index 2800fe949e2a682bba695147d63d7ac453fa67ca..dc8a235e8b88860e50d555828ab8db02737b5e46 100644 (file)
@@ -1865,34 +1865,29 @@ NAME (TYPE x, int m)
 # define MTYPE SFtype
 # define CTYPE SCtype
 # define MODE  sc
-# define CEXT  f
+# define CEXT  __LIBGCC_SF_FUNC_EXT__
 # define NOTRUNC __FLT_EVAL_METHOD__ == 0
 #elif defined(L_muldc3) || defined(L_divdc3)
 # define MTYPE DFtype
 # define CTYPE DCtype
 # define MODE  dc
+# define CEXT  __LIBGCC_DF_FUNC_EXT__
 # if LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 64
-#  define CEXT l
 #  define NOTRUNC 1
 # else
-#  define CEXT
 #  define NOTRUNC __FLT_EVAL_METHOD__ == 0 || __FLT_EVAL_METHOD__ == 1
 # endif
 #elif defined(L_mulxc3) || defined(L_divxc3)
 # define MTYPE XFtype
 # define CTYPE XCtype
 # define MODE  xc
-# define CEXT  l
+# define CEXT  __LIBGCC_XF_FUNC_EXT__
 # define NOTRUNC 1
 #elif defined(L_multc3) || defined(L_divtc3)
 # define MTYPE TFtype
 # define CTYPE TCtype
 # define MODE  tc
-# if LIBGCC2_LONG_DOUBLE_TYPE_SIZE == 128
-#  define CEXT l
-# else
-#  define CEXT LIBGCC2_TF_CEXT
-# endif
+# define CEXT  __LIBGCC_TF_FUNC_EXT__
 # define NOTRUNC 1
 #else
 # error