From d7ba4a779e0a1dba7c377b83a2747a186b21b527 Mon Sep 17 00:00:00 2001 From: Ian Lance Taylor Date: Thu, 10 Jun 1999 20:35:50 +0000 Subject: [PATCH] Based on patches from John W. Woznack : * itbl-ops.c (itbl_get_reg_val): Add pval parameter. Return indication of success rather than a value. (itbl_get_val): Likewise. (itbl_get_field): Use strcspn. Change delimiters to include parens. * itbl-ops.h (itbl_get_reg_val): Update declaration. (itbl_get_val): Likewise. * config/tc-mips.c (mips_ip): Update call to itbl_get_reg_val. --- gas/ChangeLog | 10 ++++++++++ gas/config/tc-mips.c | 15 +++++++------- gas/itbl-ops.c | 47 ++++++++++++++++++++------------------------ gas/itbl-ops.h | 8 ++++---- 4 files changed, 42 insertions(+), 38 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 30fbfb5a0ef..85e98be883d 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,5 +1,15 @@ 1999-06-10 Ian Lance Taylor + Based on patches from John W. Woznack : + * itbl-ops.c (itbl_get_reg_val): Add pval parameter. Return + indication of success rather than a value. + (itbl_get_val): Likewise. + (itbl_get_field): Use strcspn. Change delimiters to include + parens. + * itbl-ops.h (itbl_get_reg_val): Update declaration. + (itbl_get_val): Likewise. + * config/tc-mips.c (mips_ip): Update call to itbl_get_reg_val. + * symbols.c (copy_symbol_attributes): Convert local symbols to regular symbols. diff --git a/gas/config/tc-mips.c b/gas/config/tc-mips.c index 3c1c00c9999..c9b063291ff 100644 --- a/gas/config/tc-mips.c +++ b/gas/config/tc-mips.c @@ -7297,23 +7297,22 @@ mips_ip (str, ip) else if (itbl_have_entries) { char *p, *n; - int r; + unsigned long r; - p = s+1; /* advance past '$' */ + p = s + 1; /* advance past '$' */ n = itbl_get_field (&p); /* n is name */ - /* See if this is a register defined in an - itbl entry */ - r = itbl_get_reg_val (n); - if (r) + /* See if this is a register defined in an + itbl entry. */ + if (itbl_get_reg_val (n, &r)) { /* Get_field advances to the start of the next field, so we need to back - rack to the end of the last field. */ + rack to the end of the last field. */ if (p) s = p - 1; else - s = strchr (s,'\0'); + s = strchr (s, '\0'); regno = r; } else diff --git a/gas/itbl-ops.c b/gas/itbl-ops.c index f008dcafebc..23d5f2f33f9 100644 --- a/gas/itbl-ops.c +++ b/gas/itbl-ops.c @@ -1,5 +1,5 @@ /* itbl-ops.c - Copyright (C) 1997, 1998 Free Software Foundation, Inc. + Copyright (C) 1997, 1998, 1999 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -457,18 +457,20 @@ form_args (struct itbl_entry *e) /* Get processor's register name from val */ -unsigned long -itbl_get_reg_val (char *name) +int +itbl_get_reg_val (char *name, unsigned long *pval) { e_type t; e_processor p; - int r = 0; + for (p = e_p0; p < e_nprocs; p++) - for (t = e_regtype0; t < e_nregtypes; t++) - { - if (r = itbl_get_val (p, t, name), r) - return r; - } + { + for (t = e_regtype0; t < e_nregtypes; t++) + { + if (itbl_get_val (p, t, name, pval)) + return 1; + } + } return 0; } @@ -486,16 +488,17 @@ itbl_get_name (e_processor processor, e_type type, unsigned long val) /* Get processor's register value from name */ -unsigned long -itbl_get_val (e_processor processor, e_type type, char *name) +int +itbl_get_val (e_processor processor, e_type type, char *name, + unsigned long *pval) { struct itbl_entry *r; /* type depends on instruction passed */ r = find_entry_byname (processor, type, name); - if (r) - return r->value; - else - return 0; /* error; invalid operand */ + if (r == NULL) + return 0; + *pval = r->value; + return 1; } @@ -732,7 +735,7 @@ extract_range (unsigned long aval, struct itbl_range r) /* Extract processor's assembly instruction field name from s; * forms are "n args" "n,args" or "n" */ /* Return next argument from string pointer "s" and advance s. - * delimiters are " ,\0" */ + * delimiters are " ,()" */ char * itbl_get_field (char **S) @@ -744,16 +747,8 @@ itbl_get_field (char **S) s = *S; if (!s || !*s) return 0; - p = s + strlen (s); - if (ps = strchr (s, ','), ps) - p = ps; - if (ps = strchr (s, ' '), ps) - p = min (p, ps); - if (ps = strchr (s, '\0'), ps) - p = min (p, ps); - if (p == 0) - return 0; /* error! */ - len = p - s; + /* FIXME: This is a weird set of delimiters. */ + len = strcspn (s, " \t,()"); ASSERT (128 > len + 1); strncpy (n, s, len); n[len] = 0; diff --git a/gas/itbl-ops.h b/gas/itbl-ops.h index 2946eff0066..d69ea7fbe58 100644 --- a/gas/itbl-ops.h +++ b/gas/itbl-ops.h @@ -1,5 +1,5 @@ /* itbl-ops.h - Copyright (C) 1997 Free Software Foundation, Inc. + Copyright (C) 1997, 1999 Free Software Foundation, Inc. This file is part of GAS, the GNU Assembler. @@ -92,9 +92,9 @@ char *itbl_get_field PARAMS ((char **s)); unsigned long itbl_assemble PARAMS ((char *name, char *operands)); int itbl_disassemble PARAMS ((char *str, unsigned long insn)); int itbl_parse PARAMS ((char *tbl)); /* parses insn tbl */ -unsigned long itbl_get_reg_val PARAMS ((char *name)); -unsigned long itbl_get_val PARAMS ((e_processor processor, e_type type, - char *name)); +int itbl_get_reg_val PARAMS ((char *name, unsigned long *pval)); +int itbl_get_val PARAMS ((e_processor processor, e_type type, char *name, + unsigned long *pval)); char *itbl_get_name PARAMS ((e_processor processor, e_type type, unsigned long val)); -- 2.30.2