]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: turn off jump tables when spectre retpolines are on
authorKeith Randall <khr@golang.org>
Tue, 6 Dec 2022 00:26:26 +0000 (16:26 -0800)
committerKeith Randall <khr@google.com>
Tue, 6 Dec 2022 05:12:12 +0000 (05:12 +0000)
Fixes #57097

Change-Id: I6ab659abbca1ae0ac8710674d39aec116fab0baa
Reviewed-on: https://go-review.googlesource.com/c/go/+/455336
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Keith Randall <khr@golang.org>

src/cmd/compile/internal/walk/switch.go
test/codegen/retpoline.go

index d38ba500f2f3ce7713c4be4b157f653d3822724c..8ca8fa82e150f32e0b860d13e5d22ae3ca8a0f5f 100644 (file)
@@ -290,7 +290,7 @@ func (s *exprSwitch) tryJumpTable(cc []exprClause, out *ir.Nodes) bool {
        const minCases = 8   // have at least minCases cases in the switch
        const minDensity = 4 // use at least 1 out of every minDensity entries
 
-       if !go119UseJumpTables || base.Flag.N != 0 || !ssagen.Arch.LinkArch.CanJumpTable {
+       if !go119UseJumpTables || base.Flag.N != 0 || !ssagen.Arch.LinkArch.CanJumpTable || base.Ctxt.Retpoline {
                return false
        }
        if len(cc) < minCases {
index 15d6a2661551a6e0bf0b8b8bede6c92a639ea54a..a04a005e2ed526290d6baef816aec550e5bd76cb 100644 (file)
@@ -12,3 +12,31 @@ func CallInterface(x interface{ M() }) {
        // amd64:`CALL\truntime.retpoline`
        x.M()
 }
+
+// Check to make sure that jump tables are disabled
+// when retpoline is on. See issue 57097.
+func noJumpTables(x int) int {
+       switch x {
+       case 0:
+               return 0
+       case 1:
+               return 1
+       case 2:
+               return 2
+       case 3:
+               return 3
+       case 4:
+               return 4
+       case 5:
+               return 5
+       case 6:
+               return 6
+       case 7:
+               return 7
+       case 8:
+               return 8
+       case 9:
+               return 9
+       }
+       return 10
+}