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]

[PATCH] ia64: certain symbol names were unusable


Variables starting with 'in', 'loc', or 'out' and continuing with
decimal
numbers not fitting the 0-95 range (used for the stacked register
aliases) or
starting with zeroes were considered reserved, while they really
aren't.
Rotating registers allocated through .rotX could not start with 'in',
'loc',
or 'out' followed by at least one digit (and then anything) at all.

Built and tested on ia64-unknown-linux-gnu.

Jan

gas/
2005-02-08  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-08  Jan Beulich  <jbeulich@novell.com>

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

---
/home/jbeulich/src/binutils/mainline/2005-02-08/gas/config/tc-ia64.c	2005-02-02
08:33:18.000000000 +0100
+++ 2005-02-08/gas/config/tc-ia64.c	2005-02-08 12:05:12.000000000
+0100
@@ -7586,7 +7586,7 @@ ia64_parse_name (name, e)
 {
   struct const_desc *cdesc;
   struct dynreg *dr = 0;
-  unsigned int regnum;
+  unsigned int idx;
   struct symbol *sym;
   char *end;
 
@@ -7608,43 +7608,37 @@ ia64_parse_name (name, e)
     }
 
   /* 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;
-	}
+      if (name[1] == 'n' && ISDIGIT (name[idx = 2]))
+	dr = &md.in;
       break;
 
     case 'l':
-      if (name[1] == 'o' && name[2] == 'c' && ISDIGIT (name[3]))
-	{
-	  dr = &md.loc;
-	  name += 3;
-	}
+      if (name[1] == 'o' && name[2] == 'c' && ISDIGIT (name[idx =
3]))
+	dr = &md.loc;
       break;
 
     case 'o':
-      if (name[1] == 'u' && name[2] == 't' && ISDIGIT (name[3]))
-	{
-	  dr = &md.out;
-	  name += 3;
-	}
+      if (name[1] == 'u' && name[2] == 't' && ISDIGIT (name[idx =
3]))
+	dr = &md.out;
       break;
 
     default:
       break;
     }
 
-  if (dr)
+  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-08/gas/testsuite/gas/ia64/ia64.exp	2005-02-02
08:33:18.000000000 +0100
+++ 2005-02-08/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-08/gas/testsuite/gas/ia64/nostkreg.d	1970-01-01
01:00:00.000000000 +0100
+++ 2005-02-08/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-08/gas/testsuite/gas/ia64/nostkreg.s	1970-01-01
01:00:00.000000000 +0100
+++ 2005-02-08/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]