]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: mark R12 clobbered for special calls
authorCherry Zhang <cherryyz@google.com>
Tue, 27 Apr 2021 21:19:42 +0000 (17:19 -0400)
committerCherry Zhang <cherryyz@google.com>
Wed, 28 Apr 2021 14:01:59 +0000 (14:01 +0000)
In external linking mode the external linker may insert
trampolines, which use R12 as a scratch register. So a call could
potentially clobber R12 if the target is laid out too far. Mark
R12 clobbered.

Also, we will use R12 for trampolines in the Go linker as well.

CL 310731 updated the generated rewrite files so imports are
grouped, but the generator was not updated to do so. Grouped
imports are nice. But as those are generated files, for
simplicity and my laziness, just regenerate with the current
generator (which makes imports not grouped).

Change-Id: Iddb741ff7314a291ade5fbffc7d315f555808409
Reviewed-on: https://go-review.googlesource.com/c/go/+/314453
Trust: Cherry Zhang <cherryyz@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
src/cmd/compile/internal/ssa/gen/ARMOps.go
src/cmd/compile/internal/ssa/opGen.go
src/cmd/compile/internal/ssa/rewrite386.go
src/cmd/compile/internal/ssa/rewriteAMD64.go
src/cmd/compile/internal/ssa/rewriteARM.go
src/cmd/compile/internal/ssa/rewritePPC64.go
src/cmd/compile/internal/ssa/rewriteRISCV64.go
src/cmd/compile/internal/ssa/rewriteS390X.go
src/cmd/compile/internal/ssa/rewriteWasm.go
src/cmd/compile/internal/ssa/rewritegeneric.go

index 253ff573eca95c2d08b873ffbca10939352f7c91..d1f86039a36e5c98ab7d6681928d67ea50e66302 100644 (file)
@@ -2,6 +2,7 @@
 // Use of this source code is governed by a BSD-style
 // license that can be found in the LICENSE file.
 
+//go:build ignore
 // +build ignore
 
 package main
@@ -156,7 +157,7 @@ func init() {
                        reg: regInfo{
                                inputs:   []regMask{buildReg("R1"), buildReg("R0")},
                                outputs:  []regMask{buildReg("R0"), buildReg("R1")},
-                               clobbers: buildReg("R2 R3 R14"),
+                               clobbers: buildReg("R2 R3 R12 R14"), // R14 is LR, R12 is linker trampoline scratch register
                        },
                        clobberFlags: true,
                        typ:          "(UInt32,UInt32)",
@@ -459,7 +460,7 @@ func init() {
                        argLength: 3,
                        reg: regInfo{
                                inputs:   []regMask{buildReg("R1"), buildReg("R0")},
-                               clobbers: buildReg("R1 R14"),
+                               clobbers: buildReg("R1 R12 R14"), // R14 is LR, R12 is linker trampoline scratch register
                        },
                        faultOnNilArg0: true,
                },
@@ -476,7 +477,7 @@ func init() {
                        argLength: 3,
                        reg: regInfo{
                                inputs:   []regMask{buildReg("R2"), buildReg("R1")},
-                               clobbers: buildReg("R0 R1 R2 R14"),
+                               clobbers: buildReg("R0 R1 R2 R12 R14"), // R14 is LR, R12 is linker trampoline scratch register
                        },
                        faultOnNilArg0: true,
                        faultOnNilArg1: true,
@@ -564,8 +565,8 @@ func init() {
 
                // LoweredWB invokes runtime.gcWriteBarrier. arg0=destptr, arg1=srcptr, arg2=mem, aux=runtime.gcWriteBarrier
                // It saves all GP registers if necessary,
-               // but clobbers R14 (LR) because it's a call.
-               {name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("R2"), buildReg("R3")}, clobbers: (callerSave &^ gpg) | buildReg("R14")}, clobberFlags: true, aux: "Sym", symEffect: "None"},
+               // but clobbers R14 (LR) because it's a call, and R12 which is linker trampoline scratch register.
+               {name: "LoweredWB", argLength: 3, reg: regInfo{inputs: []regMask{buildReg("R2"), buildReg("R3")}, clobbers: (callerSave &^ gpg) | buildReg("R12 R14")}, clobberFlags: true, aux: "Sym", symEffect: "None"},
        }
 
        blocks := []blockData{
index 2f5662539724263be9b3c7c3f4638a613fa416c5..51cb0881b8534e73fdbe92c90f76f26932648fa3 100644 (file)
@@ -13879,7 +13879,7 @@ var opcodeTable = [...]opInfo{
                                {0, 2}, // R1
                                {1, 1}, // R0
                        },
-                       clobbers: 16396, // R2 R3 R14
+                       clobbers: 20492, // R2 R3 R12 R14
                        outputs: []outputInfo{
                                {0, 1}, // R0
                                {1, 2}, // R1
@@ -17228,7 +17228,7 @@ var opcodeTable = [...]opInfo{
                                {0, 2}, // R1
                                {1, 1}, // R0
                        },
-                       clobbers: 16386, // R1 R14
+                       clobbers: 20482, // R1 R12 R14
                },
        },
        {
@@ -17242,7 +17242,7 @@ var opcodeTable = [...]opInfo{
                                {0, 4}, // R2
                                {1, 2}, // R1
                        },
-                       clobbers: 16391, // R0 R1 R2 R14
+                       clobbers: 20487, // R0 R1 R2 R12 R14
                },
        },
        {
@@ -17403,7 +17403,7 @@ var opcodeTable = [...]opInfo{
                                {0, 4}, // R2
                                {1, 8}, // R3
                        },
-                       clobbers: 4294918144, // R14 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15
+                       clobbers: 4294922240, // R12 R14 F0 F1 F2 F3 F4 F5 F6 F7 F8 F9 F10 F11 F12 F13 F14 F15
                },
        },
 
index 93b258afac256a3156cf465afdb5632212cca78d..1ec2d26f750f6b7998933fca8cbeb668d9188f1a 100644 (file)
@@ -3,10 +3,8 @@
 
 package ssa
 
-import (
-       "cmd/compile/internal/types"
-       "math"
-)
+import "math"
+import "cmd/compile/internal/types"
 
 func rewriteValue386(v *Value) bool {
        switch v.Op {
index dd92b41c206e7d2dbbb1a6012e6fc47c9e9182f0..0b98b9ddf60162e6f9a680321ed7bdb53ffcc9b2 100644 (file)
@@ -3,12 +3,10 @@
 
 package ssa
 
-import (
-       "cmd/compile/internal/types"
-       "cmd/internal/obj"
-       "internal/buildcfg"
-       "math"
-)
+import "internal/buildcfg"
+import "math"
+import "cmd/internal/obj"
+import "cmd/compile/internal/types"
 
 func rewriteValueAMD64(v *Value) bool {
        switch v.Op {
index 25db5b9fbada885faa9666a23f96370af1ff27ee..febb5566e338492cb6f42e30d013b454b579fa4a 100644 (file)
@@ -3,10 +3,8 @@
 
 package ssa
 
-import (
-       "cmd/compile/internal/types"
-       "internal/buildcfg"
-)
+import "internal/buildcfg"
+import "cmd/compile/internal/types"
 
 func rewriteValueARM(v *Value) bool {
        switch v.Op {
index fe7620c218449221cb1a9bc34e6f79f9914824fd..96dee0bd21baf6d9f753dcbf615fee2797506fee 100644 (file)
@@ -3,11 +3,9 @@
 
 package ssa
 
-import (
-       "cmd/compile/internal/types"
-       "internal/buildcfg"
-       "math"
-)
+import "internal/buildcfg"
+import "math"
+import "cmd/compile/internal/types"
 
 func rewriteValuePPC64(v *Value) bool {
        switch v.Op {
index bc4b18e0cd6f7cbdc094633f29d50c1a2d173518..431fb1aaf66e0dd288704707d9ed909780533d4b 100644 (file)
@@ -3,10 +3,8 @@
 
 package ssa
 
-import (
-       "cmd/compile/internal/types"
-       "math"
-)
+import "math"
+import "cmd/compile/internal/types"
 
 func rewriteValueRISCV64(v *Value) bool {
        switch v.Op {
index 49c58987046d640fa51b01a41dca984588b80714..8b41d62c315bd25de6fa2adbdd553c17e1ca2a3e 100644 (file)
@@ -3,11 +3,9 @@
 
 package ssa
 
-import (
-       "cmd/compile/internal/types"
-       "cmd/internal/obj/s390x"
-       "math"
-)
+import "math"
+import "cmd/compile/internal/types"
+import "cmd/internal/obj/s390x"
 
 func rewriteValueS390X(v *Value) bool {
        switch v.Op {
index ed23ae032a29c06233141cd497fa90a6f2981938..5dab09f85b35780f7113c4cb5e89e70337c7ae49 100644 (file)
@@ -3,11 +3,9 @@
 
 package ssa
 
-import (
-       "cmd/compile/internal/types"
-       "internal/buildcfg"
-       "math"
-)
+import "internal/buildcfg"
+import "math"
+import "cmd/compile/internal/types"
 
 func rewriteValueWasm(v *Value) bool {
        switch v.Op {
index 0e5f49491ebcd245a70a01d8ef82d9d7b382921c..52258201ca105163e20197a200794c7604176ad2 100644 (file)
@@ -3,10 +3,8 @@
 
 package ssa
 
-import (
-       "cmd/compile/internal/types"
-       "math"
-)
+import "math"
+import "cmd/compile/internal/types"
 
 func rewriteValuegeneric(v *Value) bool {
        switch v.Op {