go: runtime: missing deferreturn on linux/ppc64le
What version of Go are you using (go version
)?
$ go version go version go1.14.2 linux/ppc64le
Does this issue reproduce with the latest release?
Yes, the same issue exists on tip.
This is a regression between Go 1.13 and Go 1.14, presumably either due to the introduction of open coded defers, or due to a bug that is now being triggered.
What operating system and processor architecture are you using (go env
)?
go env
Output
$ go env GO111MODULE="" GOARCH="ppc64le" GOBIN="" GOCACHE="/home/jsing/.cache/go-build" GOENV="/home/jsing/.config/go/env" GOEXE="" GOFLAGS="" GOHOSTARCH="ppc64le" GOHOSTOS="linux" GOINSECURE="" GONOPROXY="" GONOSUMDB="" GOOS="linux" GOPATH="/home/jsing/go" GOPRIVATE="" GOPROXY="https://proxy.golang.org,direct" GOROOT="/home/jsing/src/go" GOSUMDB="sum.golang.org" GOTMPDIR="" GOTOOLDIR="/home/jsing/src/go/pkg/tool/linux_ppc64le" GCCGO="gccgo" GOPPC64="power8" AR="ar" CC="gcc" CXX="g++" CGO_ENABLED="1" GOMOD="" CGO_CFLAGS="-g -O2" CGO_CPPFLAGS="" CGO_CXXFLAGS="-g -O2" CGO_FFLAGS="-g -O2" CGO_LDFLAGS="-g -O2" PKG_CONFIG="pkg-config" GOGCCFLAGS="-fPIC -pthread -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build042050806=/tmp/go-build -gno-record-gcc-switches"
What did you do?
This was initially observed when trying to run tests in a large code base on linux/ppc64le. In order to reproduce the issue, a panic()
and defer()
needs to be run at a high PC - I’ve written a Go program (https://play.golang.org/p/CmKwSyteWhX) that produces a Go program that triggers this issue.
Save https://play.golang.org/p/CmKwSyteWhX as gen.go
then run:
$ go run gen.go && go run crash/main.go
What did you expect to see?
$ go run gen.go && go run crash/main.go
panic: blah
goroutine 1 [running]:
main.f2()
/home/jsing/tmp/crash/crash/main.go:20 +0x7c
main.f1()
/home/jsing/tmp/crash/crash/main.go:16 +0x3c
main.main()
/home/jsing/tmp/crash/crash/main.go:27 +0x24
exit status 2
What did you see instead?
$ go run gen.go && go run crash/main.go
fatal error: missing deferreturn
runtime stack:
runtime.throw(0x3ddde3d, 0x13)
/home/jsing/src/go/src/runtime/panic.go:1116 +0x5c
runtime.addOneOpenDeferFrame.func1.1(0x3fffd6114a10, 0x0, 0x4260c00)
/home/jsing/src/go/src/runtime/panic.go:753 +0x258
runtime.gentraceback(0x3dbf7ec, 0xc000084ed0, 0x0, 0xc000000180, 0x0, 0x0, 0x7fffffff, 0x3fffd6114ae0, 0x0, 0x0, ...)
/home/jsing/src/go/src/runtime/traceback.go:334 +0xea0
runtime.addOneOpenDeferFrame.func1()
/home/jsing/src/go/src/runtime/panic.go:721 +0x8c
runtime.systemstack(0x0)
/home/jsing/src/go/src/runtime/asm_ppc64x.s:269 +0x94
runtime.mstart()
/home/jsing/src/go/src/runtime/proc.go:1041
goroutine 1 [running]:
runtime.systemstack_switch()
/home/jsing/src/go/src/runtime/asm_ppc64x.s:216 +0x10 fp=0xc000084db0 sp=0xc000084d90 pc=0x625b0
runtime.addOneOpenDeferFrame(0xc000000180, 0x3dbf7ec, 0xc000084ed0)
/home/jsing/src/go/src/runtime/panic.go:720 +0x7c fp=0xc000084e00 sp=0xc000084db0 pc=0x3886c
panic(0x3dc9680, 0x3e0d2c0)
/home/jsing/src/go/src/runtime/panic.go:929 +0xdc fp=0xc000084ed0 sp=0xc000084e00 pc=0x38eac
main.f2()
/home/jsing/tmp/crash/crash/main.go:20 +0x7c fp=0xc000084f00 sp=0xc000084ed0 pc=0x3dbf7ec
main.f1()
/home/jsing/tmp/crash/crash/main.go:16 +0x3c fp=0xc000084f30 sp=0xc000084f00 pc=0x3dbf72c
main.main()
/home/jsing/tmp/crash/crash/main.go:27 +0x24 fp=0xc000084f50 sp=0xc000084f30 pc=0x3dbf834
runtime.main()
/home/jsing/src/go/src/runtime/proc.go:203 +0x248 fp=0xc000084fc0 sp=0xc000084f50 pc=0x3bcd8
runtime.goexit()
/home/jsing/src/go/src/runtime/asm_ppc64x.s:884 +0x4 fp=0xc000084fc0 sp=0xc000084fc0 pc=0x64b64
exit status 2
Changing n
from 4149 to 4148 in gen.go
will reduce the number of instructions prior to the defer()
and results in the test succeeding.
About this issue
- Original URL
- State: closed
- Created 4 years ago
- Reactions: 1
- Comments: 27 (17 by maintainers)
Commits related to this issue
- cmd/oldlink: port bug fixes to old linker This CL ports CL 234105 and CL 240621 to the old linker, which fix critical bugs (runtime crashes). Updates #39049. Updates #39927. Change-Id: I47afc843491... — committed to golang/go by cherrymui 4 years ago
- [release-branch.go1.14] cmd/link: detect trampoline of deferreturn call This is a backport of CL 234105. This is not a clean cherry-pick, as CL 234105 is for the new linker, whereas we still use the ... — committed to golang/go by cherrymui 4 years ago
@gopherbot please open a backport to 1.14
This is a critical bug for kubernetes project, can someone help us cherry-picking this to 1.14 release? @danscales @aclements @4a6f656c @thanm @danscales @jeremyfaller
@danscales - I just tested on a clean machine and noticed that I’d left
gen.go
with ann
of 4148, setting it to 4149 was insufficient on this host (so presumably memory pressure or OS stack allocation is playing into it). Setting it to 8000 did trigger the issue however.