[i386] Fix unwind/debug info for nested functions on 64-bit Windows
Eric Botcazou
ebotcazou@adacore.com
Mon Oct 1 08:14:00 GMT 2012
Hi,
in the section of ix86_expand_prologue establishing the frame for Windows
targets, there is:
/* Note that SEH directives need to continue tracking the stack
pointer even after the frame pointer has been set up. */
if (m->fs.cfa_reg == stack_pointer_rtx || TARGET_SEH)
{
if (m->fs.cfa_reg == stack_pointer_rtx)
m->fs.cfa_offset += allocate;
RTX_FRAME_RELATED_P (insn) = 1;
add_reg_note (insn, REG_FRAME_RELATED_EXPR,
gen_rtx_SET (VOIDmode, stack_pointer_rtx,
plus_constant (Pmode, stack_pointer_rtx,
-allocate)));
}
But there is also a few lines above:
if (eax_live)
{
emit_insn (gen_push (eax));
allocate -= UNITS_PER_WORD;
}
if (r10_live)
{
r10 = gen_rtx_REG (Pmode, R10_REG);
emit_insn (gen_push (r10));
allocate -= UNITS_PER_WORD;
}
and these 2 pushes aren't marked, which can result in wrong SEH unwind and
DWARF debug info on 64-bit Windows (we have an example of each kind in Ada).
Tested on x86_64-suse-linux and with a 4.7-based SEH-enabled compiler for 64-
Bit Windows. OK for mainline and 4.7 branch?
2012-10-01 Eric Botcazou <ebotcazou@adacore.com>
* config/i386/i386.c (ix86_expand_prologue): Emit frame info for the
special register pushes before frame probing and allocation.
--
Eric Botcazou
-------------- next part --------------
A non-text attachment was scrubbed...
Name: p.diff
Type: text/x-patch
Size: 2049 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/gcc-patches/attachments/20121001/a988eb3d/attachment.bin>
More information about the Gcc-patches
mailing list