NetBSD-Bugs archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
Re: toolchain/40694: gcc tail-call vs. volatile bug
The following reply was made to PR toolchain/40694; it has been noted by GNATS.
From: David Holland <dholland-bugs%netbsd.org@localhost>
To: gnats-bugs%NetBSD.org@localhost
Cc:
Subject: Re: toolchain/40694: gcc tail-call vs. volatile bug
Date: Sat, 31 Dec 2011 19:09:24 +0000
On Thu, Feb 19, 2009 at 06:00:00PM +0000, dholland%eecs.harvard.edu@localhost
wrote:
> Compiling the following fragment (gcc -O2 -S foo.c) generates an
> invalid tail call that does not repeat the local (volatile, no less)
> variable on a new stack frame.
>
> void
> recurse_inf(void)
> {
> volatile char buf[16];
> buf[0] = 0;
> recurse_inf();
> }
This is not fixed in gcc 4.5. The gcc 4.5 output for i386:
.file "foo.c"
.text
.globl recurse_inf
.type recurse_inf, @function
recurse_inf:
pushl %ebp
movl %esp, %ebp
subl $16, %esp
.L2:
movb $0, -16(%ebp)
jmp .L2
.size recurse_inf, .-recurse_inf
.ident "GCC: (NetBSD nb1 20110620) 4.5.3"
and for amd64 (excluding eh_frame gunk):
.file "foo.c"
.text
.globl recurse_inf
.type recurse_inf, @function
recurse_inf:
.LFB0:
.L2:
movb $0, -24(%rsp)
jmp .L2
.LFE0:
.size recurse_inf, .-recurse_inf
.ident "GCC: (NetBSD nb2 20110806) 4.5.3"
(Why is the gcc version slightly different? I'm not sure, both
tooldirs are pretty recent.)
> On a plain gcc 4.1.2 configured for mips I get two byte stores per
> loop, too, which blatantly violates the volatile rules:
Haven't tried this with gcc 4.5.3 but I wouldn't expect it to be much
different either.
--
David A. Holland
dholland%netbsd.org@localhost
Home |
Main Index |
Thread Index |
Old Index