aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Stump <mikestump@comcast.net>2011-02-07 20:41:50 +0000
committerMike Stump <mrs@gcc.gnu.org>2011-02-07 20:41:50 +0000
commit41cf94fbbaaa245b707a0242b61daf18843aa860 (patch)
tree64b9e1e54766da31a2f1890d359a6c3a67297b5c
parentee09a3dd0fc25264794888516d41434a281f7daa (diff)
downloadgcc-41cf94fbbaaa245b707a0242b61daf18843aa860.zip
gcc-41cf94fbbaaa245b707a0242b61daf18843aa860.tar.gz
gcc-41cf94fbbaaa245b707a0242b61daf18843aa860.tar.bz2
re PR target/47558 (163267 breaks exception traceback in xplor-nih)
PR target/47558 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: r169902
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/config/darwin-protos.h1
-rw-r--r--gcc/config/darwin.c28
-rw-r--r--gcc/config/i386/darwin.h9
-rw-r--r--gcc/config/i386/i386.c5
5 files changed, 54 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 73d70a7..e46a060 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,14 @@
+2011-02-07 Mike Stump <mikestump@comcast.net>
+
+ PR target/47558
+ 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-02-07 Michael Meissner <meissner@linux.vnet.ibm.com>
PR target/47636
diff --git a/gcc/config/darwin-protos.h b/gcc/config/darwin-protos.h
index bf81ed9..0023099 100644
--- a/gcc/config/darwin-protos.h
+++ b/gcc/config/darwin-protos.h
@@ -124,3 +124,4 @@ extern bool darwin_use_anchors_for_symbol_p (const_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 cd6a815..8ccf18c 100644
--- a/gcc/config/darwin.c
+++ b/gcc/config/darwin.c
@@ -2823,6 +2823,34 @@ darwin_fold_builtin (tree fndecl, int n_args, tree *argp,
return NULL_TREE;
}
+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
cfstring_hash (const void *ptr)
{
diff --git a/gcc/config/i386/darwin.h b/gcc/config/i386/darwin.h
index a9a2da4..9cf51e3 100644
--- a/gcc/config/i386/darwin.h
+++ b/gcc/config/i386/darwin.h
@@ -309,5 +309,14 @@ do { \
#define SUBTARGET_INIT_BUILTINS \
do { \
darwin_init_cfstring_builtins ((unsigned) (IX86_BUILTIN_MAX));\
+ 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 4d927c2..12c7062 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -35040,6 +35040,11 @@ ix86_autovectorize_vector_sizes (void)
#undef TARGET_CONDITIONAL_REGISTER_USAGE
#define TARGET_CONDITIONAL_REGISTER_USAGE ix86_conditional_register_usage
+#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"