From patchwork Thu Feb 17 01:12:11 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: Backport PR42333 fix to gcc 4.5 Date: Wed, 16 Feb 2011 15:12:11 -0000 From: Jack Howarth X-Patchwork-Id: 83419 Message-Id: <20110217011211.GA9004@bromo.med.uc.edu> To: gcc-patches@gcc.gnu.org Cc: mikestump@comcast.net, iains@gcc.gnu.org Currently gcc 4.5.2 and gcc-4_5-branch fails... FAIL: gcc.dg/torture/builtin-math-7.c -O0 execution test FAIL: gcc.dg/torture/builtin-math-7.c -O1 execution test FAIL: gcc.dg/torture/builtin-math-7.c -O2 execution test FAIL: gcc.dg/torture/builtin-math-7.c -O3 -fomit-frame-pointer execution test FAIL: gcc.dg/torture/builtin-math-7.c -O3 -fomit-frame-pointer -funroll-loops execution test FAIL: gcc.dg/torture/builtin-math-7.c -O3 -fomit-frame-pointer -funroll-all-loops -finline-functions execution test FAIL: gcc.dg/torture/builtin-math-7.c -O3 -g execution test FAIL: gcc.dg/torture/builtin-math-7.c -Os execution test FAIL: gcc.dg/torture/builtin-math-7.c -O2 -flto execution test FAIL: gcc.dg/torture/builtin-math-7.c -O2 -fwhopr execution test at -m32 and -m64 on i386-apple-darwin10 and x86_64-apple-darwin10 due to PR42333. The attached patch backports r169902 from gcc trunk to provide alternate __ieee_divdc3 entry point to access the FSF gcc ___divdc3 instead of the lazy implementation in darwin10's libSystem. Bootstrap and regression tested on x86_64-apple-darwin10. Okay for gcc-4_5-branch? Jack 2011-02-14 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. Index: gcc/config/i386/darwin.h =================================================================== --- gcc/config/i386/darwin.h (revision 170126) +++ gcc/config/i386/darwin.h (working copy) @@ -302,3 +302,17 @@ along with GCC; see the file COPYING3. #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 Index: gcc/config/i386/i386.c =================================================================== --- gcc/config/i386/i386.c (revision 170126) +++ gcc/config/i386/i386.c (working copy) @@ -30612,6 +30612,11 @@ ix86_enum_va_list (int idx, const char * #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" Index: gcc/config/darwin-protos.h =================================================================== --- gcc/config/darwin-protos.h (revision 170126) +++ gcc/config/darwin-protos.h (working copy) @@ -93,3 +93,4 @@ extern void darwin_asm_output_anchor (rt extern bool darwin_kextabi_p (void); extern void darwin_override_options (void); extern void darwin_patch_builtins (void); +extern void darwin_rename_builtins (void); Index: gcc/config/darwin.c =================================================================== --- gcc/config/darwin.c (revision 170126) +++ gcc/config/darwin.c (working copy) @@ -337,6 +337,34 @@ static GTY ((param_is (struct machopic_i /* 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) {