mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
runtime: refactor test for pushing sigpanic frame
This logic is duplicated in all of the preparePanic functions. Pull it out into one architecture-independent function. Change-Id: I7ef4e78e3eda0b7be1a480fb5245fc7424fb2b4e Reviewed-on: https://go-review.googlesource.com/91255 Run-TryBot: Austin Clements <austin@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Ian Lance Taylor <iant@golang.org>
This commit is contained in:
parent
b1679e4d03
commit
615d44c287
9 changed files with 49 additions and 102 deletions
|
|
@ -786,3 +786,36 @@ func canpanic(gp *g) bool {
|
|||
}
|
||||
return true
|
||||
}
|
||||
|
||||
// shouldPushSigpanic returns true if pc should be used as sigpanic's
|
||||
// return PC (pushing a frame for the call). Otherwise, it should be
|
||||
// left alone so that LR is used as sigpanic's return PC, effectively
|
||||
// replacing the top-most frame with sigpanic. This is used by
|
||||
// preparePanic.
|
||||
func shouldPushSigpanic(gp *g, pc, lr uintptr) bool {
|
||||
if pc == 0 {
|
||||
// Probably a call to a nil func. The old LR is more
|
||||
// useful in the stack trace. Not pushing the frame
|
||||
// will make the trace look like a call to sigpanic
|
||||
// instead. (Otherwise the trace will end at sigpanic
|
||||
// and we won't get to see who faulted.)
|
||||
return false
|
||||
}
|
||||
// If we don't recognize the PC as code, but we do recognize
|
||||
// the link register as code, then this assumes the panic was
|
||||
// caused by a call to non-code. In this case, we want to
|
||||
// ignore this call to make unwinding show the context.
|
||||
if findfunc(pc).valid() {
|
||||
// This wasn't a bad call, so use PC as sigpanic's
|
||||
// return PC.
|
||||
return true
|
||||
}
|
||||
if findfunc(lr).valid() {
|
||||
// This was a bad call, but the LR is good, so use the
|
||||
// LR as sigpanic's return PC.
|
||||
return false
|
||||
}
|
||||
// Neither the PC or LR is good. Hopefully pushing a frame
|
||||
// will work.
|
||||
return true
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue