Skip to content

Commit efc6d86

Browse files
labogerianlancetaylor
authored andcommitted
[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/163337 Reviewed-by: Cherry Zhang <[email protected]> Reviewed-by: Carlos Eduardo Seo <[email protected]> Reviewed-by: Keith Randall <[email protected]> Run-TryBot: Andrew Bonventre <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> (cherry picked from commit 2d34740) Reviewed-on: https://go-review.googlesource.com/c/163717 Run-TryBot: Ian Lance Taylor <[email protected]> Reviewed-by: Brad Fitzpatrick <[email protected]>
1 parent a718f93 commit efc6d86

File tree

11 files changed

+15
-5
lines changed

11 files changed

+15
-5
lines changed

src/cmd/compile/internal/amd64/galign.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ func Init(arch *gc.Arch) {
2424
arch.ZeroRange = zerorange
2525
arch.ZeroAuto = zeroAuto
2626
arch.Ginsnop = ginsnop
27+
arch.Ginsnopdefer = ginsnop
2728

2829
arch.SSAMarkMoves = ssaMarkMoves
2930
arch.SSAGenValue = ssaGenValue

src/cmd/compile/internal/arm/galign.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ func Init(arch *gc.Arch) {
1919
arch.ZeroRange = zerorange
2020
arch.ZeroAuto = zeroAuto
2121
arch.Ginsnop = ginsnop
22+
arch.Ginsnopdefer = ginsnop
2223

2324
arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {}
2425
arch.SSAGenValue = ssaGenValue

src/cmd/compile/internal/arm64/galign.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ func Init(arch *gc.Arch) {
1919
arch.ZeroRange = zerorange
2020
arch.ZeroAuto = zeroAuto
2121
arch.Ginsnop = ginsnop
22+
arch.Ginsnopdefer = ginsnop
2223

2324
arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {}
2425
arch.SSAGenValue = ssaGenValue

src/cmd/compile/internal/gc/go.go

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -255,9 +255,10 @@ type Arch struct {
255255
Use387 bool // should 386 backend use 387 FP instructions instead of sse2.
256256
SoftFloat bool
257257

258-
PadFrame func(int64) int64
259-
ZeroRange func(*Progs, *obj.Prog, int64, int64, *uint32) *obj.Prog
260-
Ginsnop func(*Progs) *obj.Prog
258+
PadFrame func(int64) int64
259+
ZeroRange func(*Progs, *obj.Prog, int64, int64, *uint32) *obj.Prog
260+
Ginsnop func(*Progs) *obj.Prog
261+
Ginsnopdefer func(*Progs) *obj.Prog // special ginsnop for deferreturn
261262

262263
// SSAMarkMoves marks any MOVXconst ops that need to avoid clobbering flags.
263264
SSAMarkMoves func(*SSAGenState, *ssa.Block)

src/cmd/compile/internal/gc/ssa.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5597,7 +5597,7 @@ func (s *SSAGenState) PrepareCall(v *ssa.Value) {
55975597
// insert an actual hardware NOP that will have the right line number.
55985598
// This is different from obj.ANOP, which is a virtual no-op
55995599
// that doesn't make it into the instruction stream.
5600-
thearch.Ginsnop(s.pp)
5600+
thearch.Ginsnopdefer(s.pp)
56015601
}
56025602

56035603
if sym, ok := v.Aux.(*obj.LSym); ok {

src/cmd/compile/internal/mips/galign.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ func Init(arch *gc.Arch) {
2222
arch.ZeroRange = zerorange
2323
arch.ZeroAuto = zeroAuto
2424
arch.Ginsnop = ginsnop
25+
arch.Ginsnopdefer = ginsnop
2526
arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {}
2627
arch.SSAGenValue = ssaGenValue
2728
arch.SSAGenBlock = ssaGenBlock

src/cmd/compile/internal/mips64/galign.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ func Init(arch *gc.Arch) {
2222
arch.ZeroRange = zerorange
2323
arch.ZeroAuto = zeroAuto
2424
arch.Ginsnop = ginsnop
25+
arch.Ginsnopdefer = ginsnop
2526

2627
arch.SSAMarkMoves = func(s *gc.SSAGenState, b *ssa.Block) {}
2728
arch.SSAGenValue = ssaGenValue

src/cmd/compile/internal/ppc64/galign.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,8 @@ func Init(arch *gc.Arch) {
2020

2121
arch.ZeroRange = zerorange
2222
arch.ZeroAuto = zeroAuto
23-
arch.Ginsnop = ginsnop2
23+
arch.Ginsnop = ginsnop
24+
arch.Ginsnopdefer = ginsnop2
2425

2526
arch.SSAMarkMoves = ssaMarkMoves
2627
arch.SSAGenValue = ssaGenValue

src/cmd/compile/internal/s390x/galign.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ func Init(arch *gc.Arch) {
1717
arch.ZeroRange = zerorange
1818
arch.ZeroAuto = zeroAuto
1919
arch.Ginsnop = ginsnop
20+
arch.Ginsnopdefer = ginsnop
2021

2122
arch.SSAMarkMoves = ssaMarkMoves
2223
arch.SSAGenValue = ssaGenValue

src/cmd/compile/internal/wasm/ssa.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ func Init(arch *gc.Arch) {
2020
arch.ZeroRange = zeroRange
2121
arch.ZeroAuto = zeroAuto
2222
arch.Ginsnop = ginsnop
23+
arch.Ginsnopdefer = ginsnop
2324

2425
arch.SSAMarkMoves = ssaMarkMoves
2526
arch.SSAGenValue = ssaGenValue

src/cmd/compile/internal/x86/galign.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ func Init(arch *gc.Arch) {
3232
arch.ZeroRange = zerorange
3333
arch.ZeroAuto = zeroAuto
3434
arch.Ginsnop = ginsnop
35+
arch.Ginsnopdefer = ginsnop
3536

3637
arch.SSAMarkMoves = ssaMarkMoves
3738
}

0 commit comments

Comments
 (0)