summaryrefslogtreecommitdiffstats
path: root/gcc
diff options
context:
space:
mode:
authorrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2001-04-04 00:48:51 +0000
committerrth <rth@138bc75d-0d04-0410-961f-82ee72b054a4>2001-04-04 00:48:51 +0000
commitab7ccfa2f029279b4235b12056b24548fa5594c5 (patch)
treea27e63fae9c2f86fa257d09e1bbbabb90556730c /gcc
parent673b6e5ab711ecbcf92baee766353878def2d8aa (diff)
downloadppe42-gcc-ab7ccfa2f029279b4235b12056b24548fa5594c5.tar.gz
ppe42-gcc-ab7ccfa2f029279b4235b12056b24548fa5594c5.zip
* rtl.h (LCT_THROW): New.
* calls.c (emit_library_call_value_1): Handle it. * except.c (connect_post_landing_pads): Use it. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@41070 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/calls.c28
-rw-r--r--gcc/except.c2
-rw-r--r--gcc/rtl.h3
4 files changed, 30 insertions, 9 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index b508f5f48c0..a5a4673a78a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2001-04-03 Richard Henderson <rth@redhat.com>
+
+ * rtl.h (LCT_THROW): New.
+ * calls.c (emit_library_call_value_1): Handle it.
+ * except.c (connect_post_landing_pads): Use it.
+
2001-04-03 Zack Weinberg <zackw@stanford.edu>
* gansidecl.h: Delete file.
diff --git a/gcc/calls.c b/gcc/calls.c
index 694eeeee4e6..eb54aee2d8a 100644
--- a/gcc/calls.c
+++ b/gcc/calls.c
@@ -3521,15 +3521,29 @@ emit_library_call_value_1 (retval, orgfun, value, fn_type, outmode, nargs, p)
#endif
#endif
- /* No library functions can throw. */
+ /* By default, library functions can not throw. */
flags = ECF_NOTHROW;
- if (fn_type == LCT_CONST_MAKE_BLOCK)
- flags |= ECF_CONST;
- else if (fn_type == LCT_PURE_MAKE_BLOCK)
- flags |= ECF_PURE;
- else if (fn_type == LCT_NORETURN)
- flags |= ECF_NORETURN;
+ switch (fn_type)
+ {
+ case LCT_NORMAL:
+ case LCT_CONST:
+ case LCT_PURE:
+ /* Nothing to do here. */
+ break;
+ case LCT_CONST_MAKE_BLOCK:
+ flags |= ECF_CONST;
+ break;
+ case LCT_PURE_MAKE_BLOCK:
+ flags |= ECF_PURE;
+ break;
+ case LCT_NORETURN:
+ flags |= ECF_NORETURN;
+ break;
+ case LCT_THROW:
+ flags = ECF_NORETURN;
+ break;
+ }
fun = orgfun;
#ifdef PREFERRED_STACK_BOUNDARY
diff --git a/gcc/except.c b/gcc/except.c
index ec13ed04437..5404f4989e7 100644
--- a/gcc/except.c
+++ b/gcc/except.c
@@ -1818,7 +1818,7 @@ connect_post_landing_pads ()
if (outer)
emit_jump (outer->post_landing_pad);
else
- emit_library_call (unwind_resume_libfunc, LCT_NORETURN,
+ emit_library_call (unwind_resume_libfunc, LCT_THROW,
VOIDmode, 1, cfun->eh->exc_ptr, Pmode);
seq = get_insns ();
diff --git a/gcc/rtl.h b/gcc/rtl.h
index e4f2ab03714..667a304aec3 100644
--- a/gcc/rtl.h
+++ b/gcc/rtl.h
@@ -1982,7 +1982,8 @@ enum libcall_type
LCT_PURE = 2,
LCT_CONST_MAKE_BLOCK = 3,
LCT_PURE_MAKE_BLOCK = 4,
- LCT_NORETURN = 5
+ LCT_NORETURN = 5,
+ LCT_THROW = 6
};
extern void emit_library_call PARAMS ((rtx, enum libcall_type,
OpenPOWER on IntegriCloud