Messages in this thread | | | Date | Thu, 10 Sep 2020 10:20:30 -0500 | From | Segher Boessenkool <> | Subject | Re: remove the last set_fs() in common code, and remove it for x86 and powerpc v3 |
| |
On Thu, Sep 10, 2020 at 12:26:53PM +0000, David Laight wrote: > Actually this is pretty sound: > __label__ label; > register int eax asm ("eax"); > // Ensure eax can't be reloaded from anywhere > // In particular it can't be reloaded after the asm goto line > asm volatile ("" : "=r" (eax));
This asm is fine. It says it writes the "eax" variable, which lives in the eax register *in that asm* (so *not* guaranteed after it!).
> // Provided gcc doesn't save eax here... > asm volatile goto ("xxxxx" ::: "eax" : label);
So this is incorrect.
> // ... and reload the saved value here. > // The input value here will be that modified by the 'asm goto'. > // Since this modifies eax it can't be moved before the 'asm goto'. > asm volatile ("" : "+r" (eax)); > // So here eax must contain the value set by the "xxxxx" instructions.
No, the register eax will contain the value of the eax variable. In the asm; it might well be there before or after the asm as well, but none of that is guaranteed.
Segher
| |