From: Jack Howarth Date: Thu, 30 Jun 2011 16:31:23 +0000 (+0000) Subject: backport: re PR other/42333 (complex division failure on darwin10 with -lm) X-Git-Tag: releases/gcc-4.5.4~564 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=81465a0dc455bfc28df07dba5b0bfd65f8d218c7;p=thirdparty%2Fgcc.git backport: re PR other/42333 (complex division failure on darwin10 with -lm) 2011-06-30 Jack Howarth Backport from mainline 2011-02-07 Mike Stump PR target/42333 Add __ieee_divdc3 entry point. * config/i386/darwin.h (DECLARE_LIBRARY_RENAMES): Retain ___divdc3 entry point. (SUBTARGET_INIT_BUILTINS): Call darwin_rename_builtins. * config/i386/i386.c (TARGET_INIT_LIBFUNCS): Likewise. * config/darwin.c (darwin_rename_builtins): Add. * config/darwin-protos.h (darwin_rename_builtins): Add. From-SVN: r175711 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e21f3750672e..37eba05b9e87 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,17 @@ +2011-06-30 Jack Howarth + + Backport from mainline + 2011-02-07 Mike Stump + + PR target/42333 + Add __ieee_divdc3 entry point. + * config/i386/darwin.h (DECLARE_LIBRARY_RENAMES): Retain ___divdc3 + entry point. + (SUBTARGET_INIT_BUILTINS): Call darwin_rename_builtins. + * config/i386/i386.c (TARGET_INIT_LIBFUNCS): Likewise. + * config/darwin.c (darwin_rename_builtins): Add. + * config/darwin-protos.h (darwin_rename_builtins): Add. + 2011-06-28 Eric Botcazou * tree-ssa-dom.c (initialize_hash_element): Fix oversight. diff --git a/gcc/config/darwin-protos.h b/gcc/config/darwin-protos.h index 5886f0158a6e..b860536138f0 100644 --- a/gcc/config/darwin-protos.h +++ b/gcc/config/darwin-protos.h @@ -93,3 +93,4 @@ extern void darwin_asm_output_anchor (rtx symbol); extern bool darwin_kextabi_p (void); extern void darwin_override_options (void); extern void darwin_patch_builtins (void); +extern void darwin_rename_builtins (void); diff --git a/gcc/config/darwin.c b/gcc/config/darwin.c index 81ee8c72f45c..31557cb13bc7 100644 --- a/gcc/config/darwin.c +++ b/gcc/config/darwin.c @@ -337,6 +337,34 @@ static GTY ((param_is (struct machopic_indirection))) htab_t /* Return a hash value for a SLOT in the indirections hash table. */ +void +darwin_rename_builtins (void) +{ + /* The system ___divdc3 routine in libSystem on darwin10 is not + accurate to 1ulp, ours is, so we avoid ever using the system name + for this routine and instead install a non-conflicting name that + is accurate. + + When -ffast-math or -funsafe-math-optimizations is given, we can + use the faster version. */ + if (!flag_unsafe_math_optimizations) + { + int dcode = (BUILT_IN_COMPLEX_DIV_MIN + + DCmode - MIN_MODE_COMPLEX_FLOAT); + tree fn = built_in_decls[dcode]; + /* Fortran and c call TARGET_INIT_BUILTINS and + TARGET_INIT_LIBFUNCS at different times, so we have to put a + call into each to ensure that at least one of them is called + after build_common_builtin_nodes. A better fix is to add a + new hook to run after build_common_builtin_nodes runs. */ + if (fn) + set_user_assembler_name (fn, "___ieee_divdc3"); + fn = implicit_built_in_decls[dcode]; + if (fn) + set_user_assembler_name (fn, "___ieee_divdc3"); + } +} + static hashval_t machopic_indirection_hash (const void *slot) { diff --git a/gcc/config/i386/darwin.h b/gcc/config/i386/darwin.h index 5bd9571bde0e..6b40c997d433 100644 --- a/gcc/config/i386/darwin.h +++ b/gcc/config/i386/darwin.h @@ -302,3 +302,17 @@ along with GCC; see the file COPYING3. If not see #define MACHO_SYMBOL_FLAG_VARIABLE ((SYMBOL_FLAG_MACH_DEP) << 3) #define SUBTARGET32_DEFAULT_CPU "i686" + +#define SUBTARGET_INIT_BUILTINS \ +do { \ + darwin_rename_builtins (); \ +} while(0) + +/* The system ___divdc3 routine in libSystem on darwin10 is not + accurate to 1ulp, ours is, so we avoid ever using the system name + for this routine and instead install a non-conflicting name that is + accurate. See darwin_rename_builtins. */ +#ifdef L_divdc3 +#define DECLARE_LIBRARY_RENAMES \ + asm(".text; ___divdc3: jmp ___ieee_divdc3 ; .globl ___divdc3"); +#endif diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 35e1ceeeddc5..14775796b732 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -30665,6 +30665,11 @@ ix86_enum_va_list (int idx, const char **pname, tree *ptree) #undef TARGET_ASM_CODE_END #define TARGET_ASM_CODE_END ix86_code_end +#if TARGET_MACHO +#undef TARGET_INIT_LIBFUNCS +#define TARGET_INIT_LIBFUNCS darwin_rename_builtins +#endif + struct gcc_target targetm = TARGET_INITIALIZER; #include "gt-i386.h"