This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

z8k assembler fix


Hi,

the z8k assembler didn't like label names starting with a valid
register name.

I've installed the included patch.

regards,
chris



gas/ChangeLog:

2006-12-08  Christian Groessler  <chris@groessler.org>

        * config/tc-z8k.c (whatreg): Add comment describing function.
        Return NULL if symbol name characters follow the register number.
        (parse_reg): Use NULL instead of 0 for pointer values.  Stop
        processing if whatreg returned NULL.



gas/testsuite/ChangeLog:

2006-12-08  Christian Groessler  <chris@groessler.org>

        * gas/z8k/reglabel.d: New test.
        * gas/z8k/reglabel.s: New test.
        * gas/z8k/z8k.exp: Run new test.





Index: config/tc-z8k.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-z8k.c,v
retrieving revision 1.41
diff -u -p -r1.41 tc-z8k.c
--- config/tc-z8k.c	7 Jun 2006 11:27:58 -0000	1.41
+++ config/tc-z8k.c	8 Dec 2006 21:50:38 -0000
@@ -196,19 +196,34 @@ static int the_ctrl;
 static int the_flags;
 static int the_interrupt;
 
+/* Determine register number.  src points to the ascii number
+   (after "rl", "rh", "r", "rr", or "rq").  If a character
+   outside the set of {0,',',')','('} follows the number,
+   return NULL to indicate that it's not a valid register
+   number.  */
+
 static char *
 whatreg (unsigned int *reg, char *src)
 {
+  unsigned int new_reg;
+
+  /* src[0] is already known to be a digit.  */
   if (ISDIGIT (src[1]))
     {
-      *reg = (src[0] - '0') * 10 + src[1] - '0';
-      return src + 2;
+      new_reg = (src[0] - '0') * 10 + src[1] - '0';
+      src += 2;
     }
   else
     {
-      *reg = (src[0] - '0');
-      return src + 1;
+      new_reg = (src[0] - '0');
+      src += 1;
     }
+
+  if (src[0] != 0 && src[0] != ',' && src[0] != '(' && src[0] != ')')
+    return NULL;
+
+  *reg = new_reg;
+  return src;
 }
 
 /* Parse operands
@@ -231,7 +246,7 @@ whatreg (unsigned int *reg, char *src)
 static char *
 parse_reg (char *src, int *mode, unsigned int *reg)
 {
-  char *res = 0;
+  char *res = NULL;
   char regno;
 
   /* Check for stack pointer "sp" alias.  */
@@ -257,9 +272,11 @@ parse_reg (char *src, int *mode, unsigne
       if (src[1] == 'r' || src[1] == 'R')
 	{
 	  if (src[2] < '0' || src[2] > '9')
-	    return res;	 /* Assume no register name but a label starting with 'rr'.  */
+	    return NULL;	/* Assume no register name but a label starting with 'rr'.  */
 	  *mode = CLASS_REG_LONG;
 	  res = whatreg (reg, src + 2);
+	  if (res == NULL)
+	    return NULL;	/* Not a valid register name.  */
 	  regno = *reg;
 	  if (regno > 14)
 	    as_bad (_("register rr%d out of range"), regno);
@@ -269,9 +286,11 @@ parse_reg (char *src, int *mode, unsigne
       else if (src[1] == 'h' || src[1] == 'H')
 	{
 	  if (src[2] < '0' || src[2] > '9')
-	    return res;	 /* Assume no register name but a label starting with 'rh'.  */
+	    return NULL;	/* Assume no register name but a label starting with 'rh'.  */
 	  *mode = CLASS_REG_BYTE;
 	  res = whatreg (reg, src + 2);
+	  if (res == NULL)
+	    return NULL;	/* Not a valid register name.  */
 	  regno = *reg;
 	  if (regno > 7)
 	    as_bad (_("register rh%d out of range"), regno);
@@ -279,9 +298,11 @@ parse_reg (char *src, int *mode, unsigne
       else if (src[1] == 'l' || src[1] == 'L')
 	{
 	  if (src[2] < '0' || src[2] > '9')
-	    return res;	 /* Assume no register name but a label starting with 'rl'.  */
+	    return NULL;	/* Assume no register name but a label starting with 'rl'.  */
 	  *mode = CLASS_REG_BYTE;
 	  res = whatreg (reg, src + 2);
+	  if (res == NULL)
+	    return NULL;	/* Not a valid register name.  */
 	  regno = *reg;
 	  if (regno > 7)
 	    as_bad (_("register rl%d out of range"), regno);
@@ -290,9 +311,11 @@ parse_reg (char *src, int *mode, unsigne
       else if (src[1] == 'q' || src[1] == 'Q')
 	{
 	  if (src[2] < '0' || src[2] > '9')
-	    return res;	 /* Assume no register name but a label starting with 'rq'.  */
+	    return NULL;	/* Assume no register name but a label starting with 'rq'.  */
 	  *mode = CLASS_REG_QUAD;
 	  res = whatreg (reg, src + 2);
+	  if (res == NULL)
+	    return NULL;	/* Not a valid register name.  */
 	  regno = *reg;
 	  if (regno > 12)
 	    as_bad (_("register rq%d out of range"), regno);
@@ -302,9 +325,11 @@ parse_reg (char *src, int *mode, unsigne
       else
 	{
 	  if (src[1] < '0' || src[1] > '9')
-	    return res;	 /* Assume no register name but a label starting with 'r'.  */
+	    return NULL;	/* Assume no register name but a label starting with 'r'.  */
 	  *mode = CLASS_REG_WORD;
 	  res = whatreg (reg, src + 1);
+	  if (res == NULL)
+	    return NULL;	/* Not a valid register name.  */
 	  regno = *reg;
 	  if (regno > 15)
 	    as_bad (_("register r%d out of range"), regno);
Index: testsuite/gas/z8k/reglabel.d
===================================================================
RCS file: testsuite/gas/z8k/reglabel.d
diff -N testsuite/gas/z8k/reglabel.d
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/gas/z8k/reglabel.d	8 Dec 2006 21:50:38 -0000
@@ -0,0 +1,268 @@
+#as:
+#objdump: -d
+#name: reglabel
+
+.*: +file format coff-z8k
+
+Disassembly of section \.text:
+
+00000000 <sp_label>:
+   0:	7600 0000      	lda	r0,0x0
+
+00000004 <r0_label>:
+   4:	7600 0004      	lda	r0,0x4
+
+00000008 <r1_label>:
+   8:	7600 0008      	lda	r0,0x8
+
+0000000c <r2_label>:
+   c:	7600 000c      	lda	r0,0xc
+
+00000010 <r3_label>:
+  10:	7600 0010      	lda	r0,0x10
+
+00000014 <r4_label>:
+  14:	7600 0014      	lda	r0,0x14
+
+00000018 <r5_label>:
+  18:	7600 0018      	lda	r0,0x18
+
+0000001c <r6_label>:
+  1c:	7600 001c      	lda	r0,0x1c
+
+00000020 <r7_label>:
+  20:	7600 0020      	lda	r0,0x20
+
+00000024 <r8_label>:
+  24:	7600 0024      	lda	r0,0x24
+
+00000028 <r9_label>:
+  28:	7600 0028      	lda	r0,0x28
+
+0000002c <r10_label>:
+  2c:	7600 002c      	lda	r0,0x2c
+
+00000030 <r11_label>:
+  30:	7600 0030      	lda	r0,0x30
+
+00000034 <r12_label>:
+  34:	7600 0034      	lda	r0,0x34
+
+00000038 <r13_label>:
+  38:	7600 0038      	lda	r0,0x38
+
+0000003c <r14_label>:
+  3c:	7600 003c      	lda	r0,0x3c
+
+00000040 <r15_label>:
+  40:	7600 0040      	lda	r0,0x40
+
+00000044 <r16_label>:
+  44:	7600 0044      	lda	r0,0x44
+
+00000048 <rr0_label>:
+  48:	7600 0048      	lda	r0,0x48
+
+0000004c <rr1_label>:
+  4c:	7600 004c      	lda	r0,0x4c
+
+00000050 <rr2_label>:
+  50:	7600 0050      	lda	r0,0x50
+
+00000054 <rr3_label>:
+  54:	7600 0054      	lda	r0,0x54
+
+00000058 <rr4_label>:
+  58:	7600 0058      	lda	r0,0x58
+
+0000005c <rr5_label>:
+  5c:	7600 005c      	lda	r0,0x5c
+
+00000060 <rr6_label>:
+  60:	7600 0060      	lda	r0,0x60
+
+00000064 <rr7_label>:
+  64:	7600 0064      	lda	r0,0x64
+
+00000068 <rr8_label>:
+  68:	7600 0068      	lda	r0,0x68
+
+0000006c <rr9_label>:
+  6c:	7600 006c      	lda	r0,0x6c
+
+00000070 <rr10_label>:
+  70:	7600 0070      	lda	r0,0x70
+
+00000074 <rr11_label>:
+  74:	7600 0074      	lda	r0,0x74
+
+00000078 <rr12_label>:
+  78:	7600 0078      	lda	r0,0x78
+
+0000007c <rr13_label>:
+  7c:	7600 007c      	lda	r0,0x7c
+
+00000080 <rr14_label>:
+  80:	7600 0080      	lda	r0,0x80
+
+00000084 <rr15_label>:
+  84:	7600 0084      	lda	r0,0x84
+
+00000088 <rr16_label>:
+  88:	7600 0088      	lda	r0,0x88
+
+0000008c <rq0_label>:
+  8c:	7600 008c      	lda	r0,0x8c
+
+00000090 <rq1_label>:
+  90:	7600 0090      	lda	r0,0x90
+
+00000094 <rq2_label>:
+  94:	7600 0094      	lda	r0,0x94
+
+00000098 <rq3_label>:
+  98:	7600 0098      	lda	r0,0x98
+
+0000009c <rq4_label>:
+  9c:	7600 009c      	lda	r0,0x9c
+
+000000a0 <rq5_label>:
+  a0:	7600 00a0      	lda	r0,0xa0
+
+000000a4 <rq6_label>:
+  a4:	7600 00a4      	lda	r0,0xa4
+
+000000a8 <rq7_label>:
+  a8:	7600 00a8      	lda	r0,0xa8
+
+000000ac <rq8_label>:
+  ac:	7600 00ac      	lda	r0,0xac
+
+000000b0 <rq9_label>:
+  b0:	7600 00b0      	lda	r0,0xb0
+
+000000b4 <rq10_label>:
+  b4:	7600 00b4      	lda	r0,0xb4
+
+000000b8 <rq11_label>:
+  b8:	7600 00b8      	lda	r0,0xb8
+
+000000bc <rq12_label>:
+  bc:	7600 00bc      	lda	r0,0xbc
+
+000000c0 <rq13_label>:
+  c0:	7600 00c0      	lda	r0,0xc0
+
+000000c4 <rq14_label>:
+  c4:	7600 00c4      	lda	r0,0xc4
+
+000000c8 <rq15_label>:
+  c8:	7600 00c8      	lda	r0,0xc8
+
+000000cc <rq16_label>:
+  cc:	7600 00cc      	lda	r0,0xcc
+
+000000d0 <rh0_label>:
+  d0:	7600 00d0      	lda	r0,0xd0
+
+000000d4 <rh1_label>:
+  d4:	7600 00d4      	lda	r0,0xd4
+
+000000d8 <rh2_label>:
+  d8:	7600 00d8      	lda	r0,0xd8
+
+000000dc <rh3_label>:
+  dc:	7600 00dc      	lda	r0,0xdc
+
+000000e0 <rh4_label>:
+  e0:	7600 00e0      	lda	r0,0xe0
+
+000000e4 <rh5_label>:
+  e4:	7600 00e4      	lda	r0,0xe4
+
+000000e8 <rh6_label>:
+  e8:	7600 00e8      	lda	r0,0xe8
+
+000000ec <rh7_label>:
+  ec:	7600 00ec      	lda	r0,0xec
+
+000000f0 <rh8_label>:
+  f0:	7600 00f0      	lda	r0,0xf0
+
+000000f4 <rh9_label>:
+  f4:	7600 00f4      	lda	r0,0xf4
+
+000000f8 <rh10_label>:
+  f8:	7600 00f8      	lda	r0,0xf8
+
+000000fc <rh11_label>:
+  fc:	7600 00fc      	lda	r0,0xfc
+
+00000100 <rh12_label>:
+ 100:	7600 0100      	lda	r0,0x100
+
+00000104 <rh13_label>:
+ 104:	7600 0104      	lda	r0,0x104
+
+00000108 <rh14_label>:
+ 108:	7600 0108      	lda	r0,0x108
+
+0000010c <rh15_label>:
+ 10c:	7600 010c      	lda	r0,0x10c
+
+00000110 <rh16_label>:
+ 110:	7600 0110      	lda	r0,0x110
+
+00000114 <rl0_label>:
+ 114:	7600 0114      	lda	r0,0x114
+
+00000118 <rl1_label>:
+ 118:	7600 0118      	lda	r0,0x118
+
+0000011c <rl2_label>:
+ 11c:	7600 011c      	lda	r0,0x11c
+
+00000120 <rl3_label>:
+ 120:	7600 0120      	lda	r0,0x120
+
+00000124 <rl4_label>:
+ 124:	7600 0124      	lda	r0,0x124
+
+00000128 <rl5_label>:
+ 128:	7600 0128      	lda	r0,0x128
+
+0000012c <rl6_label>:
+ 12c:	7600 012c      	lda	r0,0x12c
+
+00000130 <rl7_label>:
+ 130:	7600 0130      	lda	r0,0x130
+
+00000134 <rl8_label>:
+ 134:	7600 0134      	lda	r0,0x134
+
+00000138 <rl9_label>:
+ 138:	7600 0138      	lda	r0,0x138
+
+0000013c <rl10_label>:
+ 13c:	7600 013c      	lda	r0,0x13c
+
+00000140 <rl11_label>:
+ 140:	7600 0140      	lda	r0,0x140
+
+00000144 <rl12_label>:
+ 144:	7600 0144      	lda	r0,0x144
+
+00000148 <rl13_label>:
+ 148:	7600 0148      	lda	r0,0x148
+
+0000014c <rl14_label>:
+ 14c:	7600 014c      	lda	r0,0x14c
+
+00000150 <rl15_label>:
+ 150:	7600 0150      	lda	r0,0x150
+
+00000154 <rl16_label>:
+ 154:	7600 0154      	lda	r0,0x154
+
+00000158 <r00_label>:
+ 158:	7600 0158      	lda	r0,0x158
Index: testsuite/gas/z8k/reglabel.s
===================================================================
RCS file: testsuite/gas/z8k/reglabel.s
diff -N testsuite/gas/z8k/reglabel.s
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/gas/z8k/reglabel.s	8 Dec 2006 21:50:38 -0000
@@ -0,0 +1,99 @@
+! labels starting with a valid register name
+
+.text
+
+sp_label:	lda	r0,sp_label
+
+r0_label:	lda	r0,r0_label
+r1_label:	lda	r0,r1_label
+r2_label:	lda	r0,r2_label
+r3_label:	lda	r0,r3_label
+r4_label:	lda	r0,r4_label
+r5_label:	lda	r0,r5_label
+r6_label:	lda	r0,r6_label
+r7_label:	lda	r0,r7_label
+r8_label:	lda	r0,r8_label
+r9_label:	lda	r0,r9_label
+r10_label:	lda	r0,r10_label
+r11_label:	lda	r0,r11_label
+r12_label:	lda	r0,r12_label
+r13_label:	lda	r0,r13_label
+r14_label:	lda	r0,r14_label
+r15_label:	lda	r0,r15_label
+r16_label:	lda	r0,r16_label	! not a valid register name anyway
+
+rr0_label:	lda	r0,rr0_label
+rr1_label:	lda	r0,rr1_label	! not a valid register name anyway
+rr2_label:	lda	r0,rr2_label
+rr3_label:	lda	r0,rr3_label	! not a valid register name anyway
+rr4_label:	lda	r0,rr4_label
+rr5_label:	lda	r0,rr5_label	! not a valid register name anyway
+rr6_label:	lda	r0,rr6_label
+rr7_label:	lda	r0,rr7_label	! not a valid register name anyway
+rr8_label:	lda	r0,rr8_label
+rr9_label:	lda	r0,rr9_label	! not a valid register name anyway
+rr10_label:	lda	r0,rr10_label
+rr11_label:	lda	r0,rr11_label	! not a valid register name anyway
+rr12_label:	lda	r0,rr12_label
+rr13_label:	lda	r0,rr13_label	! not a valid register name anyway
+rr14_label:	lda	r0,rr14_label
+rr15_label:	lda	r0,rr15_label	! not a valid register name anyway
+rr16_label:	lda	r0,rr16_label	! not a valid register name anyway
+
+rq0_label:	lda	r0,rq0_label
+rq1_label:	lda	r0,rq1_label	! not a valid register name anyway
+rq2_label:	lda	r0,rq2_label	! not a valid register name anyway
+rq3_label:	lda	r0,rq3_label	! not a valid register name anyway
+rq4_label:	lda	r0,rq4_label
+rq5_label:	lda	r0,rq5_label	! not a valid register name anyway
+rq6_label:	lda	r0,rq6_label	! not a valid register name anyway
+rq7_label:	lda	r0,rq7_label	! not a valid register name anyway
+rq8_label:	lda	r0,rq8_label
+rq9_label:	lda	r0,rq9_label	! not a valid register name anyway
+rq10_label:	lda	r0,rq10_label	! not a valid register name anyway
+rq11_label:	lda	r0,rq11_label	! not a valid register name anyway
+rq12_label:	lda	r0,rq12_label
+rq13_label:	lda	r0,rq13_label	! not a valid register name anyway
+rq14_label:	lda	r0,rq14_label	! not a valid register name anyway
+rq15_label:	lda	r0,rq15_label	! not a valid register name anyway
+rq16_label:	lda	r0,rq16_label	! not a valid register name anyway
+
+
+rh0_label:	lda	r0,rh0_label
+rh1_label:	lda	r0,rh1_label
+rh2_label:	lda	r0,rh2_label
+rh3_label:	lda	r0,rh3_label
+rh4_label:	lda	r0,rh4_label
+rh5_label:	lda	r0,rh5_label
+rh6_label:	lda	r0,rh6_label
+rh7_label:	lda	r0,rh7_label
+rh8_label:	lda	r0,rh8_label	! not a valid register name anyway
+rh9_label:	lda	r0,rh9_label	! not a valid register name anyway
+rh10_label:	lda	r0,rh10_label	! not a valid register name anyway
+rh11_label:	lda	r0,rh11_label	! not a valid register name anyway
+rh12_label:	lda	r0,rh12_label	! not a valid register name anyway
+rh13_label:	lda	r0,rh13_label	! not a valid register name anyway
+rh14_label:	lda	r0,rh14_label	! not a valid register name anyway
+rh15_label:	lda	r0,rh15_label	! not a valid register name anyway
+rh16_label:	lda	r0,rh16_label	! not a valid register name anyway
+
+rl0_label:	lda	r0,rl0_label
+rl1_label:	lda	r0,rl1_label
+rl2_label:	lda	r0,rl2_label
+rl3_label:	lda	r0,rl3_label
+rl4_label:	lda	r0,rl4_label
+rl5_label:	lda	r0,rl5_label
+rl6_label:	lda	r0,rl6_label
+rl7_label:	lda	r0,rl7_label
+rl8_label:	lda	r0,rl8_label	! not a valid register name anyway
+rl9_label:	lda	r0,rl9_label	! not a valid register name anyway
+rl10_label:	lda	r0,rl10_label	! not a valid register name anyway
+rl11_label:	lda	r0,rl11_label	! not a valid register name anyway
+rl12_label:	lda	r0,rl12_label	! not a valid register name anyway
+rl13_label:	lda	r0,rl13_label	! not a valid register name anyway
+rl14_label:	lda	r0,rl14_label	! not a valid register name anyway
+rl15_label:	lda	r0,rl15_label	! not a valid register name anyway
+rl16_label:	lda	r0,rl16_label	! not a valid register name anyway
+
+r00_label:	lda	r0,r00_label	! not a valid register name anyway
+
Index: testsuite/gas/z8k/z8k.exp
===================================================================
RCS file: /cvs/src/src/gas/testsuite/gas/z8k/z8k.exp,v
retrieving revision 1.4
diff -u -p -r1.4 z8k.exp
--- testsuite/gas/z8k/z8k.exp	5 Dec 2003 23:37:02 -0000	1.4
+++ testsuite/gas/z8k/z8k.exp	8 Dec 2006 21:50:38 -0000
@@ -45,4 +45,8 @@ if [istarget z8k-*-*] then {
 # ctrl names test
 
      run_dump_test "ctrl-names"
+
+# labels starting with register names test
+
+     run_dump_test "reglabel"
 }


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]