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?

Reply via email to