From: Klee Dienes Date: Mon, 18 Nov 2002 16:54:08 +0000 (+0000) Subject: 2002-11-12 Klee Dienes X-Git-Url: http://drtracing.org/?a=commitdiff_plain;h=11041102f23fd5f34fd4b81b04788e403a70edee;hp=a3e64b75ca58524a4bda89ba15e747f5e3a54993;p=deliverable%2Fbinutils-gdb.git 2002-11-12 Klee Dienes * avr-dis.c: Include libiberty.h (for xmalloc). (struct avr_opcodes_s): Remove 'bin_mask' field (it's automatically computed in the init routine). (AVR_INSN): No longer provide bin_mask field in initializer. (avr_opcodes_s): Declare as const. (print_insn_avr): Store the bin_mask field in a separate table (allocated with xmalloc); iterate through it at the same time as we iterate through the opcodes. --- diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index ce23088e1d..56f62d89f9 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,3 +1,14 @@ +2002-11-18 Klee Dienes + + * avr-dis.c: Include libiberty.h (for xmalloc). + (struct avr_opcodes_s): Remove 'bin_mask' field (it's + automatically computed in the init routine). + (AVR_INSN): No longer provide bin_mask field in initializer. + (avr_opcodes_s): Declare as const. + (print_insn_avr): Store the bin_mask field in a separate table + (allocated with xmalloc); iterate through it at the same time as + we iterate through the opcodes. + 2002-11-18 Klee Dienes * h8300-dis.c: Include libiberty.h (for xmalloc). diff --git a/opcodes/avr-dis.c b/opcodes/avr-dis.c index 4598cab414..adc4680cd1 100644 --- a/opcodes/avr-dis.c +++ b/opcodes/avr-dis.c @@ -21,7 +21,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #include "sysdep.h" #include "dis-asm.h" #include "opintl.h" - +#include "libiberty.h" struct avr_opcodes_s { @@ -31,16 +31,15 @@ struct avr_opcodes_s int insn_size; /* in words */ int isa; unsigned int bin_opcode; - unsigned int bin_mask; }; #define AVR_INSN(NAME, CONSTR, OPCODE, SIZE, ISA, BIN) \ -{#NAME, CONSTR, OPCODE, SIZE, ISA, BIN, 0}, +{#NAME, CONSTR, OPCODE, SIZE, ISA, BIN}, -struct avr_opcodes_s avr_opcodes[] = +const struct avr_opcodes_s avr_opcodes[] = { #include "opcode/avr.h" - {NULL, NULL, NULL, 0, 0, 0, 0} + {NULL, NULL, NULL, 0, 0, 0} }; static int avr_operand PARAMS ((unsigned int, unsigned int, @@ -257,9 +256,11 @@ print_insn_avr(addr, info) disassemble_info *info; { unsigned int insn, insn2; - struct avr_opcodes_s *opcode; + const struct avr_opcodes_s *opcode; + static unsigned int *maskptr; void *stream = info->stream; fprintf_ftype prin = info->fprintf_func; + static unsigned int *avr_bin_masks; static int initialized; int cmd_len = 2; int ok = 0; @@ -267,9 +268,16 @@ print_insn_avr(addr, info) if (!initialized) { - initialized = 1; + unsigned int nopcodes; + + nopcodes = sizeof (avr_opcodes) / sizeof (struct avr_opcodes_s); - for (opcode = avr_opcodes; opcode->name; opcode++) + avr_bin_masks = (unsigned int *) + xmalloc (nopcodes * sizeof (unsigned int)); + + for (opcode = avr_opcodes, maskptr = avr_bin_masks; + opcode->name; + opcode++, maskptr++) { char * s; unsigned int bin = 0; @@ -284,15 +292,19 @@ print_insn_avr(addr, info) } assert (s - opcode->opcode == 16); assert (opcode->bin_opcode == bin); - opcode->bin_mask = mask; + *maskptr = mask; } + + initialized = 1; } insn = avrdis_opcode (addr, info); - for (opcode = avr_opcodes; opcode->name; opcode++) + for (opcode = avr_opcodes, maskptr = avr_bin_masks; + opcode->name; + opcode++, maskptr++) { - if ((insn & opcode->bin_mask) == opcode->bin_opcode) + if ((insn & *maskptr) == opcode->bin_opcode) break; }