aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2021-01-29 09:55:03 -0500
committerRuss Cox <rsc@golang.org>2021-02-19 00:03:14 +0000
commita54f7fc0fde79e8edc696de002fe8a73604f077f (patch)
tree884070e174fc62566d601acdb36b7b6222e1dd6d
parent776ee4079a1d5fabd855a05b300aebdc3ea53efb (diff)
downloadgo-a54f7fc0fde79e8edc696de002fe8a73604f077f.tar.gz
go-a54f7fc0fde79e8edc696de002fe8a73604f077f.zip
runtime: do not treat asmcgocall as a topofstack on g0
This was added in 2018 to fix a runtime crash during unwind during a unhandled-panic-induced crash. (See https://golang.org/cl/90895 and #23576.) Clearly we cannot unwind past this function, and the change did stop the unwind. But it's not a top-of-stack function, and the real issue is that SP is changed. The new SPWRITE bit takes care of this instead, so we can drop it from the topofstack function. At this point the topofstack function is only checking the TOPFRAME bit, so we can inline that into the one call site. This CL is part of a stack adding windows/arm64 support (#36439), intended to land in the Go 1.17 cycle. This CL is, however, not windows/arm64-specific. It is cleanup meant to make the port (and future ports) easier. Change-Id: I856552298032770e48e06c95a20823a1dbd5e38c Reviewed-on: https://go-review.googlesource.com/c/go/+/288805 Trust: Russ Cox <rsc@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
-rw-r--r--src/runtime/traceback.go13
1 files changed, 1 insertions, 12 deletions
diff --git a/src/runtime/traceback.go b/src/runtime/traceback.go
index dbc2bddf42..7321790b78 100644
--- a/src/runtime/traceback.go
+++ b/src/runtime/traceback.go
@@ -209,7 +209,7 @@ func gentraceback(pc0, sp0, lr0 uintptr, gp *g, skip int, pcbuf *uintptr, max in
}
}
var flr funcInfo
- if topofstack(f, gp.m != nil && gp == gp.m.g0) {
+ if flag&funcFlag_TOPFRAME != 0 {
// This function marks the top of the stack. Stop the traceback.
frame.lr = 0
flr = funcInfo{}
@@ -1000,17 +1000,6 @@ func tracebackHexdump(stk stack, frame *stkframe, bad uintptr) {
})
}
-// Does f mark the top of a goroutine stack?
-func topofstack(f funcInfo, g0 bool) bool {
- return f.flag&funcFlag_TOPFRAME != 0 ||
- // asmcgocall is TOS on the system stack because it
- // switches to the system stack, but in this case we
- // can come back to the regular stack and still want
- // to be able to unwind through the call that appeared
- // on the regular stack.
- (g0 && f.funcID == funcID_asmcgocall)
-}
-
// isSystemGoroutine reports whether the goroutine g must be omitted
// in stack dumps and deadlock detector. This is any goroutine that
// starts at a runtime.* entry point, except for runtime.main,