Thread (22 messages) flat view 22 messages, 5 authors, 2021-03-10

Re: [PATCH v1] powerpc: Include running function as first entry in save_stack_trace() and friends

From: Segher Boessenkool <hidden>
Date: 2021-03-05 18:24:46
Also in: linux-arm-kernel, linux-toolchains, lkml

On Fri, Mar 05, 2021 at 07:38:25AM +0100, Christophe Leroy wrote:
Le 04/03/2021 à 20:24, Segher Boessenkool a écrit :
https://github.com/linuxppc/linux/commit/a9a3ed1eff36
quoted
That is much heavier than needed (an mb()).  You can just put an empty
inline asm after a call before a return, and that call cannot be
optimised to a sibling call: (the end of a function is an implicit
return:)
In the commit mentionned at the top, it is said:

The next attempt to prevent compilers from tail-call optimizing
the last function call cpu_startup_entry(), ... , was to add an empty 
asm("").

This current solution was short and sweet, and reportedly, is supported
by both compilers but we didn't get very far this time: future (LTO?)
optimization passes could potentially eliminate this,
This is simply not true.  A volatile inline asm (like this is, all
asm without outputs are) is always run on the reel machine exactly like
on the abstract machine.  LTO can not eliminate it, not more than any
other optimisation can.  The compiler makes no assumption about the
constents of the template of an asm, empty or not.

If you are really scared the compiler violates the rules of GCC inline
asm and thinks it knows what "" means, you can write
  asm(";#");
(that is a comment on all supported archs).
which leads us
to the third attempt: having an actual memory barrier there which the
compiler cannot ignore or move around etc.
Why would it not be allowed to delete this, and delete some other asm?

And the compiler *can* move around asm like this.  But the point is,
it has to stay in order with other side effects, so there cannot be a
sibling call here, the call has to remain: any call contains a sequence
point, so side effects cannot be reordered over it, so the call (being
before the asm) cannot be transformed to a tail call.


Segher
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help