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/a9a3ed1eff36quoted
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