From 3290e9c14551035f9be528e199f643a04ac7f047 Mon Sep 17 00:00:00 2001 From: Russ Cox Date: Tue, 14 Jul 2015 00:41:18 -0400 Subject: [PATCH] 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 --- src/runtime/signal_arm.go | 14 ++++++++++++-- src/runtime/signal_arm64.go | 14 ++++++++++++-- src/runtime/signal_ppc64x.go | 14 ++++++++++++-- 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/runtime/signal_arm.go b/src/runtime/signal_arm.go index 38d7181b2a..f1f3c60699 100644 --- a/src/runtime/signal_arm.go +++ b/src/runtime/signal_arm.go @@ -67,11 +67,21 @@ func sighandler(sig uint32, info *siginfo, ctxt unsafe.Pointer, gp *g) { c.set_sp(sp) *(*uint32)(unsafe.Pointer(uintptr(sp))) = c.lr() + 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.lr())) != 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_lr(uint32(gp.sigpc)) + if pc != 0 { + c.set_lr(uint32(pc)) } // In case we are panicking from external C code diff --git a/src/runtime/signal_arm64.go b/src/runtime/signal_arm64.go index dde3c7c43f..07ab638c26 100644 --- a/src/runtime/signal_arm64.go +++ b/src/runtime/signal_arm64.go @@ -80,11 +80,21 @@ func sighandler(sig uint32, info *siginfo, ctxt unsafe.Pointer, gp *g) { c.set_sp(sp) *(*uint64)(unsafe.Pointer(uintptr(sp))) = c.lr() + 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.lr())) != 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_lr(uint64(gp.sigpc)) + if pc != 0 { + c.set_lr(uint64(pc)) } // In case we are panicking from external C code 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 -- 2.50.0