re PR libstdc++/5625 ([mips] exception unwinding creates invalid pointer on mips)
PR libstdc++/5625 * builtin-types.def (BT_WORD, BT_FN_WORD_PTR): New. * builtins.c (expand_builtin): Handle BUILT_IN_EXTEND_POINTER. * builtins.def (BUILT_IN_EXTEND_POINTER): New. * except.c (expand_builtin_extend_pointer): New. * except.h (expand_builtin_extend_pointer): Declare. From-SVN: r77554
This commit is contained in:
parent
d886a04164
commit
c76362b488
|
@ -1,3 +1,12 @@
|
|||
2004-02-09 James E Wilson <wilson@specifixinc.com>
|
||||
|
||||
PR libstdc++/5625
|
||||
* builtin-types.def (BT_WORD, BT_FN_WORD_PTR): New.
|
||||
* builtins.c (expand_builtin): Handle BUILT_IN_EXTEND_POINTER.
|
||||
* builtins.def (BUILT_IN_EXTEND_POINTER): New.
|
||||
* except.c (expand_builtin_extend_pointer): New.
|
||||
* except.h (expand_builtin_extend_pointer): Declare.
|
||||
|
||||
2004-02-09 David Edelsohn <edelsohn@gnu.org>
|
||||
|
||||
* config/rs6000/rs6000.c (rs6000_emit_move): Remove splitting slow
|
||||
|
|
|
@ -64,6 +64,7 @@ DEF_PRIMITIVE_TYPE (BT_INT, integer_type_node)
|
|||
DEF_PRIMITIVE_TYPE (BT_UNSIGNED, unsigned_type_node)
|
||||
DEF_PRIMITIVE_TYPE (BT_LONG, long_integer_type_node)
|
||||
DEF_PRIMITIVE_TYPE (BT_LONGLONG, long_long_integer_type_node)
|
||||
DEF_PRIMITIVE_TYPE (BT_WORD, (*lang_hooks.types.type_for_mode) (word_mode, 0))
|
||||
DEF_PRIMITIVE_TYPE (BT_FLOAT, float_type_node)
|
||||
DEF_PRIMITIVE_TYPE (BT_INTMAX, intmax_type_node)
|
||||
DEF_PRIMITIVE_TYPE (BT_DOUBLE, double_type_node)
|
||||
|
@ -142,6 +143,7 @@ DEF_FUNCTION_TYPE_1 (BT_FN_DOUBLE_CONST_STRING, BT_DOUBLE, BT_CONST_STRING)
|
|||
DEF_FUNCTION_TYPE_1 (BT_FN_LONGDOUBLE_CONST_STRING,
|
||||
BT_LONGDOUBLE, BT_CONST_STRING)
|
||||
DEF_FUNCTION_TYPE_1 (BT_FN_STRING_CONST_STRING, BT_STRING, BT_CONST_STRING)
|
||||
DEF_FUNCTION_TYPE_1 (BT_FN_WORD_PTR, BT_WORD, BT_PTR)
|
||||
|
||||
DEF_FUNCTION_TYPE_2 (BT_FN_VOID_PTR_INT, BT_VOID, BT_PTR, BT_INT)
|
||||
DEF_FUNCTION_TYPE_2 (BT_FN_STRING_STRING_CONST_STRING,
|
||||
|
|
|
@ -5539,6 +5539,9 @@ expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode,
|
|||
case BUILT_IN_EH_RETURN_DATA_REGNO:
|
||||
return expand_builtin_eh_return_data_regno (arglist);
|
||||
#endif
|
||||
case BUILT_IN_EXTEND_POINTER:
|
||||
return expand_builtin_extend_pointer (TREE_VALUE (arglist));
|
||||
|
||||
case BUILT_IN_VA_START:
|
||||
case BUILT_IN_STDARG_START:
|
||||
return expand_builtin_va_start (arglist);
|
||||
|
|
|
@ -516,6 +516,7 @@ DEF_GCC_BUILTIN (BUILT_IN_EH_RETURN, "eh_return", BT_FN_VOID_PTRMODE_PTR,
|
|||
DEF_GCC_BUILTIN (BUILT_IN_EH_RETURN_DATA_REGNO, "eh_return_data_regno", BT_FN_INT_INT, ATTR_NULL)
|
||||
DEF_LIB_BUILTIN (BUILT_IN_EXIT, "exit", BT_FN_VOID_INT, ATTR_NORETURN_NOTHROW_LIST)
|
||||
DEF_GCC_BUILTIN (BUILT_IN_EXPECT, "expect", BT_FN_LONG_LONG_LONG, ATTR_NULL)
|
||||
DEF_GCC_BUILTIN (BUILT_IN_EXTEND_POINTER, "extend_pointer", BT_FN_WORD_PTR, ATTR_CONST_NOTHROW_LIST)
|
||||
DEF_GCC_BUILTIN (BUILT_IN_EXTRACT_RETURN_ADDR, "extract_return_addr", BT_FN_PTR_PTR, ATTR_NULL)
|
||||
DEF_GCC_BUILTIN (BUILT_IN_FRAME_ADDRESS, "frame_address", BT_FN_PTR_UNSIGNED, ATTR_NULL)
|
||||
DEF_GCC_BUILTIN (BUILT_IN_FROB_RETURN_ADDR, "frob_return_addr", BT_FN_PTR_PTR, ATTR_NULL)
|
||||
|
|
20
gcc/except.c
20
gcc/except.c
|
@ -3076,6 +3076,26 @@ expand_eh_return (void)
|
|||
|
||||
emit_label (around_label);
|
||||
}
|
||||
|
||||
/* Convert a ptr_mode address ADDR_TREE to a Pmode address controlled by
|
||||
POINTERS_EXTEND_UNSIGNED and return it. */
|
||||
|
||||
rtx
|
||||
expand_builtin_extend_pointer (tree addr_tree)
|
||||
{
|
||||
rtx addr = expand_expr (addr_tree, NULL_RTX, ptr_mode, 0);
|
||||
int extend;
|
||||
|
||||
#ifdef POINTERS_EXTEND_UNSIGNED
|
||||
extend = POINTERS_EXTEND_UNSIGNED;
|
||||
#else
|
||||
/* The previous EH code did an unsigned extend by default, so we do this also
|
||||
for consistency. */
|
||||
extend = 1;
|
||||
#endif
|
||||
|
||||
return convert_modes (word_mode, ptr_mode, addr, extend);
|
||||
}
|
||||
|
||||
/* In the following functions, we represent entries in the action table
|
||||
as 1-based indices. Special cases are:
|
||||
|
|
|
@ -117,6 +117,7 @@ extern rtx expand_builtin_frob_return_addr (tree);
|
|||
extern rtx expand_builtin_dwarf_sp_column (void);
|
||||
extern void expand_builtin_eh_return (tree, tree);
|
||||
extern void expand_eh_return (void);
|
||||
extern rtx expand_builtin_extend_pointer (tree);
|
||||
extern rtx get_exception_pointer (struct function *);
|
||||
extern int duplicate_eh_regions (struct function *, struct inline_remap *);
|
||||
|
||||
|
|
Loading…
Reference in New Issue