aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/asm/internal
diff options
context:
space:
mode:
authorquasilyte <quasilyte@gmail.com>2018-04-18 19:49:27 +0300
committerBrad Fitzpatrick <bradfitz@golang.org>2018-04-20 23:45:47 +0000
commitd487488135735e9dfd30c6c37940e6abc3189ba3 (patch)
treefbebceea007e80753b3987025c574c00e7d46d91 /src/cmd/asm/internal
parentdd71e3fef4a2845ae33c493e7fcdd7702812669d (diff)
downloadgo-d487488135735e9dfd30c6c37940e6abc3189ba3.tar.xz
cmd/internal/obj/x86: disallow PC/FP/SB scaled index
Reject to compile I386/AMD64 asm code that contains (Register)(PseudoReg*scale) forms of memory operands. Example of such program: "CALL (AX)(PC*2)". PseudoReg is one of the PC, FP, SB (but not SP). When pseudo-register is used in register indirect as scaled index base, x86 backend will panic because its register file misses SB/FP/PC registers. Fixes #12657. Change-Id: I30fca797b537cbc86ab47583ae96c6a0c59acaa1 Reviewed-on: https://go-review.googlesource.com/107835 Run-TryBot: Iskander Sharipov <iskander.sharipov@intel.com> Reviewed-by: Cherry Zhang <cherryyz@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org>
Diffstat (limited to 'src/cmd/asm/internal')
-rw-r--r--src/cmd/asm/internal/asm/testdata/amd64error.s4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/cmd/asm/internal/asm/testdata/amd64error.s b/src/cmd/asm/internal/asm/testdata/amd64error.s
index da325c9d98..d5499aa13e 100644
--- a/src/cmd/asm/internal/asm/testdata/amd64error.s
+++ b/src/cmd/asm/internal/asm/testdata/amd64error.s
@@ -45,4 +45,8 @@ TEXT errors(SB),$0
ADDQ 433954697820(AX), AX // ERROR "offset too large"
ADDL 433954697820(AX), AX // ERROR "offset too large"
ADDW 433954697820(AX), AX // ERROR "offset too large"
+ // Pseudo-registers should not be used as scaled index.
+ CALL (AX)(PC*1) // ERROR "invalid instruction"
+ CALL (AX)(SB*1) // ERROR "invalid instruction"
+ CALL (AX)(FP*1) // ERROR "invalid instruction"
RET