Commit efc6d869 authored by Lynn Boger's avatar Lynn Boger Committed by Ian Lance Taylor

[release-branch.go1.12] cmd/compile: call ginsnop, not ginsnop2 on ppc64le for...

[release-branch.go1.12] cmd/compile: call ginsnop, not ginsnop2 on ppc64le for mid-stack inlining tracebacks

A recent change to fix stacktraces for inlined functions
introduced a regression on ppc64le when compiling position
independent code. That happened because ginsnop2 was called for
the purpose of inserting a NOP to identify the location of
the inlined function, when ginsnop should have been used.
ginsnop2 is intended to be used before deferreturn to ensure
r2 is properly restored when compiling position independent code.
In some cases the location where r2 is loaded from might not be
initialized. If that happens and r2 is used to generate an address,
the result is likely a SEGV.

This fixes that problem.

Fixes #30283

Change-Id: If70ef27fc65ef31969712422306ac3a57adbd5b6
Reviewed-on: https://go-review.googlesource.com/c/163337Reviewed-by: default avatarCherry Zhang <cherryyz@google.com>
Reviewed-by: default avatarCarlos Eduardo Seo <cseo@linux.vnet.ibm.com>
Reviewed-by: default avatarKeith Randall <khr@golang.org>
Run-TryBot: Andrew Bonventre <andybons@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
(cherry picked from commit 2d347404)
Reviewed-on: https://go-review.googlesource.com/c/163717
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent a718f939
...@@ -24,6 +24,7 @@ func Init(arch *gc.Arch) { ...@@ -24,6 +24,7 @@ func Init(arch *gc.Arch) {
arch.ZeroRange = zerorange arch.ZeroRange = zerorange
arch.ZeroAuto = zeroAuto arch.ZeroAuto = zeroAuto
arch.Ginsnop = ginsnop arch.Ginsnop = ginsnop
arch.Ginsnopdefer = ginsnop
arch.SSAMarkMoves = ssaMarkMoves arch.SSAMarkMoves = ssaMarkMoves
arch.SSAGenValue = ssaGenValue arch.SSAGenValue = ssaGenValue
......
...@@ -19,6 +19,7 @@ func Init(arch *gc.Arch) { ...@@ -19,6 +19,7 @@ func Init(arch *gc.Arch) {
arch.ZeroRange = zerorange arch.ZeroRange = zerorange
arch.ZeroAuto = zeroAuto arch.ZeroAuto = zeroAuto
arch.Ginsnop = ginsnop arch.Ginsnop = ginsnop
arch.Ginsnopdefer = ginsnop
arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {} arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {}
arch.SSAGenValue = ssaGenValue arch.SSAGenValue = ssaGenValue
......
...@@ -19,6 +19,7 @@ func Init(arch *gc.Arch) { ...@@ -19,6 +19,7 @@ func Init(arch *gc.Arch) {
arch.ZeroRange = zerorange arch.ZeroRange = zerorange
arch.ZeroAuto = zeroAuto arch.ZeroAuto = zeroAuto
arch.Ginsnop = ginsnop arch.Ginsnop = ginsnop
arch.Ginsnopdefer = ginsnop
arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {} arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {}
arch.SSAGenValue = ssaGenValue arch.SSAGenValue = ssaGenValue
......
...@@ -255,9 +255,10 @@ type Arch struct { ...@@ -255,9 +255,10 @@ type Arch struct {
Use387 bool // should 386 backend use 387 FP instructions instead of sse2. Use387 bool // should 386 backend use 387 FP instructions instead of sse2.
SoftFloat bool SoftFloat bool
PadFrame func(int64) int64 PadFrame func(int64) int64
ZeroRange func(*Progs, *obj.Prog, int64, int64, *uint32) *obj.Prog ZeroRange func(*Progs, *obj.Prog, int64, int64, *uint32) *obj.Prog
Ginsnop func(*Progs) *obj.Prog Ginsnop func(*Progs) *obj.Prog
Ginsnopdefer func(*Progs) *obj.Prog // special ginsnop for deferreturn
// SSAMarkMoves marks any MOVXconst ops that need to avoid clobbering flags. // SSAMarkMoves marks any MOVXconst ops that need to avoid clobbering flags.
SSAMarkMoves func(*SSAGenState, *ssa.Block) SSAMarkMoves func(*SSAGenState, *ssa.Block)
......
...@@ -5597,7 +5597,7 @@ func (s *SSAGenState) PrepareCall(v *ssa.Value) { ...@@ -5597,7 +5597,7 @@ func (s *SSAGenState) PrepareCall(v *ssa.Value) {
// insert an actual hardware NOP that will have the right line number. // insert an actual hardware NOP that will have the right line number.
// This is different from obj.ANOP, which is a virtual no-op // This is different from obj.ANOP, which is a virtual no-op
// that doesn't make it into the instruction stream. // that doesn't make it into the instruction stream.
thearch.Ginsnop(s.pp) thearch.Ginsnopdefer(s.pp)
} }
if sym, ok := v.Aux.(*obj.LSym); ok { if sym, ok := v.Aux.(*obj.LSym); ok {
......
...@@ -22,6 +22,7 @@ func Init(arch *gc.Arch) { ...@@ -22,6 +22,7 @@ func Init(arch *gc.Arch) {
arch.ZeroRange = zerorange arch.ZeroRange = zerorange
arch.ZeroAuto = zeroAuto arch.ZeroAuto = zeroAuto
arch.Ginsnop = ginsnop arch.Ginsnop = ginsnop
arch.Ginsnopdefer = ginsnop
arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {} arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {}
arch.SSAGenValue = ssaGenValue arch.SSAGenValue = ssaGenValue
arch.SSAGenBlock = ssaGenBlock arch.SSAGenBlock = ssaGenBlock
......
...@@ -22,6 +22,7 @@ func Init(arch *gc.Arch) { ...@@ -22,6 +22,7 @@ func Init(arch *gc.Arch) {
arch.ZeroRange = zerorange arch.ZeroRange = zerorange
arch.ZeroAuto = zeroAuto arch.ZeroAuto = zeroAuto
arch.Ginsnop = ginsnop arch.Ginsnop = ginsnop
arch.Ginsnopdefer = ginsnop
arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {} arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {}
arch.SSAGenValue = ssaGenValue arch.SSAGenValue = ssaGenValue
......
...@@ -20,7 +20,8 @@ func Init(arch *gc.Arch) { ...@@ -20,7 +20,8 @@ func Init(arch *gc.Arch) {
arch.ZeroRange = zerorange arch.ZeroRange = zerorange
arch.ZeroAuto = zeroAuto arch.ZeroAuto = zeroAuto
arch.Ginsnop = ginsnop2 arch.Ginsnop = ginsnop
arch.Ginsnopdefer = ginsnop2
arch.SSAMarkMoves = ssaMarkMoves arch.SSAMarkMoves = ssaMarkMoves
arch.SSAGenValue = ssaGenValue arch.SSAGenValue = ssaGenValue
......
...@@ -17,6 +17,7 @@ func Init(arch *gc.Arch) { ...@@ -17,6 +17,7 @@ func Init(arch *gc.Arch) {
arch.ZeroRange = zerorange arch.ZeroRange = zerorange
arch.ZeroAuto = zeroAuto arch.ZeroAuto = zeroAuto
arch.Ginsnop = ginsnop arch.Ginsnop = ginsnop
arch.Ginsnopdefer = ginsnop
arch.SSAMarkMoves = ssaMarkMoves arch.SSAMarkMoves = ssaMarkMoves
arch.SSAGenValue = ssaGenValue arch.SSAGenValue = ssaGenValue
......
...@@ -20,6 +20,7 @@ func Init(arch *gc.Arch) { ...@@ -20,6 +20,7 @@ func Init(arch *gc.Arch) {
arch.ZeroRange = zeroRange arch.ZeroRange = zeroRange
arch.ZeroAuto = zeroAuto arch.ZeroAuto = zeroAuto
arch.Ginsnop = ginsnop arch.Ginsnop = ginsnop
arch.Ginsnopdefer = ginsnop
arch.SSAMarkMoves = ssaMarkMoves arch.SSAMarkMoves = ssaMarkMoves
arch.SSAGenValue = ssaGenValue arch.SSAGenValue = ssaGenValue
......
...@@ -32,6 +32,7 @@ func Init(arch *gc.Arch) { ...@@ -32,6 +32,7 @@ func Init(arch *gc.Arch) {
arch.ZeroRange = zerorange arch.ZeroRange = zerorange
arch.ZeroAuto = zeroAuto arch.ZeroAuto = zeroAuto
arch.Ginsnop = ginsnop arch.Ginsnop = ginsnop
arch.Ginsnopdefer = ginsnop
arch.SSAMarkMoves = ssaMarkMoves arch.SSAMarkMoves = ssaMarkMoves
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment