]> Cypherpunks repositories - gostls13.git/commitdiff
[release-branch.go1.19] cmd/compile: turn off jump tables when spectre retpolines...
authorKeith Randall <khr@golang.org>
Tue, 6 Dec 2022 00:26:26 +0000 (16:26 -0800)
committerMichael Pratt <mpratt@google.com>
Fri, 9 Dec 2022 20:02:17 +0000 (20:02 +0000)
Fixes #57100

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>
(cherry picked from commit 1eb0465fa596a2d6e9c1a632499989544f0d7e68)
Reviewed-on: https://go-review.googlesource.com/c/go/+/455416
Reviewed-by: Michael Pratt <mpratt@google.com>
src/cmd/compile/internal/walk/switch.go
test/codegen/retpoline.go

index 6cac8f29377a1a348327cd2d9ae201bafeed5913..05e6aa4a5c89a32b44af5b7f0edf242b443f8f18 100644 (file)
@@ -289,7 +289,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
+}