From: Jakub Jelinek <[EMAIL PROTECTED]>
Date: Fri, 26 Oct 2007 09:48:25 +0200

> On Fri, Oct 26, 2007 at 12:27:01AM -0700, David Miller wrote:
> > From: Jakub Jelinek <[EMAIL PROTECTED]>
> > Date: Fri, 26 Oct 2007 09:09:03 +0200
> > 
> > > MEMs in current function's stack frame can be considered safe as
> > > well.
> > 
> > Unless they are passed by reference down into functions or
> > a reference to them is assigned into an externally visible
> > structure.
> 
> If they are passed by reference then the MEMs have some pointer
> as address, rather than argp/frame/sp + offset.

Even in cases like:

typedef unsigned char spinlock_t;
extern int spin_trylock(spinlock_t *);
extern int spin_unlock(spinlock_t *);

struct foo {
       spinlock_t lock;
       int a;
};

extern void foo_register(struct foo *p);
extern void foo_unregister(struct foo *p);

void example(void)
{
        struct foo local;

        foo_register(&local);

        if (spin_trylock(&local.lock)) {
                local.a++;
                spin_unlock(&local.lock);
        }

        foo_unregister(&local);
}


I suspect that local.a++ will be represented as a frame relative
access.  Test compiles show that gcc does update the on-stack
copy on Sparc, now just to check if the conditional memory
operation cases trigger here too.

Reply via email to