The following testcase gets wrong unwind info with
-m32 -Os -fpic -fno-asynchronous-unwind-tables
on the 4.3 branch (haven't tried 4.4 yet). The problem is incorrect
DW_CFA_GNU_args_size (usually off by 16), which results in catch receiving
%esp 16 bytes above what should be received. As this catch is called in the
loop 10 times, each iteration bumps %esp by 16 bytes and eventually trashes
saved variables on the stack (in http://bugzilla.redhat.com/447912
case already the 3rd iteration overwrites saved stderr pointer on the stack).
The interesting function is
_ZN17OleEmbeddedObject44TryToRetrieveCachedVisualRepresentation_ImplERKN3com3sun4star3uno9ReferenceINS2_2io7XStreamEEEh.
>From what I can see, DW_CFA_GNU_args_size matches the code from the beginning
until first call [EMAIL PROTECTED] After the following addl $16, %esp
it is still right (after that insns args_size is set to 0):
.LCFI2090:
call [EMAIL PROTECTED]
addl $16, %esp
.LCFI2091:
jmp .L542
...
.long .LCFI2090-.LCFI2089
.byte 0x2e # DW_CFA_GNU_args_size
.uleb128 0x10
.byte 0x4 # DW_CFA_advance_loc4
.long .LCFI2091-.LCFI2090
.byte 0x2e # DW_CFA_GNU_args_size
.uleb128 0x0
But the code jmp .L542 jumps to has args_size 16, not 0:
.LCFI2098:
call [EMAIL PROTECTED]
addl $16, %esp
.LCFI2099:
.LEHB94:
call [EMAIL PROTECTED]
.LEHE94:
.L542:
# basic block 17
cmpl $0, -20(%ebp)
je .L547
# basic block 18
movl [EMAIL PROTECTED](%ebx), %edx
movl $0, -144(%ebp)
movl %edx, -168(%ebp)
movl %edx, -172(%ebp)
movl %edx, -176(%ebp)
.L565:
# basic block 19
pushl %eax
.LCFI2100:
...
.long .LCFI2098-.LCFI2097
.byte 0x2e # DW_CFA_GNU_args_size
.uleb128 0x20
.byte 0x4 # DW_CFA_advance_loc4
.long .LCFI2099-.LCFI2098
.byte 0x2e # DW_CFA_GNU_args_size
.uleb128 0x10
.byte 0x4 # DW_CFA_advance_loc4
.long .LCFI2100-.LCFI2099
.byte 0x2e # DW_CFA_GNU_args_size
.uleb128 0x14
Without -fasynchronous-unwind-tables it honors second operands of CALL rtls and
those are correct for this codepath.
--
Summary: [4.3 Regression] Wrong unwind info with -Os -
fasynchronous-unwind-tables
Product: gcc
Version: 4.3.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: jakub at gcc dot gnu dot org
GCC target triplet: i686-linux
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36419