[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