On Sun, Jan 11, 2009 at 03:05:53PM -0800, Linus Torvalds wrote:
> 
> 
> On Sun, 11 Jan 2009, Linus Torvalds wrote:
> > On Sun, 11 Jan 2009, Andi Kleen wrote:
> > > 
> > > Was -- i think that got fixed in gcc. But again only in newer versions.
> > 
> > I doubt it. People have said that about a million times, it has never 
> > gotten fixed, and I've never seen any actual proof.
> 
> In fact, I just double-checked.
> Try this:

Hmm, I actually had tested it some time ago with my own program
(supposed to emulate an ioctl)

extern void f5(char *);

static void f3(void)
{
        char y[100];
        f5(y);
}

static void f2(void)
{
        char x[100];
        f5(x);
}

int f(int cmd)
{
        switch (cmd) { 
        case 1: f3(); break;
        case 2: f2(); break;
        }
        return 1;
}

and with gcc 4.3.1 I get:

.globl f
        .type   f, @function
f:
.LFB4:
        subq    $120, %rsp                      <---- not 200 bytes, stack gets 
reused; dunno where the 20 comes from
.LCFI0:
        cmpl    $1, %edi
        je      .L4
        cmpl    $2, %edi
        je      .L4
        movl    $1, %eax
        addq    $120, %rsp
        ret
        .p2align 4,,10
        .p2align 3
.L4:
        movq    %rsp, %rdi
        call    f5
        movl    $1, %eax
        addq    $120, %rsp
        ret
.LFE4:

so at least least for this case it works. Your case also doesn't work for me.
So it looks like gcc didn't like something you did in your test program.
Could be a pointer aliasing problem of some sort.

But yes it doesn't work as well as we hoped.

-Andi
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to