This is the mail archive of the binutils@sources.redhat.com 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]

Re: [PATCH] ia64: certain symbol names were unusable


>>> James E Wilson <wilson@specifixinc.com> 11.02.05 01:33:29 >>>
>On Tue, 2005-02-08 at 03:16, Jan Beulich wrote:
>> +      if (name[1] == 'n' && ISDIGIT (name[idx = 2]))
>> +	dr = &md.in;
>
>Please don't hide assignments like this.  It makes the code hard to
>read.  This should be name[2] with "idx = 2;" on a separate line.
>...
>> +  if (dr && (name[idx] != '0' || name[idx + 1] == '\0'))
>
>This one puzzled me for a while.  There should be a comment
explaining
>what it is for, to ignore any number with a leading zero, other than
>zero itself.

Update patch below/attached (the original one also didn't apply anymore
after one of the others was committed).

Jan

gas/
2005-02-11  Jan Beulich  <jbeulich@novell.com>

	* config/tc-ia64.c (ia64_parse_name): Don't advance 'name' when
	parsing inN, locN, outN. Set 'idx' to offset register number
starts
	at. Don't handle numbers with leading zeroes or beyond 95.
Remove
	pointless cast.

gas/testsuite/
2005-02-11  Jan Beulich  <jbeulich@novell.com>

	* gas/ia64/nostkreg.[ds]: New.
	* gas/ia64/ia64.exp: Run new test.

---
/home/jbeulich/src/binutils/mainline/2005-02-11/gas/config/tc-ia64.c	2005-02-11
11:09:20.000000000 +0100
+++ 2005-02-11/gas/config/tc-ia64.c	2005-02-11 11:29:01.872465160
+0100
@@ -7482,7 +7482,6 @@ ia64_parse_name (name, e, nextcharP)
 {
   struct const_desc *cdesc;
   struct dynreg *dr = 0;
-  unsigned int regnum;
   unsigned int idx;
   struct symbol *sym;
   char *end;
@@ -7588,13 +7587,14 @@ ia64_parse_name (name, e, nextcharP)
     }
 
   /* check for inN, locN, or outN:  */
+  idx = 0;
   switch (name[0])
     {
     case 'i':
       if (name[1] == 'n' && ISDIGIT (name[2]))
 	{
 	  dr = &md.in;
-	  name += 2;
+	  idx = 2;
 	}
       break;
 
@@ -7602,7 +7602,7 @@ ia64_parse_name (name, e, nextcharP)
       if (name[1] == 'o' && name[2] == 'c' && ISDIGIT (name[3]))
 	{
 	  dr = &md.loc;
-	  name += 3;
+	  idx = 3;
 	}
       break;
 
@@ -7610,7 +7610,7 @@ ia64_parse_name (name, e, nextcharP)
       if (name[1] == 'u' && name[2] == 't' && ISDIGIT (name[3]))
 	{
 	  dr = &md.out;
-	  name += 3;
+	  idx = 3;
 	}
       break;
 
@@ -7618,13 +7618,16 @@ ia64_parse_name (name, e, nextcharP)
       break;
     }
 
-  if (dr)
+  /* Ignore register numbers with leading zeroes, except zero itself. 
*/
+  if (dr && (name[idx] != '0' || name[idx + 1] == '\0'))
     {
+      unsigned long regnum;
+
       /* The name is inN, locN, or outN; parse the register number. 
*/
-      regnum = strtoul (name, &end, 10);
-      if (end > name && *end == '\0')
+      regnum = strtoul (name + idx, &end, 10);
+      if (end > name + idx && *end == '\0' && regnum < 96)
 	{
-	  if ((unsigned) regnum >= dr->num_regs)
+	  if (regnum >= dr->num_regs)
 	    {
 	      if (!dr->num_regs)
 		as_bad ("No current frame");
---
/home/jbeulich/src/binutils/mainline/2005-02-11/gas/testsuite/gas/ia64/ia64.exp	2005-02-02
08:33:18.000000000 +0100
+++ 2005-02-11/gas/testsuite/gas/ia64/ia64.exp	2005-02-08
11:43:19.000000000 +0100
@@ -44,7 +44,8 @@ if [istarget "ia64-*"] then {
     run_dump_test "ldxmov-1"
     run_list_test "ldxmov-2" ""
     run_dump_test "ltoff22x-1"
-    
+
+    run_dump_test "nostkreg"
     run_list_test "invalid-ar" ""
 
     run_dump_test "dependency-1"
---
/home/jbeulich/src/binutils/mainline/2005-02-11/gas/testsuite/gas/ia64/nostkreg.d	1970-01-01
01:00:00.000000000 +0100
+++ 2005-02-11/gas/testsuite/gas/ia64/nostkreg.d	2005-02-04
15:02:33.000000000 +0100
@@ -0,0 +1,16 @@
+#objdump: -dr
+#name: ia64 not stacked registers
+
+.*: +file format .*
+
+Disassembly of section \.text:
+
+0+000 <_start>:
+[[:space:]]*[[:xdigit:]]+:[[:space:][:xdigit:]]+\[M[IM]I\][[:space:]]+mov[[:space:]]+r5=0
+[[:space:]]+0:[[:space:]]+IMM22[[:space:]]+in00
+[[:space:]]+1:[[:space:]]+IMM22[[:space:]]+loc96
+[[:space:]]*[[:xdigit:]]+:[[:space:][:xdigit:]]+mov[[:space:]]+r6=0
+[[:space:]]*[[:xdigit:]]+:[[:space:][:xdigit:]]+mov[[:space:]]+r7=r32
+[[:space:]]*[[:xdigit:]]+:[[:space:][:xdigit:]]+\[M[IM]B\][[:space:]]+mov[[:space:]]+r8=r34
+[[:space:]]*[[:xdigit:]]+:[[:space:][:xdigit:]]+mov[[:space:]]+r9=r36
+[[:space:]]*[[:xdigit:]]+:[[:space:][:xdigit:]]+br\.ret\.sptk\.few[[:space:]]+(b0|rp);;
---
/home/jbeulich/src/binutils/mainline/2005-02-11/gas/testsuite/gas/ia64/nostkreg.s	1970-01-01
01:00:00.000000000 +0100
+++ 2005-02-11/gas/testsuite/gas/ia64/nostkreg.s	2005-02-04
14:47:29.000000000 +0100
@@ -0,0 +1,9 @@
+_start:
+	mov		r5 = in00
+	mov		r6 = loc96
+	.regstk 2, 6, 2, 8
+	.rotr in0I[2], loc1L[2], out2O[2]
+	mov		r7 = in0I[0]
+	mov		r8 = loc1L[0]
+	mov		r9 = out2O[0]
+	br.ret.sptk	rp

Attachment: binutils-mainline-ia64-in-loc-out.patch
Description: Text document


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