From: Eric Botcazou Date: Sun, 21 Sep 2003 08:17:48 +0000 (+0000) Subject: re PR target/12301 (corruption in exception path, exception in returned expression) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5cfc53563b5a8db2d08475d058be480894367183;p=gcc.git re PR target/12301 (corruption in exception path, exception in returned expression) PR target/12301 * reorg.c (stop_search_p): Return 1 for insns that can throw internally. From-SVN: r71620 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 35f2fba3a61..ca9c54098ea 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2003-09-21 Eric Botcazou + + PR target/12301 + * reorg.c (stop_search_p): Return 1 for insns that can + throw internally. + 2003-09-20 Richard Henderson * c-format.c (gcc_diag_char_table): Add %J. diff --git a/gcc/reorg.c b/gcc/reorg.c index 3d7159daa7c..6a13fe0634b 100644 --- a/gcc/reorg.c +++ b/gcc/reorg.c @@ -235,6 +235,12 @@ stop_search_p (rtx insn, int labels_p) if (insn == 0) return 1; + /* If the insn can throw an exception that is caught within the function, + it may effectively perform a jump from the viewpoint of the function. + Therefore act like for a jump. */ + if (can_throw_internal (insn)) + return 1; + switch (GET_CODE (insn)) { case NOTE: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a65e623fd40..11c7cff5343 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2003-09-21 Christian Ehrhardt + + * g++.dg/eh/delayslot1.C: New test. + 2003-09-20 Richard Henderson * gcc.dg/format/gcc_diag-1.c: Add tests for %J. diff --git a/gcc/testsuite/g++.dg/eh/delayslot1.C b/gcc/testsuite/g++.dg/eh/delayslot1.C new file mode 100644 index 00000000000..ddc960e6d8b --- /dev/null +++ b/gcc/testsuite/g++.dg/eh/delayslot1.C @@ -0,0 +1,47 @@ +// PR target/12301 +// Origin: Colin Hirsch +// Testcase by Christian Ehrhardt + +// This used to fail on SPARC because the reorg pass moved an insn +// across a function call that can throw internally, in order to put +// it in a delay slot. + +// { dg-do run } +// { dg-options "-O" } + +struct S{ + char *c; + char data[100]; + S () : c (data) {}; + S (const S& s) { + c = data; + data[0] = s.c[0]; + } +}; + +S real_cast () +{ + throw 3; +} + +S cast_helper(S& debug) +{ + try { + return real_cast(); + } + catch (int e) { + throw debug; + } +} + +int main() +{ + S tmp; + + try { + cast_helper (tmp); + } + catch (S& e) {} + + return 0; +}