[PATCH] S12Z: gas: Fix bug when a symbol name was the single letter 'c'.

John Darrington john@darrington.wattle.id.au
Tue Jan 15 18:48:00 GMT 2019


The assembler incorrectly recognised "c" as a register name, and
refused to allow it where it expected a symbol/label.

gas/
	* config/tc-s12z.c (lex_reg_name): Compare the length of the strings
	before the contents.
	* testsuite/gas/s12z/labels.d: New file.
	* testsuite/gas/s12z/labels.s: New file.
	* testsuite/gas/s12z/s12z.exp: Add them.
---
 gas/config/tc-s12z.c            |  5 +++--
 gas/testsuite/gas/s12z/labels.d | 18 ++++++++++++++++++
 gas/testsuite/gas/s12z/labels.s |  3 +++
 gas/testsuite/gas/s12z/s12z.exp |  1 +
 4 files changed, 25 insertions(+), 2 deletions(-)
 create mode 100644 gas/testsuite/gas/s12z/labels.d
 create mode 100644 gas/testsuite/gas/s12z/labels.s

diff --git a/gas/config/tc-s12z.c b/gas/config/tc-s12z.c
index 7d1ddf6643..800db4fe75 100644
--- a/gas/config/tc-s12z.c
+++ b/gas/config/tc-s12z.c
@@ -308,7 +308,7 @@ lex_reg_name (uint16_t which, int *reg)
       p++;
     }
 
-  int len = p - input_line_pointer;
+  size_t len = p - input_line_pointer;
 
   if (len <= 0)
     return 0;
@@ -318,7 +318,8 @@ lex_reg_name (uint16_t which, int *reg)
     {
       gas_assert (registers[i].name);
 
-      if (0 == strncasecmp (registers[i].name, input_line_pointer, len))
+      if (len == strlen (registers[i].name)
+	  && 0 == strncasecmp (registers[i].name, input_line_pointer, len))
 	{
 	  if ((0x1U << i) & which)
 	    {
diff --git a/gas/testsuite/gas/s12z/labels.d b/gas/testsuite/gas/s12z/labels.d
new file mode 100644
index 0000000000..d00e756e31
--- /dev/null
+++ b/gas/testsuite/gas/s12z/labels.d
@@ -0,0 +1,18 @@
+#objdump: -d -r
+#name:    check that certain symbol labels are correctly accepted.
+#source:  labels.s
+
+
+.*:     file format elf32-s12z
+
+
+Disassembly of section .text:
+
+00000000 <.text>:
+   0:	c4 fa 00 00 	st d0, 0
+   4:	00 
+			2: R_S12Z_OPR	c
+   5:	c4 bd       	st d0, d1
+   7:	c5 fa 00 00 	st d1, 0
+   b:	00 
+			9: R_S12Z_OPR	xavier
diff --git a/gas/testsuite/gas/s12z/labels.s b/gas/testsuite/gas/s12z/labels.s
new file mode 100644
index 0000000000..9326262135
--- /dev/null
+++ b/gas/testsuite/gas/s12z/labels.s
@@ -0,0 +1,3 @@
+	st d0, c 	       ; c is a valid label
+	st d0, d1		; Move D0 into the memory at address D1
+	st d1, xavier           ; This is a valid label
diff --git a/gas/testsuite/gas/s12z/s12z.exp b/gas/testsuite/gas/s12z/s12z.exp
index 03baf90bca..76d0931593 100644
--- a/gas/testsuite/gas/s12z/s12z.exp
+++ b/gas/testsuite/gas/s12z/s12z.exp
@@ -119,6 +119,7 @@ run_dump_test bit-manip-invalid
 run_dump_test opr-symbol
 run_dump_test brclr-symbols
 run_dump_test dbCC
+run_dump_test labels
 
 # Expression related tests
 run_dump_test opr-expr
-- 
2.11.0



More information about the Binutils mailing list