From patchwork Thu Aug 5 18:08:57 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [6/9] Emit the prologue/epilogue using frame offsets. Date: Thu, 05 Aug 2010 08:08:57 -0000 From: Richard Henderson X-Patchwork-Id: 61011 Message-Id: <4C5AFE39.8090008@twiddle.net> To: "H.J. Lu" Cc: gcc-patches@gcc.gnu.org, kai.tietz@onevision.com, ubizjak@gmail.com On 08/05/2010 09:18 AM, H.J. Lu wrote: >> FAIL: g++.dg/torture/stackalign/eh-thiscall-1.C -O2 -fwhopr execution test >> >> I saw them on Fedora 13. >> > > Those failing tests are compiled with -fpic. Here is stack trace with > -O -fpic -static: Fixed. The problem was improper computation of the mask used for the unwind info. The test could still pass at runtime depending on the memory layout that the program receives. r~ PR target/45189 * config/i386/i386.c (ix86_emit_save_reg_using_mov): Make sure the alignment constant is properly sign-extended. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index dd81825..204211a 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -8639,7 +8639,8 @@ ix86_emit_save_reg_using_mov (enum machine_mode mode, unsigned int regno, reference to the locations within the frame. Instead, simply compute the location of the aligned frame from the frame pointer. */ - addr = GEN_INT (-crtl->stack_alignment_needed / BITS_PER_UNIT); + addr = GEN_INT (-(HOST_WIDE_INT)crtl->stack_alignment_needed + / BITS_PER_UNIT); addr = gen_rtx_AND (Pmode, hard_frame_pointer_rtx, addr); addr = plus_constant (addr, -cfa_offset); mem = gen_rtx_MEM (mode, addr);