aboutsummaryrefslogtreecommitdiff
path: root/src/run.bash
diff options
context:
space:
mode:
authorHector Martin Cantero <hector@marcansoft.com>2014-09-24 13:20:25 -0400
committerRuss Cox <rsc@golang.org>2014-09-24 13:20:25 -0400
commit7283e08cbf06bcd32a391183e26080cff301e7f9 (patch)
treea0badddaa894c277fddbbcab13caf224f3815dff /src/run.bash
parenta69e504a34bb965850cbab6fdc1b4bc687cdd0c5 (diff)
downloadgo-7283e08cbf06bcd32a391183e26080cff301e7f9.tar.gz
go-7283e08cbf06bcd32a391183e26080cff301e7f9.zip
runtime: keep g->syscallsp consistent after cgo->Go callbacks
Normally, the caller to runtime.entersyscall() must not return before calling runtime.exitsyscall(), lest g->syscallsp become a dangling pointer. runtime.cgocallbackg() violates this constraint. To work around this, save g->syscallsp and g->syscallpc around cgo->Go callbacks, then restore them after calling runtime.entersyscall(), which restores the syscall stack frame pointer saved by cgocall. This allows the GC to correctly trace a goroutine that is currently returning from a Go->cgo->Go chain. This also adds a check to proc.c that panics if g->syscallsp is clearly invalid. It is not 100% foolproof, as it will not catch a case where the stack was popped then pushed back beyond g->syscallsp, but it does catch the present cgo issue and makes existing tests fail without the bugfix. Fixes #7978. LGTM=dvyukov, rsc R=golang-codereviews, dvyukov, minux, bradfitz, iant, gobot, rsc CC=golang-codereviews, rsc https://golang.org/cl/131910043
Diffstat (limited to 'src/run.bash')
-rwxr-xr-xsrc/run.bash2
1 files changed, 2 insertions, 0 deletions
diff --git a/src/run.bash b/src/run.bash
index b5f061d885..d6e53304d8 100755
--- a/src/run.bash
+++ b/src/run.bash
@@ -119,6 +119,8 @@ go run $GOROOT/test/run.go - . || exit 1
[ "$CGO_ENABLED" != 1 ] ||
(xcd ../misc/cgo/test
+# cgo tests inspect the traceback for runtime functions
+export GOTRACEBACK=2
go test -ldflags '-linkmode=auto' || exit 1
# linkmode=internal fails on dragonfly since errno is a TLS relocation.
[ "$GOHOSTOS" == dragonfly ] || go test -ldflags '-linkmode=internal' || exit 1