Re: [PATCH v2] x86: fix early boot crash on gcc-10

From: Martin LiÅka
Date: Wed Apr 22 2020 - 10:16:59 EST


On 4/22/20 3:55 PM, Jakub Jelinek wrote:
On Wed, Apr 22, 2020 at 03:49:24PM +0200, Borislav Petkov wrote:
On Wed, Apr 22, 2020 at 01:40:07PM +0200, Peter Zijlstra wrote:
You haz a whitespace issue there.

Fixed.

Also, can we get this in writing, signed in blood, from the various
compiler teams ;-)

Yah, I wouldn't want to go fix this again in gcc11 or so. That's why I
wanted the explicit marking but let's try this first - it is too simple
to pass over without having tested it.

If virtual blood is enough, AFAIK GCC has never tried to accept volatile
inline asm (asm ("") is such; non-volatile asm such as int x; asm ("" : "=r" (x));
could be e.g. dead code eliminated) in the statements between function call and
return when deciding about what function can be tail-called or can use
tail-recursion and there are no plans to change that.

Jakub




One possible solution can be usage of a GCC pragma that will disable the tail-call optimization:

$ cat tail.c
int foo(int);

#pragma GCC push_options
#pragma GCC optimize("-fno-optimize-sibling-calls")
int baz(int a)
{
int r = foo(a);
return r;
}
#pragma GCC pop_options

I'm not sure if clang provides something similar (the -foptimize-sibling-calls option
is supported as well).

And as I talked to Boris, I would recommend to come up with a "configure" check
that a compiler does not optimize the key code sequence:

$ cat asm-detect.c
int foo(int a);
int bar(int a)
{
int r = foo(a);
asm ("");
return r;
}

$ gcc -O2 -c asm-detect.c -S -o/dev/stdout | grep jmp
[no output]

Martin