diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2012-11-29 22:58:23 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2012-11-29 22:58:23 +0000 |
commit | 85da11a61f0e8ce7d30f2ce79508c71ec8914f1b (patch) | |
tree | 65663b47ff72f52cbcb2aeb91f37bdce44a408c9 /gcc/calls.c | |
parent | 74df1ad0fe925176b64af72f03a25d0beb33f5bc (diff) | |
download | gcc-85da11a61f0e8ce7d30f2ce79508c71ec8914f1b.zip gcc-85da11a61f0e8ce7d30f2ce79508c71ec8914f1b.tar.gz gcc-85da11a61f0e8ce7d30f2ce79508c71ec8914f1b.tar.bz2 |
re PR middle-end/55321 (Ada bootstrap failure on armv5tel-linux-gnueabi)
PR middle-end/55321
* calls.c (emit_library_call_value_1): Mark as no-nonlocal if no-throw.
From-SVN: r193973
Diffstat (limited to 'gcc/calls.c')
-rw-r--r-- | gcc/calls.c | 17 |
1 files changed, 15 insertions, 2 deletions
diff --git a/gcc/calls.c b/gcc/calls.c index f4bed74..574c247 100644 --- a/gcc/calls.c +++ b/gcc/calls.c @@ -4196,13 +4196,11 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value, that it should complain if nonvolatile values are live. For functions that cannot return, inform flow that control does not fall through. */ - if (flags & ECF_NORETURN) { /* The barrier note must be emitted immediately after the CALL_INSN. Some ports emit more than just a CALL_INSN above, so we must search for it here. */ - rtx last = get_last_insn (); while (!CALL_P (last)) { @@ -4214,6 +4212,21 @@ emit_library_call_value_1 (int retval, rtx orgfun, rtx value, emit_barrier_after (last); } + /* Consider that "regular" libcalls, i.e. all of them except for LCT_THROW + and LCT_RETURNS_TWICE, cannot perform non-local gotos. */ + if (flags & ECF_NOTHROW) + { + rtx last = get_last_insn (); + while (!CALL_P (last)) + { + last = PREV_INSN (last); + /* There was no CALL_INSN? */ + gcc_assert (last != before_call); + } + + make_reg_eh_region_note_nothrow_nononlocal (last); + } + /* Now restore inhibit_defer_pop to its actual original value. */ OK_DEFER_POP; |