[PATCH] s390: Add -fsplit-stack support
Marcin Kościelnicki
koriakin@0x04.net
Wed Feb 3 18:40:00 GMT 2016
>>
>> The second issue I'm still not sure about is the magic nop marker
>> for frameless functions. In an earlier mail you wrote:
>>
>>> Both currently supported
>>> architectures always emit split-stack code on every function.
>>
>> At least for rs6000 this doesn't appear to be true; in
>> rs6000_expand_split_stack_prologue we have:
>>
>> if (!info->push_p)
>> return;
>>
>> so it does nothing for frameless routines.
>>
>> Now on i386 we do indeed generate code for frameless routines;
>> in fact, the *same* full stack check is generated as for any
>> other routine. Now I'm wondering: is there are reason why
>> this check would be necessary (and there's simply a bug in
>> the rs6000 implementation)? Then we obviously should do the
>> same on s390.
>
> Try that on powerpc64(le):
>
> $ cat a.c
> #include <stdio.h>
>
> void f(void) {
> }
>
> typedef void (*fptr)(void);
>
> fptr g(void);
>
> int main() {
> printf("%p\n", g());
> }
>
> $ cat b.c
> void f(void);
>
> typedef void (*fptr)(void);
>
> fptr g(void) {
> return f;
> }
>
> $ gcc -O3 -fsplit-stack -c b.c
> $ gcc -O3 -c a.c
> $ gcc a.o b.o -fuse-ld=gold
>
> I don't have a recent enough gcc for powerpc, but from what I've seen in
> the code, this should explode with a linker error.
>
> Of course, mixing split-stack and non-split-stack code when function
> pointers are involved is sketchy anyway, so what's one more bug...
>
> That said, for s390, we can avoid the above problem by checking the
> relocation in gold now that ESA paths are gone - for direct function
> calls (the only ones we care about), we should be seeing a relocation in
> brasl. So I'll remove the nopmark thing and add proper recognition in
> gold.
Ugh. I take that back. For -fPIC, the load-address sequence is:
larl %r1,f@GOTENT
lg %r2,0(%r1)
br %r14
And (sibling) call sequence is:
larl %r1,f@GOTENT
lg %r1,0(%r1)
br %r1
It seems there's no proper way to recognize a call vs a load address -
so we can either go with emitting the marker, or have the same problem
as on ppc.
So - how much should we care?
>
>>
>> On the other hand, if rs6000 works fine *without* any code
>> in frameless routines, why wouldn't that work for s390 too?
>>
>> Emitting a nop (that is always executed) still looks weird to me.
>>
>>
>> Bye,
>> Ulrich
>>
>
More information about the Gcc-patches
mailing list