aboutsummaryrefslogtreecommitdiff
path: root/gcc/except.c
diff options
context:
space:
mode:
authorMike Stump <mrs@gcc.gnu.org>1996-08-16 00:52:06 +0000
committerMike Stump <mrs@gcc.gnu.org>1996-08-16 00:52:06 +0000
commit843e83356cffe3b25ef5ba53d9e86a2c130b80f5 (patch)
treedfa01fe78a9a498d98e86d5a2245aefbc71811b2 /gcc/except.c
parent6a5d752611d3c403b92591f4f2cc83c5ffd9ccd5 (diff)
downloadgcc-843e83356cffe3b25ef5ba53d9e86a2c130b80f5.zip
gcc-843e83356cffe3b25ef5ba53d9e86a2c130b80f5.tar.gz
gcc-843e83356cffe3b25ef5ba53d9e86a2c130b80f5.tar.bz2
libgcc2.c (__throw): New routine.
* libgcc2.c (__throw): New routine. (__eh_pc): New data object for exception handling. * except.c (eh_saved_pc): New object so we can call assemble_external. (expand_internal_throw_indirect): Call assemble_external for __eh_pc. (end_eh_unwinder): Ditto. (init_eh): Initialize eh_saved_pc. fixes eh6.C on rs6000 and alpha From-SVN: r12646
Diffstat (limited to 'gcc/except.c')
-rw-r--r--gcc/except.c15
1 files changed, 12 insertions, 3 deletions
diff --git a/gcc/except.c b/gcc/except.c
index b7753e7..48b635b 100644
--- a/gcc/except.c
+++ b/gcc/except.c
@@ -165,9 +165,10 @@ struct label_node *caught_return_label_stack = NULL;
struct label_node *false_label_stack = NULL;
-/* The rtx for the saved PC value. */
+/* The rtx and the tree for the saved PC value. */
rtx eh_saved_pc_rtx;
+tree eh_saved_pc;
rtx expand_builtin_return_addr PROTO((enum built_in_function, int, rtx));
@@ -450,6 +451,7 @@ void
expand_internal_throw_indirect (context)
rtx context;
{
+ assemble_external (eh_saved_pc);
emit_move_insn (eh_saved_pc_rtx, context);
emit_throw ();
}
@@ -759,6 +761,8 @@ end_eh_unwinder ()
return;
#endif
+ assemble_external (eh_saved_pc);
+
expr = make_node (RTL_EXPR);
TREE_TYPE (expr) = void_type_node;
RTL_EXPR_RTL (expr) = const0_rtx;
@@ -955,8 +959,13 @@ check_exception_handler_labels ()
void
init_eh ()
{
- eh_saved_pc_rtx = gen_rtx (MEM, ptr_mode,
- gen_rtx (SYMBOL_REF, Pmode, "__eh_pc"));
+ tree type = build_pointer_type (make_node (VOID_TYPE));
+
+ eh_saved_pc = build_decl (VAR_DECL, get_identifier ("__eh_pc"), type);
+ DECL_EXTERNAL (eh_saved_pc) = 1;
+ TREE_PUBLIC (eh_saved_pc) = 1;
+ make_decl_rtl (eh_saved_pc, NULL_PTR, 1);
+ eh_saved_pc_rtx = DECL_RTL (eh_saved_pc);
}
/* Initialize various EH things. */