Commit 0aede739 authored by Cherry Zhang's avatar Cherry Zhang

cmd/internal/obj/arm: don't split instructions on NaCl

We insert guard instructions after each "dangerous" instruction
to make NaCl's validator happy. This happens before asmout. If
in asmout an instruction is split to two dangerous instructions,
but only one guard instruction is inserted, the validation fails.
Therefore don't split instructions on NaCl.

Fixes #20595.

Change-Id: Ie34f209bc7d907d6d16ecef6721f88420981ac01
Reviewed-on: https://go-review.googlesource.com/45021
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarBrad Fitzpatrick <bradfitz@golang.org>
parent f939407f
...@@ -1262,12 +1262,16 @@ func (c *ctxt5) aclass(a *obj.Addr) int { ...@@ -1262,12 +1262,16 @@ func (c *ctxt5) aclass(a *obj.Addr) int {
if uint32(c.instoffset) <= 0xffff && objabi.GOARM == 7 { if uint32(c.instoffset) <= 0xffff && objabi.GOARM == 7 {
return C_SCON return C_SCON
} }
if c.ctxt.Headtype != objabi.Hnacl {
// Don't split instructions on NaCl. The validator is not
// happy with it. See Issue 20595.
if x, y := immrot2a(uint32(c.instoffset)); x != 0 && y != 0 { if x, y := immrot2a(uint32(c.instoffset)); x != 0 && y != 0 {
return C_RCON2A return C_RCON2A
} }
if y, x := immrot2s(uint32(c.instoffset)); x != 0 && y != 0 { if y, x := immrot2s(uint32(c.instoffset)); x != 0 && y != 0 {
return C_RCON2S return C_RCON2S
} }
}
return C_LCON return C_LCON
case obj.NAME_EXTERN, case obj.NAME_EXTERN,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment