aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2022-12-05 16:26:26 -0800
committerMichael Pratt <mpratt@google.com>2022-12-09 20:02:17 +0000
commit156578067111742b55718066c91b8ec66d35e03d (patch)
treead2f5ca4872f2dd9ecd86e3c7fbd5fe675da3ee5
parentdc04f3ba1f25313bc9c97e728620206c235db9ee (diff)
downloadgo-156578067111742b55718066c91b8ec66d35e03d.tar.gz
go-156578067111742b55718066c91b8ec66d35e03d.zip
[release-branch.go1.19] cmd/compile: turn off jump tables when spectre retpolines are on
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>
-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 6cac8f2937..05e6aa4a5c 100644
--- a/src/cmd/compile/internal/walk/switch.go
+++ b/src/cmd/compile/internal/walk/switch.go
@@ -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 {
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
+}