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
This commit is contained in:
parent
ddd2d57e72
commit
5cfc53563b
4 changed files with 63 additions and 0 deletions
|
@ -1,3 +1,9 @@
|
|||
2003-09-21 Eric Botcazou <ebotcazou@libertysurf.fr>
|
||||
|
||||
PR target/12301
|
||||
* reorg.c (stop_search_p): Return 1 for insns that can
|
||||
throw internally.
|
||||
|
||||
2003-09-20 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* c-format.c (gcc_diag_char_table): Add %J.
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -1,3 +1,7 @@
|
|||
2003-09-21 Christian Ehrhardt <ehrhardt@mathematik.uni-ulm.de>
|
||||
|
||||
* g++.dg/eh/delayslot1.C: New test.
|
||||
|
||||
2003-09-20 Richard Henderson <rth@redhat.com>
|
||||
|
||||
* gcc.dg/format/gcc_diag-1.c: Add tests for %J.
|
||||
|
|
47
gcc/testsuite/g++.dg/eh/delayslot1.C
Normal file
47
gcc/testsuite/g++.dg/eh/delayslot1.C
Normal file
|
@ -0,0 +1,47 @@
|
|||
// PR target/12301
|
||||
// Origin: Colin Hirsch <gcc@cohi.at>
|
||||
// Testcase by Christian Ehrhardt <ehrhardt@mathematik.uni-ulm.de>
|
||||
|
||||
// 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;
|
||||
}
|
Loading…
Add table
Reference in a new issue