Patch to fix -mcpu=G5 interface to EH runtime library.
authorFariborz Jahanian <fjahanian@apple.com>
Mon, 16 Aug 2004 20:08:31 +0000 (20:08 +0000)
committerFariborz Jahanian <fjahanian@gcc.gnu.org>
Mon, 16 Aug 2004 20:08:31 +0000 (20:08 +0000)
Reviewed by Geoff Keating.

From-SVN: r86074

gcc/ChangeLog
gcc/config/rs6000/rs6000.c
gcc/except.c
gcc/target-def.h
gcc/target.h
gcc/targhooks.c
gcc/targhooks.h

index c6d74bd53333480f8273f2d1f3d8c478af39a803..85d5500d36bd0e12d59dde162ee3402b6cbe3085 100644 (file)
@@ -1,3 +1,13 @@
+2004-08-16  Fariborz Jahanian <fjahanian@apple.com>
+
+       * except.c (get_exception_filter, build_post_landing_pads,
+       dw2_build_landing_pads): Use target-specific mode for 'filter'.
+       * target-def.h (TARGET_EH_RETURN_FILTER_MODE): macro defined and used.
+       * target.h (eh_return_filter_mode): New field added.
+       * targhooks.c (default_eh_return_filter_mode): Defined.
+       * targhooks.h (default_eh_return_filter_mode): Declared.
+       * config/rs6000/rs6000.c (rs6000_eh_return_filter_mode): Defined.
+
 2004-08-16  Nathanael Nerode  <neroden@gcc.gnu.org>
 
        * configure.ac: Replace _GCC_TOPLEV_NONCANONICAL_TARGET with
index fc63c315f8b2b43ce2aecd79ee9ae3649822b4db..a1760ed0e4890c80f332a8a4a6410d4f44dfe7e7 100644 (file)
@@ -748,6 +748,8 @@ static tree rs6000_build_builtin_va_list (void);
 static tree rs6000_gimplify_va_arg (tree, tree, tree *, tree *);
 static bool rs6000_must_pass_in_stack (enum machine_mode, tree);
 
+static enum machine_mode rs6000_eh_return_filter_mode (void);
+
 /* Hash table stuff for keeping track of TOC entries.  */
 
 struct toc_hash_struct GTY(())
@@ -964,6 +966,9 @@ static const char alt_reg_names[][8] =
 #undef TARGET_GIMPLIFY_VA_ARG_EXPR
 #define TARGET_GIMPLIFY_VA_ARG_EXPR rs6000_gimplify_va_arg
 
+#undef TARGET_EH_RETURN_FILTER_MODE
+#define TARGET_EH_RETURN_FILTER_MODE rs6000_eh_return_filter_mode
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 \f
 
@@ -17171,4 +17176,11 @@ rs6000_dbx_register_number (unsigned int regno)
   abort ();
 }
 
+/* target hook eh_return_filter_mode */
+static enum machine_mode 
+rs6000_eh_return_filter_mode (void)
+{
+  return TARGET_32BIT ? SImode : word_mode;
+}
+
 #include "gt-rs6000.h"
index d45f1b2dcda69ee8a895fab3b76efb01ea1cfe4b..c9e086ec758894814e8e25b91f5ac381dd09cb57 100644 (file)
@@ -628,7 +628,7 @@ get_exception_filter (struct function *fun)
   rtx filter = fun->eh->filter;
   if (fun == cfun && ! filter)
     {
-      filter = gen_reg_rtx (word_mode);
+      filter = gen_reg_rtx (targetm.eh_return_filter_mode ());
       fun->eh->filter = filter;
     }
   return filter;
@@ -1528,7 +1528,8 @@ build_post_landing_pads (void)
                        emit_cmp_and_jump_insns
                          (cfun->eh->filter,
                           GEN_INT (tree_low_cst (TREE_VALUE (flt_node), 0)),
-                          EQ, NULL_RTX, word_mode, 0, c->label);
+                          EQ, NULL_RTX, 
+                          targetm.eh_return_filter_mode (), 0, c->label);
 
                        tp_node = TREE_CHAIN (tp_node);
                        flt_node = TREE_CHAIN (flt_node);
@@ -1560,7 +1561,8 @@ build_post_landing_pads (void)
 
          emit_cmp_and_jump_insns (cfun->eh->filter,
                                   GEN_INT (region->u.allowed.filter),
-                                  EQ, NULL_RTX, word_mode, 0, region->label);
+                                  EQ, NULL_RTX, 
+                                  targetm.eh_return_filter_mode (), 0, region->label);
 
          /* We delay the generation of the _Unwind_Resume until we generate
             landing pads.  We emit a marker here so as to get good control
@@ -1738,7 +1740,8 @@ dw2_build_landing_pads (void)
       emit_move_insn (cfun->eh->exc_ptr,
                      gen_rtx_REG (ptr_mode, EH_RETURN_DATA_REGNO (0)));
       emit_move_insn (cfun->eh->filter,
-                     gen_rtx_REG (word_mode, EH_RETURN_DATA_REGNO (1)));
+                     gen_rtx_REG (targetm.eh_return_filter_mode (), 
+                                  EH_RETURN_DATA_REGNO (1)));
 
       seq = get_insns ();
       end_sequence ();
index 407ee0bb54f905d5af6f209f8830ad8a93f7c564..7180a3e1f6724be3da3be3cd2a9c135848fe007a 100644 (file)
@@ -268,6 +268,9 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
    TARGET_SCHED_DFA_NEW_CYCLE,                                 \
    TARGET_SCHED_IS_COSTLY_DEPENDENCE}
 
+/* In except.c */
+#define TARGET_EH_RETURN_FILTER_MODE  default_eh_return_filter_mode;
+
 /* In tree.c.  */
 #define TARGET_MERGE_DECL_ATTRIBUTES merge_decl_attributes
 #define TARGET_MERGE_TYPE_ATTRIBUTES merge_type_attributes
@@ -436,6 +439,7 @@ Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
 {                                              \
   TARGET_ASM_OUT,                              \
   TARGET_SCHED,                                        \
+  TARGET_EH_RETURN_FILTER_MODE,                        \
   TARGET_MERGE_DECL_ATTRIBUTES,                        \
   TARGET_MERGE_TYPE_ATTRIBUTES,                        \
   TARGET_ATTRIBUTE_TABLE,                      \
index 9a185e5b9b745a39a1248344413af88a3c100e9d..ad37161bc48ea2de7b70e95bbbf0db51116c956a 100644 (file)
@@ -276,6 +276,9 @@ struct gcc_target
     bool (* is_costly_dependence) (rtx, rtx, rtx, int, int);
   } sched;
 
+  /* Return machine mode for filter value. */
+  enum machine_mode (* eh_return_filter_mode) (void);
+
   /* Given two decls, merge their attributes and return the result.  */
   tree (* merge_decl_attributes) (tree, tree);
 
index 3eff2fd4f503a0ba8685a271be4d8e8de96cfebf..00d7e8444d7fac2d6428d613cbd8fea1e9e4fa1f 100644 (file)
@@ -128,6 +128,12 @@ default_pretend_outgoing_varargs_named (CUMULATIVE_ARGS *ca ATTRIBUTE_UNUSED)
          != default_setup_incoming_varargs);
 }
 
+enum machine_mode 
+default_eh_return_filter_mode (void)
+{
+  return word_mode;
+}
+
 /* Generic hook that takes a CUMULATIVE_ARGS pointer and returns true.  */
 
 bool
index 5fa6a5532362fffbcd42c90a9bf4eba084f2fb9a..077175eda9df6429f09dd252932542cf28697e8d 100644 (file)
@@ -31,6 +31,8 @@ extern rtx default_builtin_setjmp_frame_value (void);
 extern bool hook_bool_CUMULATIVE_ARGS_false (CUMULATIVE_ARGS *);
 extern bool default_pretend_outgoing_varargs_named (CUMULATIVE_ARGS *);
 
+extern enum machine_mode default_eh_return_filter_mode (void);
+
 extern bool hook_bool_CUMULATIVE_ARGS_true (CUMULATIVE_ARGS *);
 extern tree default_cxx_guard_type (void);
 extern tree default_cxx_get_cookie_size (tree);