https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79341
--- Comment #45 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
deep-stack-uaf*.C failure is presumably because the fast unwind (one that
doesn't use .eh_frame unwind info) isn't working properly.
But I'm afraid I don't know enough about s390{,x} to debug that.
E.g. on following testcase with -O2 -fno-omit-frame-pointer I get:
void foo (char *);
int
bar (char *p)
{
foo (p);
return 1;
}
int
baz (char *p)
{
char a[64];
foo (a);
return 1;
}
stmg %r11,%r15,88(%r15)
aghi %r15,-160
lgr %r11,%r15
brasl %r14,foo
lg %r4,272(%r11)
lghi %r2,1
lmg %r11,%r15,248(%r11)
br %r4
for bar and
stmg %r11,%r15,88(%r15)
aghi %r15,-224
lgr %r11,%r15
la %r2,160(%r11)
brasl %r14,foo
lg %r4,336(%r11)
lghi %r2,1
lmg %r11,%r15,312(%r11)
br %r4
for baz. Frame pointer is $r15, stack pointer is $r11, if say in foo I ask for
frame pointer, I can easily get at $r15 from the caller (foo or bar), but how
do I get from there to the location where the outer function's $r15 is stored
at? It is at offset 160+120 in one function and 224+120 in another (and the
stored memory value doesn't tell much, it can be always computed from the
memory location where it is stored.
So, is non-unwind info backtrace not possible on s390{,x}? If yes, we should
disable the fast unwinding and maybe enable -fasynchronous-unwind-tables by
default on s390{,x}-linux at least when using -fsanitize=address?