aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2022-12-05 16:26:26 -0800
committerKeith Randall <khr@google.com>2022-12-06 05:12:12 +0000
commit1eb0465fa596a2d6e9c1a632499989544f0d7e68 (patch)
tree6449c26d4caa4841f0f28fc8da3f1deaa79482d8
parent9dde2de454b78e681dd7318dbf3ef68d6a3df2d1 (diff)
downloadgo-1eb0465fa596a2d6e9c1a632499989544f0d7e68.tar.gz
go-1eb0465fa596a2d6e9c1a632499989544f0d7e68.zip
cmd/compile: turn off jump tables when spectre retpolines are on
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>
-rw-r--r--src/cmd/compile/internal/walk/switch.go2
-rw-r--r--test/codegen/retpoline.go28
2 files changed, 29 insertions, 1 deletions
diff --git a/src/cmd/compile/internal/walk/switch.go b/src/cmd/compile/internal/walk/switch.go
index d38ba500f2..8ca8fa82e1 100644
--- a/src/cmd/compile/internal/walk/switch.go
+++ b/src/cmd/compile/internal/walk/switch.go
@@ -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 {
diff --git a/test/codegen/retpoline.go b/test/codegen/retpoline.go
index 15d6a26615..a04a005e2e 100644
--- a/test/codegen/retpoline.go
+++ b/test/codegen/retpoline.go
@@ -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
+}