The program below doesn't exit with 0 as expected when it's compiled
with -O2. It works fine with -O1 or -O2 -fno-delayed-branch.
--
int *dummy;
void
bar (int *p)
{
dummy = p;
}
void
foo (int x)
{
int var;
bar (&var);
if (x)
throw 1;
}
int
main ()
{
try {
foo (1);
} catch (...) {
return 0;
}
return 1;
}
--
With -O2, the function foo looks like:
_Z3fooi:
.LFB3:
mov.l r8,@-r15
.LCFI3:
mov r4,r8
mov.l r14,@-r15
.LCFI4:
sts.l pr,@-r15
.LCFI5:
mov.l .L11,r1
add #-4,r15
.LCFI6:
mov r15,r14
.LCFI7:
jsr @r1
mov r14,r4
tst r8,r8
bf/s .L10
add #4,r14
mov r14,r15
lds.l @r15+,pr
mov.l @r15+,r14
rts
mov.l @r15+,r8
.align 5
.L10:
mov.l .L12,r0
jsr @r0
mov #4,r4
mov #1,r1
mov.l r1,@r0
mov.l .L13,r1
mov r0,r4
mov.l .L14,r5
jsr @r1
mov #0,r6
...
Thus the throw part starting with .L10 is called after the excution of
"add #4,r14" in the delayed slot. It seems that this doesn't match
the frame info of foo:
$ readelf -a ./a.out | grep foo
99: 00400760 100 FUNC GLOBAL DEFAULT 11 _Z3fooi
$ readelf --debug-dump=frames ./a.out
The section .eh_frame contains:
...
0000001c 00000028 00000020 FDE cie=00000000 pc=00400760..004007c4
Augmentation data: 00 00 00 00
DW_CFA_advance_loc: 2 to 00400762
DW_CFA_def_cfa_offset: 4
DW_CFA_offset: r8 at cfa-4
DW_CFA_advance_loc: 4 to 00400766
DW_CFA_def_cfa_offset: 8
DW_CFA_advance_loc: 2 to 00400768
DW_CFA_def_cfa_offset: 12
DW_CFA_advance_loc: 4 to 0040076c
DW_CFA_def_cfa_offset: 16
DW_CFA_offset: r17 at cfa-12
DW_CFA_offset: r14 at cfa-8
DW_CFA_advance_loc: 2 to 0040076e
DW_CFA_def_cfa_reg: r14
DW_CFA_nop
DW_CFA_nop
which assumes that r14 points the bottom of the frame when the throw
part is called.
--
Summary: [4.0.0] SH: wrong code for EH
Product: gcc
Version: 4.0.0
Status: UNCONFIRMED
Severity: normal
Priority: P2
Component: target
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: kkojima at gcc dot gnu dot org
CC: gcc-bugs at gcc dot gnu dot org
GCC build triplet: sh4-unknown-linux-gnu
GCC host triplet: sh4-unknown-linux-gnu
GCC target triplet: sh4-unknown-linux-gnu
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18032