From 0e073f4ce8c5907ba76b3d7aeb5b373a308b25d4 Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Thu, 12 Dec 2002 21:52:06 +0000 Subject: [PATCH] * pj.h (pj_opc_info_t): Add union. * pj-dis.c (print_insn_pj): Adjust for pj_opc_info_t change. * config/tc-pj.c (little, big, parse_exp_save_ilp): Prototype. (c_to_r, ipush_code, fake_opcode, alias): Likewise. (fake_opcode): Adjust for pj_opc_int_t change. (md_begin): Likewise. (md_assemble): Likewise. (ipush_code): Correct parse_exp_save_ilp call. Test pending_reloc instead of non-existent third arg of parse_exp_save_ilp. (md_parse_option): Correct "little" and "big" calls. --- gas/ChangeLog | 8 ++++++++ gas/config/tc-pj.c | 39 ++++++++++++++++++++++++++++----------- include/opcode/ChangeLog | 4 ++++ include/opcode/pj.h | 7 +++++-- opcodes/ChangeLog | 1 + opcodes/pj-dis.c | 8 ++++---- 6 files changed, 50 insertions(+), 17 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 1ec063c1f8c..7cddfbb647b 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,13 @@ 2002-12-13 Alan Modra + * config/tc-pj.c (little, big, parse_exp_save_ilp): Prototype. + (c_to_r, ipush_code, fake_opcode, alias): Likewise. + (fake_opcode): Adjust for pj_opc_int_t change. + (md_begin): Likewise. + (md_assemble): Likewise. + (ipush_code): Correct parse_exp_save_ilp call. Test pending_reloc + instead of non-existent third arg of parse_exp_save_ilp. + (md_parse_option): Correct "little" and "big" calls. * config/tc-sparc.c (s_register): Only declare #ifdef OBJ_ELF. (md_apply_fix3 ): Add ATTRIBUTE_UNUSED. (tc_gen_reloc
): Likewise. diff --git a/gas/config/tc-pj.c b/gas/config/tc-pj.c index a16971d1408..e27dae02ab0 100644 --- a/gas/config/tc-pj.c +++ b/gas/config/tc-pj.c @@ -34,6 +34,21 @@ const char line_comment_chars[] = "/!#"; static int pending_reloc; static struct hash_control *opcode_hash_control; +static void little + PARAMS ((int)); +static void big + PARAMS ((int)); +static char *parse_exp_save_ilp + PARAMS ((char *, expressionS *)); +static int c_to_r + PARAMS ((char)); +static void ipush_code + PARAMS ((pj_opc_info_t *, char *)); +static void fake_opcode + PARAMS ((const char *, void (*) (struct pj_opc_info_t *, char *))); +static void alias + PARAMS ((const char *, const char *)); + static void little (ignore) int ignore ATTRIBUTE_UNUSED; @@ -155,15 +170,17 @@ ipush_code (opcode, str) pj_opc_info_t *opcode ATTRIBUTE_UNUSED; char *str; { - int mod = 0; char *b = frag_more (6); expressionS arg; b[0] = 0x11; b[3] = 0xed; - parse_exp_save_ilp (str + 1, &arg, &mod); - if (mod) - as_bad (_("can't have relocation for ipush")); + parse_exp_save_ilp (str + 1, &arg); + if (pending_reloc) + { + as_bad (_("can't have relocation for ipush")); + pending_reloc = 0; + } fix_new_exp (frag_now, b - frag_now->fr_literal + 1, 2, &arg, 0, BFD_RELOC_PJ_CODE_DIR16); @@ -177,13 +194,13 @@ ipush_code (opcode, str) static void fake_opcode (name, func) const char *name; - void (*func) (); + void (*func) PARAMS ((struct pj_opc_info_t *, char *)); { pj_opc_info_t *fake = (pj_opc_info_t *) xmalloc (sizeof (pj_opc_info_t)); fake->opcode = -1; fake->opcode_next = -1; - fake->name = (const char *) func; + fake->u.func = func; hash_insert (opcode_hash_control, name, (char *) fake); } @@ -210,8 +227,8 @@ md_begin () opcode_hash_control = hash_new (); /* Insert names into hash table. */ - for (opcode = pj_opc_info; opcode->name; opcode++) - hash_insert (opcode_hash_control, opcode->name, (char *) opcode); + for (opcode = pj_opc_info; opcode->u.name; opcode++) + hash_insert (opcode_hash_control, opcode->u.name, (char *) opcode); /* Insert the only fake opcode. */ fake_opcode ("ipush", ipush_code); @@ -278,7 +295,7 @@ md_assemble (str) { /* It's a fake opcode. Dig out the args and pretend that was what we were passed. */ - ((void (*) ()) opcode->name) (opcode, op_end); + (*opcode->u.func) (opcode, op_end); } else { @@ -404,10 +421,10 @@ md_parse_option (c, arg) switch (c) { case OPTION_LITTLE: - little (); + little (0); break; case OPTION_BIG: - big (); + big (0); break; default: return 0; diff --git a/include/opcode/ChangeLog b/include/opcode/ChangeLog index 79771d8fcce..2fe2f99c7bf 100644 --- a/include/opcode/ChangeLog +++ b/include/opcode/ChangeLog @@ -1,3 +1,7 @@ +2002-12-13 Alan Modra + + * pj.h (pj_opc_info_t): Add union. + 2002-12-04 David Mosberger * ia64.h: Fix copyright message. diff --git a/include/opcode/pj.h b/include/opcode/pj.h index b768f11bdb9..5779507be80 100644 --- a/include/opcode/pj.h +++ b/include/opcode/pj.h @@ -36,11 +36,14 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #define UNS(x) (!!((x) & (1<<3))) -typedef struct +typedef struct pj_opc_info_t { short opcode; short opcode_next; char len; unsigned char arg[2]; - const char *name; + union { + const char *name; + void (*func) PARAMS ((struct pj_opc_info_t *, char *)); + } u; } pj_opc_info_t; diff --git a/opcodes/ChangeLog b/opcodes/ChangeLog index a6ff9abf0b3..2cca6e02a26 100644 --- a/opcodes/ChangeLog +++ b/opcodes/ChangeLog @@ -1,5 +1,6 @@ 2002-12-13 Alan Modra + * pj-dis.c (print_insn_pj): Adjust for pj_opc_info_t change. * z8kgen.c: Include "libiberty.h". (opt, args, toks): Fix initializer warnings. (chewname): Make "name" a char **. Return mnemonic trimmed of diff --git a/opcodes/pj-dis.c b/opcodes/pj-dis.c index b8b81a96a7e..50d1750f252 100644 --- a/opcodes/pj-dis.c +++ b/opcodes/pj-dis.c @@ -62,7 +62,7 @@ print_insn_pj (addr, info) unsigned char byte_2; if ((status = info->read_memory_func (addr + 1, &byte_2, 1, info))) goto fail; - fprintf_fn (stream, "%s\t", pj_opc_info[opcode + byte_2].name); + fprintf_fn (stream, "%s\t", pj_opc_info[opcode + byte_2].u.name); return 2; } else @@ -72,12 +72,12 @@ print_insn_pj (addr, info) const pj_opc_info_t *op = &pj_opc_info[opcode]; int a; addr++; - fprintf_fn (stream, "%s", op->name); + fprintf_fn (stream, "%s", op->u.name); /* The tableswitch instruction is followed by the default address, low value, high value and the destinations. */ - if (strcmp (op->name, "tableswitch") == 0) + if (strcmp (op->u.name, "tableswitch") == 0) { int lowval; int highval; @@ -116,7 +116,7 @@ print_insn_pj (addr, info) address, element count and pairs of values and addresses. */ - if (strcmp (op->name, "lookupswitch") == 0) + if (strcmp (op->u.name, "lookupswitch") == 0) { int count; int val; -- 2.30.2