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.