Reviewed by Geoff Keating.
From-SVN: r86074
+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
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(())
#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
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"
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;
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);
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
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 ();
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
{ \
TARGET_ASM_OUT, \
TARGET_SCHED, \
+ TARGET_EH_RETURN_FILTER_MODE, \
TARGET_MERGE_DECL_ATTRIBUTES, \
TARGET_MERGE_TYPE_ATTRIBUTES, \
TARGET_ATTRIBUTE_TABLE, \
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);
!= 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
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);