diff options
author | Klee Dienes <kdienes@apple.com> | 2002-11-18 16:52:46 +0000 |
---|---|---|
committer | Klee Dienes <kdienes@apple.com> | 2002-11-18 16:52:46 +0000 |
commit | 92fc697902c6efedf863a294b54be331578dcd0a (patch) | |
tree | c52058ba142c2a15d06c188f42606b0ae65fed74 /opcodes/h8300-dis.c | |
parent | e9e313ab9c7b2a69948f8b9f2157d3efff810fec (diff) | |
download | gdb-92fc697902c6efedf863a294b54be331578dcd0a.tar.gz |
2002-11-11 Klee Dienes <kdienes@apple.com>
* h8300.h (h8_opcode): Remove 'length' field.
(h8_opcodes): Mark as 'const' (both the declaration and
definition). Modify initializer and initializer macros to no
longer initialize the length field.
2002-11-11 Klee Dienes <kdienes@apple.com>
* h8300-dis.c: Include libiberty.h (for xmalloc).
(struct h8_instruction): New type, used to wrap h8_opcodes with a
length field (computed at run-time).
(h8_instructions): New variable.
(bfd_h8_disassemble_init): Allocate the storage for
h8_instructions. Fill h8_instructions with pointers to the
appropriate opcode and the correct value for the length field.
(bfd_h8_disassemble): Iterate through h8_instructions instead of
h8_opcodes.
Diffstat (limited to 'opcodes/h8300-dis.c')
-rw-r--r-- | opcodes/h8300-dis.c | 40 |
1 files changed, 31 insertions, 9 deletions
diff --git a/opcodes/h8300-dis.c b/opcodes/h8300-dis.c index d14fda9858b..debab9b9102 100644 --- a/opcodes/h8300-dis.c +++ b/opcodes/h8300-dis.c @@ -23,6 +23,15 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "opcode/h8300.h" #include "dis-asm.h" #include "opintl.h" +#include "libiberty.h" + +struct h8_instruction +{ + int length; + const struct h8_opcode *opcode; +}; + +struct h8_instruction *h8_instructions; static void bfd_h8_disassemble_init PARAMS ((void)); static unsigned int bfd_h8_disassemble @@ -34,9 +43,16 @@ static void bfd_h8_disassemble_init () { unsigned int i; - struct h8_opcode *p; + unsigned int nopcodes; + const struct h8_opcode *p; + struct h8_instruction *pi; - for (p = h8_opcodes; p->name; p++) + nopcodes = sizeof (h8_opcodes) / sizeof (struct h8_opcode); + + h8_instructions = (struct h8_instruction *) + xmalloc (nopcodes * sizeof (struct h8_instruction)); + + for (p = h8_opcodes, pi = h8_instructions; p->name; p++, pi++) { int n1 = 0; int n2 = 0; @@ -59,8 +75,13 @@ bfd_h8_disassemble_init () if (i & 1) abort (); - p->length = i / 2; + pi->length = i / 2; + pi->opcode = p; } + + /* Add entry for the NULL vector terminator. */ + pi->length = 0; + pi->opcode = p; } static unsigned int @@ -92,7 +113,7 @@ bfd_h8_disassemble (addr, info, mode) int bit = 0; int plen = 0; static boolean init = 0; - struct h8_opcode *q; + const struct h8_instruction *qi; char const **pregnames = mode != 0 ? lregnames : wregnames; int status; int l; @@ -117,8 +138,9 @@ bfd_h8_disassemble (addr, info, mode) status = info->read_memory_func (addr + l, data + l, 2, info); /* Find the exact opcode/arg combo. */ - for (q = h8_opcodes; q->name; q++) + for (qi = h8_instructions; qi->opcode->name; qi++) { + const struct h8_opcode *q = qi->opcode; op_type *nib = q->data.nib; unsigned int len = 0; @@ -247,7 +269,7 @@ bfd_h8_disassemble (addr, info, mode) { int i; - for (i = 0; i < q->length; i++) + for (i = 0; i < qi->length; i++) fprintf (stream, "%02x ", data[i]); for (; i < 6; i++) @@ -264,7 +286,7 @@ bfd_h8_disassemble (addr, info, mode) high = data[3] & 0x7; fprintf (stream, "@sp+,er%d-er%d", high - count, high); - return q->length; + return qi->length; } if (strcmp (q->name, "stm.l") == 0) @@ -275,7 +297,7 @@ bfd_h8_disassemble (addr, info, mode) low = data[3] & 0x7; fprintf (stream, "er%d-er%d,@-sp", low, low + count); - return q->length; + return qi->length; } /* Fill in the args. */ @@ -389,7 +411,7 @@ bfd_h8_disassemble (addr, info, mode) } } - return q->length; + return qi->length; } else /* xgettext:c-format */ |