diff mbox

Backport PR42333 fix to gcc 4.5

Message ID 20110217011211.GA9004@bromo.med.uc.edu
State New
Headers show

Commit Message

Jack Howarth Feb. 17, 2011, 1:12 a.m. UTC
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  <howarth@bromo.med.uc.edu>

        Backport from mainline

        2011-02-07 Mike Stump  <mikestump@comcast.net>
        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.
diff mbox

Patch

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)
 {