From owner-freebsd-current@FreeBSD.ORG Tue Dec 9 01:57:23 2003 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id C333416A4CE for ; Tue, 9 Dec 2003 01:57:23 -0800 (PST) Received: from mailman.zeta.org.au (mailman.zeta.org.au [203.26.10.16]) by mx1.FreeBSD.org (Postfix) with ESMTP id EACF343D1F for ; Tue, 9 Dec 2003 01:57:21 -0800 (PST) (envelope-from bde@zeta.org.au) Received: from gamplex.bde.org (katana.zip.com.au [61.8.7.246]) by mailman.zeta.org.au (8.9.3p2/8.8.7) with ESMTP id UAA05389; Tue, 9 Dec 2003 20:57:14 +1100 Date: Tue, 9 Dec 2003 20:57:13 +1100 (EST) From: Bruce Evans X-X-Sender: bde@gamplex.bde.org To: Scott Kissel <00civic@comcast.net> In-Reply-To: <20031209011442.C6926@gamplex.bde.org> Message-ID: <20031209205644.X4462@gamplex.bde.org> References: <000501c3bd74$a73748a0$6701a8c0@Scratch> <20031208233846.N6390@gamplex.bde.org> <20031209011442.C6926@gamplex.bde.org> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII cc: freebsd-current@freebsd.org Subject: Re: Apparent i386 alloca.S bug (was: adsl/pppoe no longerconnecting on 5.1) X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 09 Dec 2003 09:57:24 -0000 [Resending after bounce] On Mon, 8 Dec 2003, Scott Kissel wrote: > On Thu, 12 Jun 2003, Tim Robbins wrote: > > >> On Thu, Jun 12, 2003 at 06:29:44PM +1000, Tim Robbins wrote: > >> > >> > Here's a test program for the i386 alloca() bug. Compile with > -std=gnu89 (or > >> > no -std option) and it works fine. Compile with -std=c99 or > -std=c89 and it > >> > breaks like this: > >> > > >> > corruption: 05 should be 0xcc at offset 0 > >> > corruption: 00 should be 0xcc at offset 1 > >> > corruption: 00 should be 0xcc at offset 2 > >> > corruption: 00 should be 0xcc at offset 3 > >> > > >> > Interestingly, gcc -std=c89 on FreeBSD 4.8 doesn't trigger the bug. > >> > >> I should mention that you need to compile with -march=pentiumpro to > trigger > >> the bug. It's related to the way gcc 3 uses "movl x,y(%esp)" instead > of > >> "pushl x" when passing arguments to a function. I suggest backing out > the > >> commit that made CSTD=c99 the default, so that we go back to using > gcc's > >> builtin alloca() until we figure out how to fix the one in libc. > > >I understand this now. This method of passing args is completely > incompatible > >with any implementation of the libc alloca like the current one. gcc > >prepares space for storing the args by subtracting from %esp. Then > >the libc alloca() points %esp to the allocated space, but gcc thinks > that > >%esp still points to the space that it has reserved for the args, so it > >clobbers the allocated space when it stores the args. > > > >BTW, the optimization of using "movl x,y(%esp)" instead of "pushl x" > >has the following benefits and costs: > > > >pentiumpro-like machine (old Celeron): +26% > > (4.05 seconds reduced to 2.99 seconds) > >pentiumpro-like machine (PIII (freefall)): +25% > > (1.82 seconds reduced to 1.37 seconds) > >AthlonXP: -45% > > (0.58 seconds increaded to 0.84 seconds) > > > >The times are for 10^8 calls to somefunc(1, 2, 3, 4, 5) in a loop. Oops, these numbers are backwards for the AthlonXP, which is just as well since the movel optimization is used for -march=athlonXP. > Sorry for bringing up an old message but I received a seg fault core > dump when performing a make buildworld after cvsuping. The exit was at: > cc -O -pipe -march=pentium2 -I/usr/src/lib/libc/include > -I/usr/src/lib/libc/../../include -I/usr/src/lib/libc/i386 > -D__DBINTERFACE_PRIVATE -I/usr/src/lib/libc/../../contrib/gdtoa -DINET6 > -I/usr/obj/usr/src/lib/libc -DPOSIX_MISTAKE -I/usr/src/lib/libc/locale > -DBROKEN_DES -DPORTMAP -DDES_BUILTIN -I/usr/src/lib/libc/rpc -DYP > -DHESIOD -Wsystem-headers -Werror -c > /usr/src/lib/libc/i386/gen/alloca.S > Segmentation fault (core dumped) > *** Error code 139 > > In an attempt to search why it's happening, I ran across these messages > and couldn't help but wonder if there was a fix or work around ever > figured out. While I am somewhat understanding what is being said in the > above messages, I wasn't sure if I was supposed to edit the alloca.S > file to resolve the issue, and how exactly to go about making changes in > that file. For reference, here's what it looks like: I think this is an unrelated problem. Most "Segmentation fault" are from bad memory or program bugs. > > #if !defined(__GNUC__) && !defined(__INTEL_COMPILER) > #error Please add alloca support for this compiler on FreeBSD. The fix for the alloca bug is just to not use this file for gcc. This should happen automatically. Bruce