aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/signal_ppc64x.go
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2015-07-14 00:41:18 -0400
committerRuss Cox <rsc@golang.org>2015-07-14 04:42:12 +0000
commit3290e9c14551035f9be528e199f643a04ac7f047 (patch)
treeb348876f0ed35d14191469bb3443fecd10aa0939 /src/runtime/signal_ppc64x.go
parent73ca459a56ef003ad0892ef46454bc98afd30a05 (diff)
downloadgo-3290e9c14551035f9be528e199f643a04ac7f047.tar.gz
go-3290e9c14551035f9be528e199f643a04ac7f047.zip
runtime: fix build on non-x86 machines
Fixes #11656 (again). Change-Id: I170ff10bfbdb0f34e57c11de42b6ee5291837813 Reviewed-on: https://go-review.googlesource.com/12142 Reviewed-by: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/runtime/signal_ppc64x.go')
-rw-r--r--src/runtime/signal_ppc64x.go14
1 files changed, 12 insertions, 2 deletions
diff --git a/src/runtime/signal_ppc64x.go b/src/runtime/signal_ppc64x.go
index 04d8cfcec1..4462e0ccf8 100644
--- a/src/runtime/signal_ppc64x.go
+++ b/src/runtime/signal_ppc64x.go
@@ -84,11 +84,21 @@ func sighandler(sig uint32, info *siginfo, ctxt unsafe.Pointer, gp *g) {
c.set_sp(sp)
*(*uint64)(unsafe.Pointer(uintptr(sp))) = c.link()
+ pc := uintptr(gp.sigpc)
+
+ // If we don't recognize the PC as code
+ // but we do recognize the link register as code,
+ // then assume this was a call to non-code and treat like
+ // pc == 0, to make unwinding show the context.
+ if pc != 0 && findfunc(pc) == nil && findfunc(uintptr(c.link())) != nil {
+ pc = 0
+ }
+
// Don't bother saving PC if it's zero, which is
// probably a call to a nil func: the old link register
// is more useful in the stack trace.
- if gp.sigpc != 0 {
- c.set_link(uint64(gp.sigpc))
+ if pc != 0 {
+ c.set_link(uint64(pc))
}
// In case we are panicking from external C code