https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64999

--- Comment #8 from Dominik Vogt <vogt at linux dot vnet.ibm.com> ---
The cause for this bug is the interaction between the "--pc" and this code
snippet from printStackRecord() in pprof.go:

  ... if runtime.GOARCH == "s390" || runtime.GOARCH == "s390x" {
    // only works if function was called
    // with the brasl instruction (or a
    // different 6-byte instruction).
    tracepc -= 6
  } ...

First, the pc is decremented by one, pointing to the last byte of the brasl
instruction.  Then we subtract another six bytes and end up pointing to the
last byte of the previous instruction, and that messes up the stack trace. 
printStackRecord() does not know that unwind() has already decremented the pc
and may mis-calculate the instruction address, possibly not just for s390[x]
but for other architectures as well.

Reply via email to