diff options
author | Andreas Schwab <schwab@linux-m68k.org> | 2009-09-08 09:47:52 +0000 |
---|---|---|
committer | Andreas Schwab <schwab@linux-m68k.org> | 2009-09-08 09:47:52 +0000 |
commit | 84c7196942dfedcaead5f5b93ac8bed25e5b035d (patch) | |
tree | 2c66a46e732a61a41eb9aa19fd06c4a07f936946 /opcodes/z8kgen.c | |
parent | bdc7fcfe59f1347e78f71ee13b557ff5df8ca5de (diff) | |
download | gdb-84c7196942dfedcaead5f5b93ac8bed25e5b035d.zip gdb-84c7196942dfedcaead5f5b93ac8bed25e5b035d.tar.gz gdb-84c7196942dfedcaead5f5b93ac8bed25e5b035d.tar.bz2 |
* 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.
Diffstat (limited to 'opcodes/z8kgen.c')
-rw-r--r-- | opcodes/z8kgen.c | 40 |
1 files changed, 27 insertions, 13 deletions
diff --git a/opcodes/z8kgen.c b/opcodes/z8kgen.c index 8d418f7..ecb56b7 100644 --- a/opcodes/z8kgen.c +++ b/opcodes/z8kgen.c @@ -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; |