public inbox for binutils@sourceware.org
 help / color / mirror / Atom feed
From: "James Greenhalgh" <james.greenhalgh@arm.com>
To: <binutils@sourceware.org>
Subject: [Patch ARM Gas] - strexh/strexb warn for bad addressing modes.
Date: Fri, 22 Jul 2011 20:16:00 -0000	[thread overview]
Message-ID: <000601cc4861$5df11510$19d33f30$@greenhalgh@arm.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 821 bytes --]

Hi,

This patch fixes an issue with strex[b/h] in thumb mode.

strex[b/h] do not support an addressing mode with writeback.
This fault was caught correctly in ARM mode but was undiagnosed
under thumb.

Instructions of the form:
STREXH r0, r1, [r2, #+0x00]!
will now produce a "BAD_ADDR_MODE" error. This matches their
behaviour under ARM.

Tested using make check without regression.

James Greenhalgh

gas/

2011-07-22  James Greenhalgh  <james.greenhalgh@arm.com>

	* config/tc-arm.c (do_t_strexbh): New.
	(insns): Update accordingly.

gas/testsuite/

2011-07-22  James Greenhalgh  <james.greenhalgh@arm.com>

	* gas/arm/strex-bad-t.d: New testcase.
	* gas/arm/strex-bad-t.s: Likewise.
	* gas/arm/strex-bad-t.l: Likewise.
	* gas/arm/strex-t.s: Likewise.
	* gas/arm/strex-t.d: Likewise.

[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: 0001-Patch-ARM-Gas-strexh-strexb-warn-for-bad-addressing-.patch --]
[-- Type: text/x-patch;  name=0001-Patch-ARM-Gas-strexh-strexb-warn-for-bad-addressing-.patch, Size: 5313 bytes --]

diff --git gas/config/tc-arm.c gas/config/tc-arm.c
index 1592322..800a6ff 100644
--- gas/config/tc-arm.c
+++ gas/config/tc-arm.c
@@ -8484,6 +8484,21 @@ do_strex (void)
 }
 
 static void
+do_t_strexbh (void)
+{
+  constraint (!inst.operands[2].isreg || !inst.operands[2].preind
+	      || inst.operands[2].postind || inst.operands[2].writeback
+	      || inst.operands[2].immisreg || inst.operands[2].shifted
+	      || inst.operands[2].negative,
+	      BAD_ADDR_MODE);
+
+  constraint (inst.operands[0].reg == inst.operands[1].reg
+	      || inst.operands[0].reg == inst.operands[2].reg, BAD_OVERLAP);
+
+  do_rm_rd_rn ();
+}
+
+static void
 do_strexd (void)
 {
   constraint (inst.operands[1].reg % 2 != 0,
@@ -17499,9 +17514,9 @@ static const struct asm_opcode insns[] =
  TCE("ldrexh",	1f00f9f, e8d00f5f, 2, (RRnpc_npcsp, RRnpcb),
      rd_rn,  rd_rn),
  TCE("strexb",	1c00f90, e8c00f40, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
-     strex, rm_rd_rn),
+     strex, t_strexbh),
  TCE("strexh",	1e00f90, e8c00f50, 3, (RRnpc_npcsp, RRnpc_npcsp, ADDR),
-     strex, rm_rd_rn), 
+     strex, t_strexbh),
  TUF("clrex",	57ff01f, f3bf8f2f, 0, (),			      noargs, noargs),
 
 #undef  ARM_VARIANT
diff --git gas/testsuite/gas/arm/strex-bad-t.d gas/testsuite/gas/arm/strex-bad-t.d
new file mode 100644
index 0000000..f5ec4c5
--- /dev/null
+++ gas/testsuite/gas/arm/strex-bad-t.d
@@ -0,0 +1,3 @@
+# name: Bad addressing modes STREXH/STREXB. - THUMB
+# error-output: strex-bad-t.l
+
diff --git gas/testsuite/gas/arm/strex-bad-t.l gas/testsuite/gas/arm/strex-bad-t.l
new file mode 100644
index 0000000..a490096
--- /dev/null
+++ gas/testsuite/gas/arm/strex-bad-t.l
@@ -0,0 +1,24 @@
+[^:]*: Assembler messages:
+[^:]*:7: Error: r15 not allowed here -- `strexh r0,r1,#0x04'
+[^:]*:8: Error: instruction does not accept this addressing mode -- `strexh r0,r1,\[r2\],#0x04'
+[^:]*:9: Error: instruction does not accept this addressing mode -- `strexh r0,r1,\[r2,#\+0x00\]!'
+[^:]*:10: Error: instruction does not accept this addressing mode -- `strexh r0,r1,\[r2,r3\]'
+[^:]*:11: Error: registers may not be the same -- `strexh r0,r0,\[r1]'
+[^:]*:12: Error: instruction does not accept this addressing mode -- `strexh r0,r1,\[r2,#-0x04\]'
+[^:]*:13: Error: r15 not allowed here -- `strexh r0,r1,\[r15\]'
+[^:]*:14: Error: r13 not allowed here -- `strexh r0,r13,\[r1\]'
+[^:]*:15: Error: r15 not allowed here -- `strexh r0,r15,\[r1\]'
+[^:]*:16: Error: r13 not allowed here -- `strexh r13,r0,\[r1\]'
+[^:]*:17: Error: r15 not allowed here -- `strexh r15,r0,\[r1\]'
+[^:]*:21: Error: r15 not allowed here -- `strexb r0,r1,#0x04'
+[^:]*:22: Error: instruction does not accept this addressing mode -- `strexb r0,r1,\[r2\],#0x04'
+[^:]*:23: Error: instruction does not accept this addressing mode -- `strexb r0,r1,\[r2,#\+0x00\]!'
+[^:]*:24: Error: instruction does not accept this addressing mode -- `strexb r0,r1,\[r2,r3\]'
+[^:]*:25: Error: registers may not be the same -- `strexb r0,r0,\[r1]'
+[^:]*:26: Error: instruction does not accept this addressing mode -- `strexb r0,r1,\[r2,#-0x04\]'
+[^:]*:27: Error: r15 not allowed here -- `strexb r0,r1,\[r15\]'
+[^:]*:28: Error: r13 not allowed here -- `strexb r0,r13,\[r1\]'
+[^:]*:29: Error: r15 not allowed here -- `strexb r0,r15,\[r1\]'
+[^:]*:30: Error: r13 not allowed here -- `strexb r13,r0,\[r1\]'
+[^:]*:31: Error: r15 not allowed here -- `strexb r15,r0,\[r1\]'
+
diff --git gas/testsuite/gas/arm/strex-bad-t.s gas/testsuite/gas/arm/strex-bad-t.s
new file mode 100644
index 0000000..1466ca5
--- /dev/null
+++ gas/testsuite/gas/arm/strex-bad-t.s
@@ -0,0 +1,32 @@
+.syntax unified
+
+.thumb
+
+@ strexh
+
+strexh r0, r1, #0x04
+strexh r0, r1, [r2], #0x04
+strexh r0, r1, [r2, #+0x00]!
+strexh r0, r1, [r2, r3]
+strexh r0, r0, [r1]
+strexh r0, r1, [r2, #-0x04]
+strexh r0, r1, [r15]
+strexh r0, r13, [r1]
+strexh r0, r15, [r1]
+strexh r13, r0, [r1]
+strexh r15, r0, [r1]
+
+@ strexb
+
+strexb r0, r1, #0x04
+strexb r0, r1, [r2], #0x04
+strexb r0, r1, [r2, #+0x00]!
+strexb r0, r1, [r2, r3]
+strexb r0, r0, [r1]
+strexb r0, r1, [r2, #-0x04]
+strexb r0, r1, [r15]
+strexb r0, r13, [r1]
+strexb r0, r15, [r1]
+strexb r13, r0, [r1]
+strexb r15, r0, [r1]
+
diff --git gas/testsuite/gas/arm/strex-t.d gas/testsuite/gas/arm/strex-t.d
new file mode 100644
index 0000000..04b5d0b
--- /dev/null
+++ gas/testsuite/gas/arm/strex-t.d
@@ -0,0 +1,13 @@
+# name: STREXH/STREXB. - Thumb
+#objdump: -dr --prefix-address --show-raw-insn
+
+.*: +file format .*arm.*
+
+Disassembly of section \.text:
+0+00 <[^>]+> e8c2 1f50 	strexh	r0, r1, \[r2\]
+0+04 <[^>]+> e8c2 1f50 	strexh	r0, r1, \[r2\]
+0+08 <[^>]+> e8cd 1f50 	strexh	r0, r1, \[sp\]
+0+0c <[^>]+> e8c2 1f40 	strexb	r0, r1, \[r2\]
+0+10 <[^>]+> e8c2 1f40 	strexb	r0, r1, \[r2\]
+0+14 <[^>]+> e8cd 1f40 	strexb	r0, r1, \[sp\]
+
diff --git gas/testsuite/gas/arm/strex-t.s gas/testsuite/gas/arm/strex-t.s
new file mode 100644
index 0000000..d8cddfc
--- /dev/null
+++ gas/testsuite/gas/arm/strex-t.s
@@ -0,0 +1,10 @@
+.syntax unified
+.thumb
+	strexh r0, r1, [r2]
+	strexh r0, r1, [r2, #+0x00]
+	strexh r0, r1, [r13]
+
+	strexb r0, r1, [r2]
+	strexb r0, r1, [r2, #+0x00]
+	strexb r0, r1, [r13]
+

             reply	other threads:[~2011-07-22 11:21 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-07-22 20:16 James Greenhalgh [this message]
2011-07-29 15:58 ` Nick Clifton
2011-07-29 16:16   ` James Greenhalgh
2011-08-03 11:37     ` Nick Clifton
2011-09-20 23:14     ` hazelnusse
2011-09-22 12:59       ` James Greenhalgh
2011-10-13  8:18         ` Nick Clifton
     [not found]       ` <4e7b3128.41c8e30a.6565.ffff9e55SMTPIN_ADDED@mx.google.com>
2011-09-22 16:07         ` Luke

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='000601cc4861$5df11510$19d33f30$@greenhalgh@arm.com' \
    --to=james.greenhalgh@arm.com \
    --cc=binutils@sourceware.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).