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]

Re: [Patch] opcodes/z8k-opc.h regenerated


Alan Modra <amodra@bigpond.net.au> writes:

>  Incidentally, your patch doesn't work either, since "bits" doesn't
>  differ for the two "xorb rbd,rbs" patterns.

You are right, but looking closer there are a lot more problems.
AFAICS, the extra xorb entry actually serves no purpose, in the gas
table it is indistinguishable from the other one, and it is only
included because of the wrong loop end condition.  And the -t mode
crashes because it requires writable strings.

(Alternatively we could rip out all but the -a mode.)

Andreas.

2009-09-08  Andreas Schwab  <schwab@linux-m68k.org>

	* z8kgen.c (struct op): Replace unused flavor with id.
	(opt): Remove extra xorb entry.
	(func): Use id field as fallback.
	(sub): Return new string, caller changed.
	(internal): Allocate end marker.  Assign unique id before sorting.
	(gas): Likewise.  Fix loop end condition.
	* z8k-opc.h: Regenerate.

--- opcodes/z8kgen.c.~1.18.~	2009-09-07 16:06:24.000000000 +0200
+++ opcodes/z8kgen.c	2009-09-08 10:43:52.000000000 +0200
@@ -17,7 +17,7 @@
    Free Software Foundation, 51 Franklin Street - Fifth Floor, Boston,
    MA 02110-1301, USA.  */
 
-/* This program generates z8k-opc.h.  Compile with -fwritable-strings.  */
+/* This program generates z8k-opc.h.  */
 
 #include <stdio.h>
 #include "sysdep.h"
@@ -32,7 +32,8 @@ struct op
   char type;
   char *bits;
   char *name;
-  char *flavor;
+  /* Unique number for stable sorting.  */
+  int id;
 };
 
 #define iswhite(x) ((x) == ' ' || (x) == '\t')
@@ -547,7 +548,6 @@ static struct op opt[] =
   {"------", 7, 32, "1000 1100 dddd 0001", "ldctlb rbd,ctrl", 0},
   {"CZSVDH", 7, 32, "1000 1100 ssss 1001", "ldctlb ctrl,rbs", 0},
 
-  {"*", 4, 8, "1000 1000 ssss dddd", "xorb rbd,rbs", 0},
   {"*", 0, 0, 0, 0, 0}
 };
 
@@ -574,7 +574,7 @@ func (const void *p1, const void *p2)
   int ret = strcmp (a->name, b->name);
   if (ret != 0)
     return ret;
-  return p1 > p2 ? 1 : -1;
+  return a->id > b->id ? 1 : -1;
 }
 
 
@@ -826,9 +826,12 @@ chewname (char **name)
   return nargs;
 }
 
-static void
+static char *
 sub (char *x, char c)
 {
+  /* Create copy.  */
+  char *ret = xstrdup (x);
+  x = ret;
   while (*x)
     {
       if (x[0] == c && x[1] == c &&
@@ -839,6 +842,7 @@ sub (char *x, char c)
 	}
       x++;
     }
+  return ret;
 }
 
 
@@ -909,9 +913,14 @@ static void
 internal (void)
 {
   int c = count ();
-  struct op *new_op = xmalloc (sizeof (struct op) * c);
+  int id;
+  struct op *new_op = xmalloc (sizeof (struct op) * (c + 1));
   struct op *p = opt;
-  memcpy (new_op, p, c * sizeof (struct op));
+  memcpy (new_op, p, (c + 1) * sizeof (struct op));
+
+  /* Assign unique id.  */
+  for (id = 0; id < c; id++)
+    new_op[id].id = id;
 
   /* Sort all names in table alphabetically.  */
   qsort (new_op, c, sizeof (struct op), func);
@@ -937,15 +946,15 @@ internal (void)
 	  /* Skip the r and sub the string.  */
 	  s++;
 	  c = s[1];
-	  sub (p->bits, c);
+	  p->bits = sub (p->bits, c);
 	}
 	if (s[0] == '(' && s[3] == ')')
 	{
-	  sub (p->bits, s[2]);
+	  p->bits = sub (p->bits, s[2]);
 	}
 	if (s[0] == '(')
 	{
-	  sub (p->bits, s[-1]);
+	  p->bits = sub (p->bits, s[-1]);
 	}
 
 	s++;
@@ -962,12 +971,17 @@ static void
 gas (void)
 {
   int c = count ();
+  int id;
   struct op *p = opt;
   int idx = -1;
   char *oldname = "";
-  struct op *new_op = xmalloc (sizeof (struct op) * c);
+  struct op *new_op = xmalloc (sizeof (struct op) * (c + 1));
+
+  memcpy (new_op, p, (c + 1) * sizeof (struct op));
 
-  memcpy (new_op, p, c * sizeof (struct op));
+  /* Assign unique id.  */
+  for (id = 0; id < c; id++)
+    new_op[id].id = id;
 
   /* Sort all names in table alphabetically.  */
   qsort (new_op, c, sizeof (struct op), func);
@@ -1284,7 +1298,7 @@ gas (void)
   printf ("#ifdef DEFINE_TABLE\n");
   printf ("const opcode_entry_type z8k_table[] = {\n");
 
-  while (new_op->flags && new_op->flags[0])
+  while (new_op->flags && new_op->flags[0] != '*')
     {
       int nargs;
       int length;

-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."


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