From 843e83356cffe3b25ef5ba53d9e86a2c130b80f5 Mon Sep 17 00:00:00 2001 From: Mike Stump Date: Fri, 16 Aug 1996 00:52:06 +0000 Subject: [PATCH] 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 --- gcc/except.c | 15 ++++++++++++--- gcc/libgcc2.c | 15 +++++++++++++++ 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/gcc/except.c b/gcc/except.c index b7753e7639d..48b635b5ad2 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. */ diff --git a/gcc/libgcc2.c b/gcc/libgcc2.c index 41801fa73b0..1b1ecf48916 100644 --- a/gcc/libgcc2.c +++ b/gcc/libgcc2.c @@ -3149,6 +3149,21 @@ __throw_type_match (void *catch_type, void *throw_type, void *obj) return 0; } +/* Throw stub routine. + + This is work in progress, but not completed yet. */ + +void +__throw () +{ + abort (); +} + +/* This value identifies the place from which an exception is being + thrown. */ + +void *__eh_pc; + void __empty () { -- 2.30.2