On Wed, Jul 08, 2015 at 03:15:12PM -0600, Jeff Law wrote:
> >>>>>For other archs, e.g. x86-64, you can do
> >>>>>
> >>>>> register void *sp asm("%sp");
> >>>>> asm volatile("call func" : "+r"(sp));
> >
> >I've found that putting "sp" in the clobber list also seems to work:
> >
> >   asm volatile("call func" : : : "sp");
> >
> >This syntax is nicer because it doesn't need a local variable associated
> >with the register.  Do you see any issues with this approach?
> Given that SP isn't subject to register allocation, I'd expect it's 
> fine.  Note that some folks have (loudly) requested that GCC issue an 
> error if an asm tries to clobber sp.
> 
> The call doesn't actually clobber the stack pointer does it?  ISTM that 
> a use of sp makes more sense and is better "future proof'd" than 
> clobbering sp.

LRA thinks that when an asm clobbers sp, it can no longer eliminate to sp.
When an asm "merely" writes to sp, it is fine with that.

In both cases everything happily pretends sp does not actually change.
So it is a good thing that in fact it doesn't ;-)

All these approaches assume the only thing you really want to happen
before the asm call is the sp changes done in the prologue; if the
prologue does other things you depend on (setting up fp?), if you want
futureproofitivity, you want to make the asm depend on that as well.


Segher

Reply via email to