]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.12] cmd/compile: call ginsnop, not ginsnop2 on ppc64le for mid...
authorLynn Boger <laboger@linux.vnet.ibm.com>
Thu, 21 Feb 2019 19:48:52 +0000 (14:48 -0500)
committerIan Lance Taylor <iant@golang.org>
Mon, 25 Feb 2019 18:58:45 +0000 (18:58 +0000)
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/163337
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Reviewed-by: Carlos Eduardo Seo <cseo@linux.vnet.ibm.com>
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Andrew Bonventre <andybons@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
(cherry picked from commit 2d3474043cd35ba06d3566df520e8550c479944f)
Reviewed-on: https://go-review.googlesource.com/c/163717
Run-TryBot: Ian Lance Taylor <iant@golang.org>
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
src/cmd/compile/internal/amd64/galign.go
src/cmd/compile/internal/arm/galign.go
src/cmd/compile/internal/arm64/galign.go
src/cmd/compile/internal/gc/go.go
src/cmd/compile/internal/gc/ssa.go
src/cmd/compile/internal/mips/galign.go
src/cmd/compile/internal/mips64/galign.go
src/cmd/compile/internal/ppc64/galign.go
src/cmd/compile/internal/s390x/galign.go
src/cmd/compile/internal/wasm/ssa.go
src/cmd/compile/internal/x86/galign.go

index 58c469995fed539b5656692756c637ee9fe5798c..f6bb961c29e0e1628f63689954d57332f55c0557 100644 (file)
@@ -24,6 +24,7 @@ func Init(arch *gc.Arch) {
        arch.ZeroRange = zerorange
        arch.ZeroAuto = zeroAuto
        arch.Ginsnop = ginsnop
+       arch.Ginsnopdefer = ginsnop
 
        arch.SSAMarkMoves = ssaMarkMoves
        arch.SSAGenValue = ssaGenValue
index 241edaf3a0b9aa27e85b951433ad01c5ed832dfc..8469dbdd73b1ccc79df6bf5d9cd3a007093b2507 100644 (file)
@@ -19,6 +19,7 @@ func Init(arch *gc.Arch) {
        arch.ZeroRange = zerorange
        arch.ZeroAuto = zeroAuto
        arch.Ginsnop = ginsnop
+       arch.Ginsnopdefer = ginsnop
 
        arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {}
        arch.SSAGenValue = ssaGenValue
index a64be8e7a6237c54a5cf370755dc98e19723983d..f01fe8a5718d4969436e8b0f4380cc6c84f3b9f5 100644 (file)
@@ -19,6 +19,7 @@ func Init(arch *gc.Arch) {
        arch.ZeroRange = zerorange
        arch.ZeroAuto = zeroAuto
        arch.Ginsnop = ginsnop
+       arch.Ginsnopdefer = ginsnop
 
        arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {}
        arch.SSAGenValue = ssaGenValue
index 376637ba9adcabeb21e0528e14f32a09f1587908..40d01e2d398636f7fac398925b3ea1a1ff7be10d 100644 (file)
@@ -255,9 +255,10 @@ type Arch struct {
        Use387    bool // should 386 backend use 387 FP instructions instead of sse2.
        SoftFloat bool
 
-       PadFrame  func(int64) int64
-       ZeroRange func(*Progs, *obj.Prog, int64, int64, *uint32) *obj.Prog
-       Ginsnop   func(*Progs) *obj.Prog
+       PadFrame     func(int64) int64
+       ZeroRange    func(*Progs, *obj.Prog, int64, int64, *uint32) *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 func(*SSAGenState, *ssa.Block)
index e20137669aaac831cc8b9e8eba1781e985dbb68e..061574dc8aa2f865193ffaa317fcc6669ae2ea67 100644 (file)
@@ -5597,7 +5597,7 @@ func (s *SSAGenState) PrepareCall(v *ssa.Value) {
                // insert an actual hardware NOP that will have the right line number.
                // This is different from obj.ANOP, which is a virtual no-op
                // 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 {
index f207a17bbf08e71823eea68c8cdf36a8351ae090..596dbd7fa0cddbd4248637dbacc1627e7d0b6395 100644 (file)
@@ -22,6 +22,7 @@ func Init(arch *gc.Arch) {
        arch.ZeroRange = zerorange
        arch.ZeroAuto = zeroAuto
        arch.Ginsnop = ginsnop
+       arch.Ginsnopdefer = ginsnop
        arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {}
        arch.SSAGenValue = ssaGenValue
        arch.SSAGenBlock = ssaGenBlock
index 5252719e8eafd502d556be352512d967354901e8..07e9f98be5b6d48b95ce56c900115872ed5b14f5 100644 (file)
@@ -22,6 +22,7 @@ func Init(arch *gc.Arch) {
        arch.ZeroRange = zerorange
        arch.ZeroAuto = zeroAuto
        arch.Ginsnop = ginsnop
+       arch.Ginsnopdefer = ginsnop
 
        arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {}
        arch.SSAGenValue = ssaGenValue
index da971d864dbe794307f92a69c69fd43ad21848ec..8ad3084410cf17a70d6b08a704cf3f46f85579e0 100644 (file)
@@ -20,7 +20,8 @@ func Init(arch *gc.Arch) {
 
        arch.ZeroRange = zerorange
        arch.ZeroAuto = zeroAuto
-       arch.Ginsnop = ginsnop2
+       arch.Ginsnop = ginsnop
+       arch.Ginsnopdefer = ginsnop2
 
        arch.SSAMarkMoves = ssaMarkMoves
        arch.SSAGenValue = ssaGenValue
index 3f624692bb5a3c0f06e7addcfd4179e0e7f3aa42..26359abe66b11768c1cb2983ad0bad73f2329947 100644 (file)
@@ -17,6 +17,7 @@ func Init(arch *gc.Arch) {
        arch.ZeroRange = zerorange
        arch.ZeroAuto = zeroAuto
        arch.Ginsnop = ginsnop
+       arch.Ginsnopdefer = ginsnop
 
        arch.SSAMarkMoves = ssaMarkMoves
        arch.SSAGenValue = ssaGenValue
index 6e6dc557b4937a17356b8a195141ff739128fa50..897d6146c5b16b782273c43c1ee13f6a938bfe46 100644 (file)
@@ -20,6 +20,7 @@ func Init(arch *gc.Arch) {
        arch.ZeroRange = zeroRange
        arch.ZeroAuto = zeroAuto
        arch.Ginsnop = ginsnop
+       arch.Ginsnopdefer = ginsnop
 
        arch.SSAMarkMoves = ssaMarkMoves
        arch.SSAGenValue = ssaGenValue
index 56cc6c637d77684951bed0249ed85a7fd25a96c6..7f53ee3731cab97b54f04472375a5f81ff99679d 100644 (file)
@@ -32,6 +32,7 @@ func Init(arch *gc.Arch) {
        arch.ZeroRange = zerorange
        arch.ZeroAuto = zeroAuto
        arch.Ginsnop = ginsnop
+       arch.Ginsnopdefer = ginsnop
 
        arch.SSAMarkMoves = ssaMarkMoves
 }