This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[Bug target/15551] New: -mtune=pentium4 -O2 with sjlj EH breaks stack probe worker on windows32 targets


When following testcase is compiled with

g++ -O2 -mtune=pentium4

for a cygwin or mingw target, the executable segfaults.

When tuning switch is set to pentium3 or lower,
the executable works correctly.

This is observed on 3.4.0 and on trunk, but not on gcc-3.3.3

/* pm.cpp */
/* Testcase submitted by Hans Horn to mingw bug tracker */

#include <cstring>
#include <fstream>
using namespace std;

ostream* logfile;

//char expList[20000];

int main () {

  logfile = new ofstream("bar", ios::out);

  char expList[20000];
  strcpy(expList, "foo");

  return 0;
}

/* end pm.cpp */



The problem appears to be in scheduling pass moving
sjlj exception handling insns across call to the allocate
stack probe worker (_alloca) in the function prologue.

Here is the assembler output for main() prologue from
g++ -S -O2 -mtune=pentium4 pm.cpp

_main:
	pushl	%ebp
	movl	$20092, %eax
	movl	%esp, %ebp
	pushl	%edi
	pushl	%esi
	movl	$___gxx_personality_sj0, -20052(%ebp) <<<<
	movl	$LLSDA1484, -20048(%ebp)              <<<< 
	pushl	%ebx                                     
	movl	$L4, -20040(%ebp)                     <<<< 
	call	__alloca
	movl	$16, %eax
	andl	$-16, %esp
	call	__alloca
	leal	-24(%ebp), %eax
	movl	%eax, -20044(%ebp)
	leal	-20076(%ebp), %eax
	movl	%esp, -20036(%ebp)
	movl	%eax, (%esp)
	call	__Unwind_SjLj_Register
	call	___main
<snip>

The following patch fixes by restoring the gen_blockage
barrier in i386.c:ix86_expand_prologue that was removed at revision 1.608

http://gcc.gnu.org/ml/gcc-cvs/2003-10/msg00685.html


The patch was tested on i386-pc-mingw32 on 3.4.1 and trunk.

	* config/i386/i386.c (ix86_expand_prologue):  Ensure that scheduling 
pass does
	not move insns across __alloca call


Index: i386.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/config/i386/i386.c,v
retrieving revision 1.668
diff -c -3 -p -r1.668 i386.c
*** i386.c	17 May 2004 15:23:12 -0000	1.668
--- i386.c	20 May 2004 07:30:16 -0000
*************** ix86_expand_prologue (void)
*** 5295,5300 ****
--- 5295,5304 ----
  	  rtx t = plus_constant (stack_pointer_rtx, allocate);
  	  emit_move_insn (eax, gen_rtx_MEM (SImode, t));
  	}
+ 
+       /* Ensure that scheduling pass does not move insns across __alloca
+          call.  */
+       emit_insn (gen_blockage (const0_rtx));
      }
  
    if (frame.save_regs_using_mov && !TARGET_RED_ZONE)

-- 
           Summary: -mtune=pentium4  -O2 with sjlj EH breaks stack probe
                    worker on windows32  targets
           Product: gcc
           Version: 3.4.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: target
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: dannysmith at users dot sourceforge dot net
                CC: gcc-bugs at gcc dot gnu dot org
 GCC build triplet: i686-pc-mingw32
  GCC host triplet: i686-pc-mingw32
GCC target triplet: i686-pc-mingw32


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=15551


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]