]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - gas/config/tc-tic4x.c
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / gas / config / tc-tic4x.c
index 4c80c1915ae94c83c381b7df28ff20cfd4c67e16..c456dffbbad1f611d7f6ab522195609ac270f2b3 100644 (file)
@@ -1,6 +1,5 @@
 /* tc-tic4x.c -- Assemble for the Texas Instruments TMS320C[34]x.
-   Copyright (C) 1997,1998, 2002, 2003, 2005, 2006, 2007, 2008
-   Free Software Foundation. Inc.
+   Copyright (C) 1997-2021 Free Software Foundation, Inc.
 
    Contributed by Michael P. Hayes (m.hayes@elec.canterbury.ac.nz)
 
 
    You should have received a copy of the GNU General Public License
    along with GAS; see the file COPYING.  If not, write to
-   the Free Software Foundation, 51 Franklin Street - Fifth Floor, 
+   the Free Software Foundation, 51 Franklin Street - Fifth Floor,
    Boston, MA 02110-1301, USA.  */
 /*
   TODOs:
   ------
-  
+
   o .align cannot handle fill-data-width larger than 0xFF/8-bits. It
     should be possible to define a 32-bits pattern.
 
-  o .align fills all section with NOP's when used regardless if has
-    been used in .text or .data. (However the .align is primarily
-    intended used in .text sections. If you require something else,
-    use .align <size>,0x00)
-
   o .align: Implement a 'bu' insn if the number of nop's exceeds 4
     within the align frag. if(fragsize>4words) insert bu fragend+1
     first.
   o Evaluation of constant floating point expressions (expr.c needs
     work!)
 
-  o Support 'abc' constants (that is 0x616263)
-*/
+  o Support 'abc' constants (that is 0x616263).  */
 
-#include "safe-ctype.h"
 #include "as.h"
+#include "safe-ctype.h"
 #include "opcode/tic4x.h"
 #include "subsegs.h"
-#include "obstack.h"
 
 /* OK, we accept a syntax similar to the other well known C30
    assembly tools.  With TIC4X_ALT_SYNTAX defined we are more
 
 #define TIC4X_ALT_SYNTAX
 
-/* Equal to MAX_PRECISION in atof-ieee.c.  */
-#define MAX_LITTLENUMS 6       /* (12 bytes) */
-
 /* Handle of the inst mnemonic hash table.  */
-static struct hash_control *tic4x_op_hash = NULL;
+static htab_t tic4x_op_hash = NULL;
 
 /* Handle asg pseudo.  */
-static struct hash_control *tic4x_asg_hash = NULL;
+static htab_t tic4x_asg_hash = NULL;
 
 static unsigned int tic4x_cpu = 0;        /* Default to TMS320C40.  */
 static unsigned int tic4x_revision = 0;   /* CPU revision */
@@ -88,7 +77,7 @@ static unsigned long tic4x_oplevel = 0;   /* Opcode level */
 #define OPTION_ENHANCED (OPTION_MD_BASE + 7)
 #define OPTION_REV      (OPTION_MD_BASE + 8)
 
-CONST char *md_shortopts = "bm:prs";
+const char *md_shortopts = "bm:prs";
 struct option md_longopts[] =
 {
   { "mcpu",   required_argument, NULL, OPTION_CPU },
@@ -132,7 +121,8 @@ typedef struct tic4x_insn
     unsigned int nchars;       /* This is always 4 for the C30.  */
     unsigned long opcode;      /* Opcode number.  */
     expressionS exp;           /* Expression required for relocation.  */
-    int reloc;                 /* Relocation type required.  */
+    /* Relocation type required.  */
+    bfd_reloc_code_real_type reloc;
     int pcrel;                 /* True if relocation PC relative.  */
     char *pname;               /* Name of instruction in parallel.  */
     unsigned int num_operands; /* Number of operands in total.  */
@@ -144,78 +134,17 @@ tic4x_insn_t;
 static tic4x_insn_t the_insn;  /* Info about our instruction.  */
 static tic4x_insn_t *insn = &the_insn;
 
-static int tic4x_gen_to_words
-  PARAMS ((FLONUM_TYPE, LITTLENUM_TYPE *, int ));
-static char *tic4x_atof
-  PARAMS ((char *, char, LITTLENUM_TYPE * ));
-static void tic4x_insert_reg
-  PARAMS ((char *, int ));
-static void tic4x_insert_sym
-  PARAMS ((char *, int ));
-static char *tic4x_expression
-  PARAMS ((char *, expressionS *));
-static char *tic4x_expression_abs
-  PARAMS ((char *, offsetT *));
-static void tic4x_emit_char
-  PARAMS ((char, int));
-static void tic4x_seg_alloc
-  PARAMS ((char *, segT, int, symbolS *));
-static void tic4x_asg
-  PARAMS ((int));
-static void tic4x_bss
-  PARAMS ((int));
-static void tic4x_globl
-  PARAMS ((int));
-static void tic4x_cons
-  PARAMS ((int));
-static void tic4x_stringer
-  PARAMS ((int));
-static void tic4x_eval
-  PARAMS ((int));
-static void tic4x_newblock
-  PARAMS ((int));
-static void tic4x_sect
-  PARAMS ((int));
-static void tic4x_set
-  PARAMS ((int));
-static void tic4x_usect
-  PARAMS ((int));
-static void tic4x_version
-  PARAMS ((int));
-static void tic4x_init_regtable
-  PARAMS ((void));
-static void tic4x_init_symbols
-  PARAMS ((void));
-static int tic4x_inst_insert (const tic4x_inst_t *);
-static tic4x_inst_t *tic4x_inst_make
-  PARAMS ((char *, unsigned long, char *));
-static int tic4x_inst_add (const tic4x_inst_t *);
-void tic4x_end
-  PARAMS ((void));
-static int tic4x_indirect_parse
-  PARAMS ((tic4x_operand_t *, const tic4x_indirect_t *));
-static char *tic4x_operand_parse
-  PARAMS ((char *, tic4x_operand_t *));
-static int tic4x_operands_match
-  PARAMS ((tic4x_inst_t *, tic4x_insn_t *, int));
-static void tic4x_insn_check
-  PARAMS ((tic4x_insn_t *));
-static void tic4x_insn_output
-  PARAMS ((tic4x_insn_t *));
-static int tic4x_operands_parse
-  PARAMS ((char *, tic4x_operand_t *, int ));
-void tic4x_cleanup
-  PARAMS ((void));
-int tic4x_unrecognized_line
-  PARAMS ((int));
-static int tic4x_pc_offset
-  PARAMS ((unsigned int));
-int tic4x_do_align
-  PARAMS ((int, const char *, int, int));
-void tic4x_start_line
-  PARAMS ((void));
-arelent *tc_gen_reloc
-  PARAMS ((asection *, fixS *));
+static void tic4x_asg (int);
+static void tic4x_bss (int);
+static void tic4x_globl (int);
+static void tic4x_cons (int);
+static void tic4x_stringer (int);
+static void tic4x_eval (int);
+static void tic4x_newblock (int);
+static void tic4x_sect (int);
+static void tic4x_set (int);
+static void tic4x_usect (int);
+static void tic4x_version (int);
 
 
 const pseudo_typeS
@@ -264,10 +193,10 @@ const char comment_chars[] = ";";
 
 /* This array holds the chars that only start a comment at the beginning of
    a line.  If the line seems to have the form '# 123 filename'
-   .line and .file directives will appear in the pre-processed output. 
+   .line and .file directives will appear in the pre-processed output.
    Note that input_file.c hand checks for '#' at the beginning of the
    first line of the input file.  This is because the compiler outputs
-   #NO_APP at the beginning of its output. 
+   #NO_APP at the beginning of its output.
    Also note that comments like this one will always work.  */
 const char line_comment_chars[] = "#*";
 
@@ -291,7 +220,7 @@ const char FLT_CHARS[] = "fFilsS";
 extern FLONUM_TYPE generic_floating_point_number;
 
 /* Precision in LittleNums.  */
-#define MAX_PRECISION (4)       /* Its a bit overkill for us, but the code
+#define MAX_PRECISION (4)       /* It's a bit overkill for us, but the code
                                    requires it... */
 #define S_PRECISION (1)                /* Short float constants 16-bit.  */
 #define F_PRECISION (2)                /* Float and double types 32-bit.  */
@@ -300,10 +229,7 @@ extern FLONUM_TYPE generic_floating_point_number;
 
 /* Turn generic_floating_point_number into a real short/float/double.  */
 static int
-tic4x_gen_to_words (flonum, words, precision)
-     FLONUM_TYPE flonum;
-     LITTLENUM_TYPE *words;
-     int precision;
+tic4x_gen_to_words (FLONUM_TYPE flonum, LITTLENUM_TYPE *words, int precision)
 {
   int return_value = 0;
   LITTLENUM_TYPE *p;           /* Littlenum pointer.  */
@@ -322,7 +248,7 @@ tic4x_gen_to_words (flonum, words, precision)
      The code in this function is altered slightly to support floats
      with 31-bits mantissas, thus the documentation below may be a
      little bit inaccurate.
-     
+
      By Michael P. Hayes <m.hayes@elec.canterbury.ac.nz>
      Here is how a generic floating point number is stored using
      flonums (an extension of bignums) where p is a pointer to an
@@ -460,7 +386,7 @@ tic4x_gen_to_words (flonum, words, precision)
       || flonum.sign == 0) /* = NaN */
     {
       if(flonum.sign == 0)
-        as_bad ("Nan, using zero.");
+        as_bad (_("Nan, using zero."));
       words[0] = 0x8000;
       return return_value;
     }
@@ -470,7 +396,7 @@ tic4x_gen_to_words (flonum, words, precision)
       /* +INF:  Replace with maximum float.  */
       if (precision == S_PRECISION)
        words[0] = 0x77ff;
-      else 
+      else
        {
          words[0] = 0x7f7f;
          words[1] = 0xffff;
@@ -487,7 +413,7 @@ tic4x_gen_to_words (flonum, words, precision)
       /* -INF:  Replace with maximum float.  */
       if (precision == S_PRECISION)
        words[0] = 0x7800;
-      else 
+      else
         words[0] = 0x7f80;
       if (precision == E_PRECISION)
         words[2] = 0x8000;
@@ -527,8 +453,8 @@ tic4x_gen_to_words (flonum, words, precision)
   /* Store the mantissa data into smant and the roundbit into rbit */
   for (p = flonum.leader; p >= flonum.low && shift > -16; p--)
     {
-      tmp = shift >= 0 ? *p << shift : *p >> -shift;
-      rbit = shift < 0 ? ((*p >> (-shift-1)) & 0x1) : 0;
+      tmp = shift >= 0 ? (unsigned) *p << shift : (unsigned) *p >> -shift;
+      rbit = shift < 0 ? (((unsigned) *p >> (-shift-1)) & 0x1) : 0;
       smant |= tmp;
       shift -= 16;
     }
@@ -537,18 +463,14 @@ tic4x_gen_to_words (flonum, words, precision)
   if(rbit)
     {
       /* If the mantissa is going to overflow when added, lets store
-         the extra bit in mover. -- A special case exists when
-         mantissa_bits is 31 (E_PRECISION). Then the first test cannot
-         be trusted, as result is host-dependent, thus the second
-         test. */
-      if( smant == ((unsigned)(1<<(mantissa_bits+1))-1)
-          || smant == (unsigned)-1 )  /* This is to catch E_PRECISION cases */
+        the extra bit in mover.  */
+      if (smant == (1u << mantissa_bits << 1) - 1)
         mover=1;
       smant++;
     }
 
   /* Get the scaled one value */
-  sone = (1 << (mantissa_bits));
+  sone = 1u << mantissa_bits;
 
   /* The number may be unnormalised so renormalise it...  */
   if(mover)
@@ -582,7 +504,7 @@ tic4x_gen_to_words (flonum, words, precision)
     }
 
   if (abs (exponent) >= (1 << (exponent_bits - 1)))
-    as_bad ("Cannot represent exponent in %d bits", exponent_bits);
+    as_bad (_("Cannot represent exponent in %d bits"), exponent_bits);
 
   /* Force exponent to fit in desired field width.  */
   exponent &= (1 << (exponent_bits)) - 1;
@@ -601,7 +523,7 @@ tic4x_gen_to_words (flonum, words, precision)
   else
     {
       /* Insert the exponent data into the word */
-      sfract |= exponent << (mantissa_bits+1);
+      sfract |= (unsigned) exponent << (mantissa_bits + 1);
 
       if (precision == S_PRECISION)
         words[0] = sfract;
@@ -617,10 +539,7 @@ tic4x_gen_to_words (flonum, words, precision)
 
 /* Returns pointer past text consumed.  */
 static char *
-tic4x_atof (str, what_kind, words)
-     char *str;
-     char what_kind;
-     LITTLENUM_TYPE *words;
+tic4x_atof (char *str, char what_kind, LITTLENUM_TYPE *words)
 {
   /* Extra bits for zeroed low-order bits.  The 1st MAX_PRECISION are
      zeroed, the last contain flonum bits.  */
@@ -668,7 +587,7 @@ tic4x_atof (str, what_kind, words)
       break;
 
     default:
-      as_bad ("Invalid floating point number");
+      as_bad (_("Invalid floating point number"));
       return (NULL);
     }
 
@@ -678,7 +597,7 @@ tic4x_atof (str, what_kind, words)
   if (atof_generic (&return_value, ".", EXP_CHARS,
                    &generic_floating_point_number))
     {
-      as_bad ("Invalid floating point number");
+      as_bad (_("Invalid floating point number"));
       return (NULL);
     }
 
@@ -692,41 +611,35 @@ tic4x_atof (str, what_kind, words)
   return return_value;
 }
 
-static void 
-tic4x_insert_reg (regname, regnum)
-     char *regname;
-     int regnum;
+static void
+tic4x_insert_reg (const char *regname, int regnum)
 {
   char buf[32];
   int i;
 
-  symbol_table_insert (symbol_new (regname, reg_section, (valueT) regnum,
-                                  &zero_address_frag));
+  symbol_table_insert (symbol_new (regname, reg_section,
+                                  &zero_address_frag, regnum));
   for (i = 0; regname[i]; i++)
     buf[i] = ISLOWER (regname[i]) ? TOUPPER (regname[i]) : regname[i];
   buf[i] = '\0';
 
-  symbol_table_insert (symbol_new (buf, reg_section, (valueT) regnum,
-                                  &zero_address_frag));
+  symbol_table_insert (symbol_new (buf, reg_section,
+                                  &zero_address_frag, regnum));
 }
 
-static void 
-tic4x_insert_sym (symname, value)
-     char *symname;
-     int value;
+static void
+tic4x_insert_sym (const char *symname, int value)
 {
   symbolS *symbolP;
 
   symbolP = symbol_new (symname, absolute_section,
-                       (valueT) value, &zero_address_frag);
+                       &zero_address_frag, value);
   SF_SET_LOCAL (symbolP);
   symbol_table_insert (symbolP);
 }
 
 static char *
-tic4x_expression (str, exp)
-     char *str;
-     expressionS *exp;
+tic4x_expression (char *str, expressionS *exp)
 {
   char *s;
   char *t;
@@ -740,9 +653,7 @@ tic4x_expression (str, exp)
 }
 
 static char *
-tic4x_expression_abs (str, value)
-     char *str;
-     offsetT *value;
+tic4x_expression_abs (char *str, offsetT *value)
 {
   char *s;
   char *t;
@@ -755,10 +666,8 @@ tic4x_expression_abs (str, value)
   return s;
 }
 
-static void 
-tic4x_emit_char (c,b)
-     char c;
-     int b;
+static void
+tic4x_emit_char (char c, int b)
 {
   expressionS exp;
 
@@ -767,12 +676,11 @@ tic4x_emit_char (c,b)
   emit_expr (&exp, b);
 }
 
-static void 
-tic4x_seg_alloc (name, seg, size, symbolP)
-     char *name ATTRIBUTE_UNUSED;
-     segT seg ATTRIBUTE_UNUSED;
-     int size;
-     symbolS *symbolP;
+static void
+tic4x_seg_alloc (char *name ATTRIBUTE_UNUSED,
+                segT seg ATTRIBUTE_UNUSED,
+                int size,
+                symbolS *symbolP)
 {
   /* Note that the size is in words
      so we multiply it by 4 to get the number of bytes to allocate.  */
@@ -793,14 +701,12 @@ tic4x_seg_alloc (name, seg, size, symbolP)
 }
 
 /* .asg ["]character-string["], symbol */
-static void 
-tic4x_asg (x)
-     int x ATTRIBUTE_UNUSED;
+static void
+tic4x_asg (int x ATTRIBUTE_UNUSED)
 {
   char c;
   char *name;
   char *str;
-  char *tmp;
 
   SKIP_WHITESPACE ();
   str = input_line_pointer;
@@ -810,30 +716,21 @@ tic4x_asg (x)
     input_line_pointer++;
   if (*input_line_pointer != ',')
     {
-      as_bad ("Comma expected\n");
+      as_bad (_("Comma expected\n"));
       return;
     }
   *input_line_pointer++ = '\0';
-  name = input_line_pointer;
-  c = get_symbol_end ();       /* Get terminator.  */
-  tmp = xmalloc (strlen (str) + 1);
-  strcpy (tmp, str);
-  str = tmp;
-  tmp = xmalloc (strlen (name) + 1);
-  strcpy (tmp, name);
-  name = tmp;
-  if (hash_find (tic4x_asg_hash, name))
-    hash_replace (tic4x_asg_hash, name, (PTR) str);
-  else
-    hash_insert (tic4x_asg_hash, name, (PTR) str);
-  *input_line_pointer = c;
+  c = get_symbol_name (&name); /* Get terminator.  */
+  str = xstrdup (str);
+  name = xstrdup (name);
+  str_hash_insert (tic4x_asg_hash, name, str, 1);
+  (void) restore_line_pointer (c);
   demand_empty_rest_of_line ();
 }
 
 /* .bss symbol, size  */
-static void 
-tic4x_bss (x)
-     int x ATTRIBUTE_UNUSED;
+static void
+tic4x_bss (int x ATTRIBUTE_UNUSED)
 {
   char c;
   char *name;
@@ -847,11 +744,12 @@ tic4x_bss (x)
   current_subseg = now_subseg; /* Save current subseg.  */
 
   SKIP_WHITESPACE ();
-  name = input_line_pointer;
-  c = get_symbol_end ();       /* Get terminator.  */
+  c = get_symbol_name (&name); /* Get terminator.  */
+  if (c == '"')
+    c = * ++ input_line_pointer;
   if (c != ',')
     {
-      as_bad (".bss size argument missing\n");
+      as_bad (_(".bss size argument missing\n"));
       return;
     }
 
@@ -859,7 +757,7 @@ tic4x_bss (x)
     tic4x_expression_abs (++input_line_pointer, &size);
   if (size < 0)
     {
-      as_bad (".bss size %ld < 0!", (long) size);
+      as_bad (_(".bss size %ld < 0!"), (long) size);
       return;
     }
   subseg_set (bss_section, 0);
@@ -887,8 +785,7 @@ tic4x_bss (x)
 }
 
 static void
-tic4x_globl (ignore)
-     int ignore ATTRIBUTE_UNUSED;
+tic4x_globl (int ignore ATTRIBUTE_UNUSED)
 {
   char *name;
   int c;
@@ -896,12 +793,12 @@ tic4x_globl (ignore)
 
   do
     {
-      name = input_line_pointer;
-      c = get_symbol_end ();
+      c = get_symbol_name (&name);
       symbolP = symbol_find_or_make (name);
       *input_line_pointer = c;
-      SKIP_WHITESPACE ();
+      SKIP_WHITESPACE_AFTER_NAME ();
       S_SET_STORAGE_CLASS (symbolP, C_EXT);
+      S_SET_EXTERNAL (symbolP);
       if (c == ',')
        {
          input_line_pointer++;
@@ -916,11 +813,10 @@ tic4x_globl (ignore)
 }
 
 /* Handle .byte, .word. .int, .long */
-static void 
-tic4x_cons (bytes)
-     int bytes;
+static void
+tic4x_cons (int bytes)
 {
-  register unsigned int c;
+  unsigned int c;
   do
     {
       SKIP_WHITESPACE ();
@@ -960,12 +856,11 @@ tic4x_cons (bytes)
 }
 
 /* Handle .ascii, .asciz, .string */
-static void 
-tic4x_stringer (append_zero)
-     int append_zero; /*ex: bytes */
+static void
+tic4x_stringer (int append_zero)
 {
   int bytes;
-  register unsigned int c;
+  unsigned int c;
 
   bytes = 0;
   do
@@ -995,10 +890,10 @@ tic4x_stringer (append_zero)
          input_line_pointer = tic4x_expression (input_line_pointer, &exp);
          if (exp.X_op != O_constant)
             {
-              as_bad("Non-constant symbols not allowed\n");
+              as_bad (_("Non-constant symbols not allowed\n"));
               return;
             }
-          exp.X_add_number &= 255; /* Limit numeber to 8-bit */
+          exp.X_add_number &= 255; /* Limit number to 8-bit */
          emit_expr (&exp, 1);
           bytes++;
        }
@@ -1014,9 +909,8 @@ tic4x_stringer (append_zero)
 }
 
 /* .eval expression, symbol */
-static void 
-tic4x_eval (x)
-     int x ATTRIBUTE_UNUSED;
+static void
+tic4x_eval (int x ATTRIBUTE_UNUSED)
 {
   char c;
   offsetT value;
@@ -1027,32 +921,29 @@ tic4x_eval (x)
     tic4x_expression_abs (input_line_pointer, &value);
   if (*input_line_pointer++ != ',')
     {
-      as_bad ("Symbol missing\n");
+      as_bad (_("Symbol missing\n"));
       return;
     }
-  name = input_line_pointer;
-  c = get_symbol_end ();       /* Get terminator.  */
-  demand_empty_rest_of_line ();
+  c = get_symbol_name (&name); /* Get terminator.  */
   tic4x_insert_sym (name, value);
+  (void) restore_line_pointer (c);
+  demand_empty_rest_of_line ();
 }
 
 /* Reset local labels.  */
-static void 
-tic4x_newblock (x)
-     int x ATTRIBUTE_UNUSED;
+static void
+tic4x_newblock (int x ATTRIBUTE_UNUSED)
 {
   dollar_label_clear ();
 }
 
 /* .sect "section-name" [, value] */
 /* .sect ["]section-name[:subsection-name]["] [, value] */
-static void 
-tic4x_sect (x)
-     int x ATTRIBUTE_UNUSED;
+static void
+tic4x_sect (int x ATTRIBUTE_UNUSED)
 {
   char c;
   char *section_name;
-  char *subsection_name;
   char *name;
   segT seg;
   offsetT num;
@@ -1060,11 +951,11 @@ tic4x_sect (x)
   SKIP_WHITESPACE ();
   if (*input_line_pointer == '"')
     input_line_pointer++;
-  section_name = input_line_pointer;
-  c = get_symbol_end ();       /* Get terminator.  */
+  c = get_symbol_name (&section_name); /* Get terminator.  */
+  if (c == '"')
+    c = * ++ input_line_pointer;
   input_line_pointer++;                /* Skip null symbol terminator.  */
-  name = xmalloc (input_line_pointer - section_name + 1);
-  strcpy (name, section_name);
+  name = xstrdup (section_name);
 
   /* TI C from version 5.0 allows a section name to contain a
      subsection name as well. The subsection name is separated by a
@@ -1073,14 +964,16 @@ tic4x_sect (x)
      Volker Kuhlmann  <v.kuhlmann@elec.canterbury.ac.nz>.  */
   if (c == ':')
     {
-      subsection_name = input_line_pointer;
-      c = get_symbol_end ();   /* Get terminator.  */
+      char *subname;
+      c = get_symbol_name (&subname);  /* Get terminator.  */
+      if (c == '"')
+       c = * ++ input_line_pointer;
       input_line_pointer++;    /* Skip null symbol terminator.  */
-      as_warn (".sect: subsection name ignored");
+      as_warn (_(".sect: subsection name ignored"));
     }
 
   /* We might still have a '"' to discard, but the character after a
-     symbol name will be overwritten with a \0 by get_symbol_end()
+     symbol name will be overwritten with a \0 by get_symbol_name()
      [VK].  */
 
   if (c == ',')
@@ -1101,14 +994,14 @@ tic4x_sect (x)
       symbol_set_frag (line_label, frag_now);
     }
 
-  if (bfd_get_section_flags (stdoutput, seg) == SEC_NO_FLAGS)
+  if (bfd_section_flags (seg) == SEC_NO_FLAGS)
     {
-      if (!bfd_set_section_flags (stdoutput, seg, SEC_DATA))
-       as_warn ("Error setting flags for \"%s\": %s", name,
+      if (!bfd_set_section_flags (seg, SEC_DATA))
+       as_warn (_("Error setting flags for \"%s\": %s"), name,
                 bfd_errmsg (bfd_get_error ()));
     }
 
-  /* If the last character overwritten by get_symbol_end() was an
+  /* If the last character overwritten by get_symbol_name() was an
      end-of-line, we must restore it or the end of the line will not be
      recognised and scanning extends into the next line, stopping with
      an error (blame Volker Kuhlmann <v.kuhlmann@elec.canterbury.ac.nz>
@@ -1120,9 +1013,8 @@ tic4x_sect (x)
 }
 
 /* symbol[:] .set value  or  .set symbol, value */
-static void 
-tic4x_set (x)
-     int x ATTRIBUTE_UNUSED;
+static void
+tic4x_set (int x ATTRIBUTE_UNUSED)
 {
   symbolS *symbolP;
 
@@ -1132,11 +1024,12 @@ tic4x_set (x)
       char c;
       char *name;
 
-      name = input_line_pointer;
-      c = get_symbol_end ();   /* Get terminator.  */
+      c = get_symbol_name (&name);     /* Get terminator.  */
+      if (c == '"')
+       c = * ++ input_line_pointer;
       if (c != ',')
        {
-         as_bad (".set syntax invalid\n");
+         as_bad (_(".set syntax invalid\n"));
          ignore_rest_of_line ();
          return;
        }
@@ -1151,9 +1044,8 @@ tic4x_set (x)
 }
 
 /* [symbol] .usect ["]section-name["], size-in-words [, alignment-flag] */
-static void 
-tic4x_usect (x)
-     int x ATTRIBUTE_UNUSED;
+static void
+tic4x_usect (int x ATTRIBUTE_UNUSED)
 {
   char c;
   char *name;
@@ -1169,11 +1061,11 @@ tic4x_usect (x)
   SKIP_WHITESPACE ();
   if (*input_line_pointer == '"')
     input_line_pointer++;
-  section_name = input_line_pointer;
-  c = get_symbol_end ();       /* Get terminator.  */
+  c = get_symbol_name (&section_name); /* Get terminator.  */
+  if (c == '"')
+    c = * ++ input_line_pointer;
   input_line_pointer++;                /* Skip null symbol terminator.  */
-  name = xmalloc (input_line_pointer - section_name + 1);
-  strcpy (name, section_name);
+  name = xstrdup (section_name);
 
   if (c == ',')
     input_line_pointer =
@@ -1195,7 +1087,7 @@ tic4x_usect (x)
   else
     alignment_flag = 0;
   if (alignment_flag)
-    as_warn (".usect: non-zero alignment flag ignored");
+    as_warn (_(".usect: non-zero alignment flag ignored"));
 
   seg = subseg_new (name, 0);
   if (line_label != NULL)
@@ -1205,8 +1097,8 @@ tic4x_usect (x)
       S_SET_VALUE (line_label, frag_now_fix ());
     }
   seg_info (seg)->bss = 1;     /* Uninitialised data.  */
-  if (!bfd_set_section_flags (stdoutput, seg, SEC_ALLOC))
-    as_warn ("Error setting flags for \"%s\": %s", name,
+  if (!bfd_set_section_flags (seg, SEC_ALLOC))
+    as_warn (_("Error setting flags for \"%s\": %s"), name,
             bfd_errmsg (bfd_get_error ()));
   tic4x_seg_alloc (name, seg, size, line_label);
 
@@ -1218,26 +1110,25 @@ tic4x_usect (x)
 }
 
 /* .version cpu-version.  */
-static void 
-tic4x_version (x)
-     int x ATTRIBUTE_UNUSED;
+static void
+tic4x_version (int x ATTRIBUTE_UNUSED)
 {
   offsetT temp;
 
   input_line_pointer =
     tic4x_expression_abs (input_line_pointer, &temp);
   if (!IS_CPU_TIC3X (temp) && !IS_CPU_TIC4X (temp))
-    as_bad ("This assembler does not support processor generation %ld",
+    as_bad (_("This assembler does not support processor generation %ld"),
            (long) temp);
 
   if (tic4x_cpu && temp != (offsetT) tic4x_cpu)
-    as_warn ("Changing processor generation on fly not supported...");
+    as_warn (_("Changing processor generation on fly not supported..."));
   tic4x_cpu = temp;
   demand_empty_rest_of_line ();
 }
 
-static void 
-tic4x_init_regtable ()
+static void
+tic4x_init_regtable (void)
 {
   unsigned int i;
 
@@ -1254,8 +1145,8 @@ tic4x_init_regtable ()
     }
 }
 
-static void 
-tic4x_init_symbols ()
+static void
+tic4x_init_symbols (void)
 {
   /* The TI tools accept case insensitive versions of these symbols,
      we don't !
@@ -1285,7 +1176,7 @@ tic4x_init_symbols ()
      Source: TI: TMS320C3x/C4x Assembly Language Tools User's Guide,
      1997, SPRU035C, p. 3-17/3-18.  */
   tic4x_insert_sym (".REGPARM", tic4x_reg_args);
-  tic4x_insert_sym (".MEMPARM", !tic4x_reg_args);      
+  tic4x_insert_sym (".MEMPARM", !tic4x_reg_args);
   tic4x_insert_sym (".BIGMODEL", tic4x_big_model);
   tic4x_insert_sym (".C30INTERRUPT", 0);
   tic4x_insert_sym (".TMS320xx", tic4x_cpu == 0 ? 40 : tic4x_cpu);
@@ -1311,74 +1202,64 @@ tic4x_init_symbols ()
 }
 
 /* Insert a new instruction template into hash table.  */
-static int 
+static void
 tic4x_inst_insert (const tic4x_inst_t *inst)
 {
   static char prev_name[16];
-  const char *retval = NULL;
 
   /* Only insert the first name if have several similar entries.  */
   if (!strcmp (inst->name, prev_name) || inst->name[0] == '\0')
-    return 1;
+    return;
 
-  retval = hash_insert (tic4x_op_hash, inst->name, (PTR) inst);
-  if (retval != NULL)
-    fprintf (stderr, "internal error: can't hash `%s': %s\n",
-            inst->name, retval);
-  else
-    strcpy (prev_name, inst->name);
-  return retval == NULL;
+  if (str_hash_insert (tic4x_op_hash, inst->name, inst, 0) != NULL)
+    as_fatal (_("duplicate %s"), inst->name);
+
+  strcpy (prev_name, inst->name);
 }
 
 /* Make a new instruction template.  */
 static tic4x_inst_t *
-tic4x_inst_make (name, opcode, args)
-     char *name;
-     unsigned long opcode;
-     char *args;
+tic4x_inst_make (const char *name, unsigned long opcode, const char *args)
 {
   static tic4x_inst_t *insts = NULL;
   static char *names = NULL;
-  static int index = 0;
+  static int iindex = 0;
 
   if (insts == NULL)
     {
       /* Allocate memory to store name strings.  */
-      names = (char *) xmalloc (sizeof (char) * 8192);
+      names = XNEWVEC (char, 8192);
       /* Allocate memory for additional insts.  */
-      insts = (tic4x_inst_t *)
-       xmalloc (sizeof (tic4x_inst_t) * 1024);
+      insts = XNEWVEC (tic4x_inst_t, 1024);
     }
-  insts[index].name = names;
-  insts[index].opcode = opcode;
-  insts[index].opmask = 0xffffffff;
-  insts[index].args = args;
-  index++;
+  insts[iindex].name = names;
+  insts[iindex].opcode = opcode;
+  insts[iindex].opmask = 0xffffffff;
+  insts[iindex].args = args;
+  iindex++;
 
-  do
+  while (*name)
     *names++ = *name++;
-  while (*name);
   *names++ = '\0';
 
-  return &insts[index - 1];
+  return &insts[iindex - 1];
 }
 
 /* Add instruction template, creating dynamic templates as required.  */
-static int 
+static void
 tic4x_inst_add (const tic4x_inst_t *insts)
 {
-  char *s = insts->name;
+  const char *s = insts->name;
   char *d;
   unsigned int i;
-  int ok = 1;
   char name[16];
 
   d = name;
 
   /* We do not care about INSNs that is not a part of our
-     oplevel setting */
-  if (!insts->oplevel & tic4x_oplevel)
-    return ok;
+     oplevel setting */
+  if ((insts->oplevel & tic4x_oplevel) == 0)
+    return;
 
   while (1)
     {
@@ -1391,7 +1272,7 @@ tic4x_inst_add (const tic4x_inst_t *insts)
            {
              tic4x_inst_t *inst;
              int k = 0;
-             char *c = tic4x_conds[i].name;
+             const char *c = tic4x_conds[i].name;
              char *e = d;
 
              while (*c)
@@ -1402,8 +1283,8 @@ tic4x_inst_add (const tic4x_inst_t *insts)
              *e = '\0';
 
              /* If instruction found then have already processed it.  */
-             if (hash_find (tic4x_op_hash, name))
-               return 1;
+             if (str_hash_find (tic4x_op_hash, name))
+               return;
 
              do
                {
@@ -1412,18 +1293,17 @@ tic4x_inst_add (const tic4x_inst_t *insts)
                                         (*s == 'B' ? 16 : 23)),
                                        insts[k].args);
                  if (k == 0)   /* Save strcmp() with following func.  */
-                   ok &= tic4x_inst_insert (inst);
+                   tic4x_inst_insert (inst);
                  k++;
                }
              while (!strcmp (insts->name,
                              insts[k].name));
            }
-         return ok;
-         break;
+         return;
 
        case '\0':
-         return tic4x_inst_insert (insts);
-         break;
+         tic4x_inst_insert (insts);
+         return;
 
        default:
          *d++ = *s++;
@@ -1435,10 +1315,9 @@ tic4x_inst_add (const tic4x_inst_t *insts)
 /* This function is called once, at assembler startup time.  It should
    set up all the tables, etc., that the MD part of the assembler will
    need.  */
-void 
-md_begin ()
+void
+md_begin (void)
 {
-  int ok = 1;
   unsigned int i;
 
   /* Setup the proper opcode level according to the
@@ -1470,21 +1349,18 @@ md_begin ()
     tic4x_oplevel |= OP_IDLE2;
 
   /* Create hash table for mnemonics.  */
-  tic4x_op_hash = hash_new ();
+  tic4x_op_hash = str_htab_create ();
 
   /* Create hash table for asg pseudo.  */
-  tic4x_asg_hash = hash_new ();
+  tic4x_asg_hash = str_htab_create ();
 
   /* Add mnemonics to hash table, expanding conditional mnemonics on fly.  */
   for (i = 0; i < tic4x_num_insts; i++)
-    ok &= tic4x_inst_add (tic4x_insts + i);
+    tic4x_inst_add (tic4x_insts + i);
 
   /* Create dummy inst to avoid errors accessing end of table.  */
   tic4x_inst_make ("", 0, "");
 
-  if (!ok)
-    as_fatal ("Broken assembler.  No assembly attempted.");
-
   /* Add registers to symbol table.  */
   tic4x_init_regtable ();
 
@@ -1492,19 +1368,18 @@ md_begin ()
   tic4x_init_symbols ();
 }
 
-void 
-tic4x_end ()
+void
+tic4x_end (void)
 {
-  bfd_set_arch_mach (stdoutput, bfd_arch_tic4x, 
+  bfd_set_arch_mach (stdoutput, bfd_arch_tic4x,
                     IS_CPU_TIC4X (tic4x_cpu) ? bfd_mach_tic4x : bfd_mach_tic3x);
 }
 
-static int 
-tic4x_indirect_parse (operand, indirect)
-     tic4x_operand_t *operand;
-     const tic4x_indirect_t *indirect;
+static int
+tic4x_indirect_parse (tic4x_operand_t *operand,
+                     const tic4x_indirect_t *indirect)
 {
-  char *n = indirect->name;
+  const char *n = indirect->name;
   char *s = input_line_pointer;
   char *b;
   symbolS *symbolP;
@@ -1534,7 +1409,7 @@ tic4x_indirect_parse (operand, indirect)
          if (operand->aregno >= REG_AR0 && operand->aregno <= REG_AR7)
            break;
 
-         as_bad ("Auxiliary register AR0--AR7 required for indirect");
+         as_bad (_("Auxiliary register AR0--AR7 required for indirect"));
          return -1;
 
        case 'd':               /* Need to match constant for disp.  */
@@ -1548,7 +1423,7 @@ tic4x_indirect_parse (operand, indirect)
          operand->disp = operand->expr.X_add_number;
          if (operand->disp < 0 || operand->disp > 255)
            {
-             as_bad ("Bad displacement %d (require 0--255)\n",
+             as_bad (_("Bad displacement %d (require 0--255)\n"),
                      operand->disp);
              return -1;
            }
@@ -1566,7 +1441,7 @@ tic4x_indirect_parse (operand, indirect)
          if (operand->expr.X_add_number != REG_IR0
              && operand->expr.X_add_number != REG_IR1)
            {
-             as_bad ("Index register IR0,IR1 required for displacement");
+             as_bad (_("Index register IR0,IR1 required for displacement"));
              return -1;
            }
 
@@ -1600,9 +1475,7 @@ tic4x_indirect_parse (operand, indirect)
 }
 
 static char *
-tic4x_operand_parse (s, operand)
-     char *s;
-     tic4x_operand_t *operand;
+tic4x_operand_parse (char *s, tic4x_operand_t *operand)
 {
   unsigned int i;
   char c;
@@ -1610,23 +1483,22 @@ tic4x_operand_parse (s, operand)
   expressionS *exp = &operand->expr;
   char *save = input_line_pointer;
   char *str;
-  char *new;
+  char *new_pointer;
   struct hash_entry *entry = NULL;
 
   input_line_pointer = s;
   SKIP_WHITESPACE ();
 
-  str = input_line_pointer;
-  c = get_symbol_end ();       /* Get terminator.  */
-  new = input_line_pointer;
-  if (strlen (str) && (entry = hash_find (tic4x_asg_hash, str)) != NULL)
+  c = get_symbol_name (&str);  /* Get terminator.  */
+  new_pointer = input_line_pointer;
+  if (strlen (str) && (entry = str_hash_find (tic4x_asg_hash, str)) != NULL)
     {
-      *input_line_pointer = c;
+      (void) restore_line_pointer (c);
       input_line_pointer = (char *) entry;
     }
   else
     {
-      *input_line_pointer = c;
+      (void) restore_line_pointer (c);
       input_line_pointer = str;
     }
 
@@ -1637,7 +1509,7 @@ tic4x_operand_parse (s, operand)
     case '%':
       input_line_pointer = tic4x_expression (++input_line_pointer, exp);
       if (exp->X_op != O_register)
-       as_bad ("Expecting a register name");
+       as_bad (_("Expecting a register name"));
       operand->mode = M_REGISTER;
       break;
 
@@ -1649,7 +1521,7 @@ tic4x_operand_parse (s, operand)
       else if (exp->X_op == O_big)
        {
          if (exp->X_add_number)
-           as_bad ("Number too large");        /* bignum required */
+           as_bad (_("Number too large"));     /* bignum required */
          else
            {
              tic4x_gen_to_words (generic_floating_point_number,
@@ -1660,10 +1532,10 @@ tic4x_operand_parse (s, operand)
       /* Allow ori ^foo, ar0 to be equivalent to ldi .hi.foo, ar0  */
       /* WARNING : The TI C40 assembler cannot do this.  */
       else if (exp->X_op == O_symbol)
-       {
-         operand->mode = M_HI;
-         break;
-       }
+       operand->mode = M_HI;
+      else
+       as_bad (_("Expecting a constant value"));
+      break;
 
     case '#':
       input_line_pointer = tic4x_expression (++input_line_pointer, exp);
@@ -1672,7 +1544,7 @@ tic4x_operand_parse (s, operand)
       else if (exp->X_op == O_big)
        {
          if (exp->X_add_number > 0)
-           as_bad ("Number too large");        /* bignum required.  */
+           as_bad (_("Number too large"));     /* bignum required.  */
          else
            {
              tic4x_gen_to_words (generic_floating_point_number,
@@ -1683,24 +1555,21 @@ tic4x_operand_parse (s, operand)
       /* Allow ori foo, ar0 to be equivalent to ldi .lo.foo, ar0  */
       /* WARNING : The TI C40 assembler cannot do this.  */
       else if (exp->X_op == O_symbol)
-       {
-         operand->mode = M_IMMED;
-         break;
-       }
-
+       operand->mode = M_IMMED;
       else
-       as_bad ("Expecting a constant value");
+       as_bad (_("Expecting a constant value"));
       break;
+
     case '\\':
 #endif
     case '@':
       input_line_pointer = tic4x_expression (++input_line_pointer, exp);
       if (exp->X_op != O_constant && exp->X_op != O_symbol)
-       as_bad ("Bad direct addressing construct %s", s);
+       as_bad (_("Bad direct addressing construct %s"), s);
       if (exp->X_op == O_constant)
        {
          if (exp->X_add_number < 0)
-           as_bad ("Direct value of %ld is not suitable",
+           as_bad (_("Direct value of %ld is not suitable"),
                    (long) exp->X_add_number);
        }
       operand->mode = M_DIRECT;
@@ -1724,7 +1593,7 @@ tic4x_operand_parse (s, operand)
            operand->expr.X_add_number = 0x18;
        }
       else
-       as_bad ("Unknown indirect addressing mode");
+       as_bad (_("Unknown indirect addressing mode"));
       break;
 
     default:
@@ -1741,7 +1610,7 @@ tic4x_operand_parse (s, operand)
       else if (exp->X_op == O_big)
        {
          if (exp->X_add_number > 0)
-           as_bad ("Number too large");        /* bignum required.  */
+           as_bad (_("Number too large"));     /* bignum required.  */
          else
            {
              tic4x_gen_to_words (generic_floating_point_number,
@@ -1760,21 +1629,18 @@ tic4x_operand_parse (s, operand)
 #endif
     }
   if (entry == NULL)
-    new = input_line_pointer;
+    new_pointer = input_line_pointer;
   input_line_pointer = save;
-  return new;
+  return new_pointer;
 }
 
-static int 
-tic4x_operands_match (inst, insn, check)
-     tic4x_inst_t *inst;
-     tic4x_insn_t *insn;
-     int check;
+static int
+tic4x_operands_match (tic4x_inst_t *inst, tic4x_insn_t *tinsn, int check)
 {
   const char *args = inst->args;
   unsigned long opcode = inst->opcode;
-  int num_operands = insn->num_operands;
-  tic4x_operand_t *operand = insn->operands;
+  int num_operands = tinsn->num_operands;
+  tic4x_operand_t *operand = tinsn->operands;
   expressionS *exp = &operand->expr;
   int ret = 1;
   int reg;
@@ -1785,13 +1651,13 @@ tic4x_operands_match (inst, insn, check)
      If an operand matches, we modify insn or opcode appropriately,
      and do a "continue".  If an operand fails to match, we "break".  */
 
-  insn->nchars = 4;            /* Instructions always 4 bytes.  */
-  insn->reloc = NO_RELOC;
-  insn->pcrel = 0;
+  tinsn->nchars = 4;           /* Instructions always 4 bytes.  */
+  tinsn->reloc = NO_RELOC;
+  tinsn->pcrel = 0;
 
   if (*args == '\0')
     {
-      insn->opcode = opcode;
+      tinsn->opcode = opcode;
       return num_operands == 0;
     }
 
@@ -1803,7 +1669,7 @@ tic4x_operands_match (inst, insn, check)
        case '\0':              /* End of args.  */
          if (num_operands == 1)
            {
-             insn->opcode = opcode;
+             tinsn->opcode = opcode;
              return ret;
            }
          break;                /* Too many operands.  */
@@ -1824,7 +1690,7 @@ tic4x_operands_match (inst, insn, check)
               else
                 {
                  if (!check)
-                    as_bad ("Immediate value of %ld is too large for ldf",
+                    as_bad (_("Immediate value of %ld is too large for ldf"),
                             (long) exp->X_add_number);
                  ret = -1;
                  continue;
@@ -1832,8 +1698,8 @@ tic4x_operands_match (inst, insn, check)
            }
          else if (exp->X_op == O_symbol)
            {
-             insn->reloc = BFD_RELOC_HI16;
-             insn->exp = *exp;
+             tinsn->reloc = BFD_RELOC_HI16;
+             tinsn->exp = *exp;
              continue;
            }
          break;                /* Not direct (dp) addressing.  */
@@ -1849,8 +1715,8 @@ tic4x_operands_match (inst, insn, check)
            }
          else if (exp->X_op == O_symbol)
            {
-             insn->reloc = BFD_RELOC_LO16;
-             insn->exp = *exp;
+             tinsn->reloc = BFD_RELOC_LO16;
+             tinsn->exp = *exp;
              continue;
            }
          break;                /* Not direct addressing.  */
@@ -1864,7 +1730,7 @@ tic4x_operands_match (inst, insn, check)
          else
            {
               if (!check)
-                as_bad ("Destination register must be ARn");
+                as_bad (_("Destination register must be ARn"));
              ret = -1;
            }
          continue;
@@ -1883,7 +1749,7 @@ tic4x_operands_match (inst, insn, check)
              else
                {
                  if (!check)
-                    as_bad ("Immediate value of %ld is too large",
+                    as_bad (_("Immediate value of %ld is too large"),
                             (long) exp->X_add_number);
                  ret = -1;
                  continue;
@@ -1891,15 +1757,15 @@ tic4x_operands_match (inst, insn, check)
            }
          if (IS_CPU_TIC4X (tic4x_cpu))
            {
-             insn->reloc = BFD_RELOC_24_PCREL;
-             insn->pcrel = 1;
+             tinsn->reloc = BFD_RELOC_24_PCREL;
+             tinsn->pcrel = 1;
            }
          else
            {
-             insn->reloc = BFD_RELOC_24;
-             insn->pcrel = 0;
+             tinsn->reloc = BFD_RELOC_24;
+             tinsn->pcrel = 0;
            }
-         insn->exp = *exp;
+         tinsn->exp = *exp;
          continue;
 
        case 'C':
@@ -1912,7 +1778,7 @@ tic4x_operands_match (inst, insn, check)
              && operand->expr.X_add_number != 0x18)
            {
               if (!check)
-                as_bad ("Invalid indirect addressing mode");
+                as_bad (_("Invalid indirect addressing mode"));
               ret = -1;
              continue;
            }
@@ -1930,13 +1796,13 @@ tic4x_operands_match (inst, insn, check)
           if (!(operand->mode == M_REGISTER))
             break;
          reg = exp->X_add_number;
-         if ( (reg >= REG_R0 && reg <= REG_R7) 
+         if ( (reg >= REG_R0 && reg <= REG_R7)
                || (IS_CPU_TIC4X (tic4x_cpu) && reg >= REG_R8 && reg <= REG_R11) )
            INSERTU (opcode, reg, 7, 0);
          else
            {
               if (!check)
-                as_bad ("Register must be Rn");
+                as_bad (_("Register must be Rn"));
              ret = -1;
            }
           continue;
@@ -1970,13 +1836,13 @@ tic4x_operands_match (inst, insn, check)
          if (operand->mode != M_REGISTER)
            break;
          reg = exp->X_add_number;
-         if ( (reg >= REG_R0 && reg <= REG_R7) 
+         if ( (reg >= REG_R0 && reg <= REG_R7)
                || (IS_CPU_TIC4X (tic4x_cpu) && reg >= REG_R8 && reg <= REG_R11) )
            INSERTU (opcode, reg, 15, 8);
          else
            {
               if (!check)
-                as_bad ("Register must be Rn");
+                as_bad (_("Register must be Rn"));
              ret = -1;
            }
           continue;
@@ -1990,7 +1856,7 @@ tic4x_operands_match (inst, insn, check)
          else
            {
               if (!check)
-                as_bad ("Register must be R0--R7");
+                as_bad (_("Register must be R0--R7"));
              ret = -1;
            }
          continue;
@@ -2014,7 +1880,7 @@ tic4x_operands_match (inst, insn, check)
              if (IS_CPU_TIC4X (tic4x_cpu))
                break;
               if (!check)
-                as_bad ("Invalid indirect addressing mode displacement %d",
+                as_bad (_("Invalid indirect addressing mode displacement %d"),
                         operand->disp);
              ret = -1;
              continue;
@@ -2042,7 +1908,7 @@ tic4x_operands_match (inst, insn, check)
              if (IS_CPU_TIC4X (tic4x_cpu))
                break;
               if (!check)
-                as_bad ("Invalid indirect addressing mode displacement %d",
+                as_bad (_("Invalid indirect addressing mode displacement %d"),
                         operand->disp);
              ret = -1;
              continue;
@@ -2060,7 +1926,7 @@ tic4x_operands_match (inst, insn, check)
          else
            {
               if (!check)
-                as_bad ("Register must be R0--R7");
+                as_bad (_("Register must be R0--R7"));
              ret = -1;
            }
          continue;
@@ -2074,7 +1940,7 @@ tic4x_operands_match (inst, insn, check)
          else
            {
               if (!check)
-                as_bad ("Register must be R0--R7");
+                as_bad (_("Register must be R0--R7"));
              ret = -1;
            }
          continue;
@@ -2088,7 +1954,7 @@ tic4x_operands_match (inst, insn, check)
          else
            {
               if (!check)
-                as_bad ("Destination register must be R2 or R3");
+                as_bad (_("Destination register must be R2 or R3"));
              ret = -1;
            }
          continue;
@@ -2102,7 +1968,7 @@ tic4x_operands_match (inst, insn, check)
          else
            {
               if (!check)
-                as_bad ("Destination register must be R0 or R1");
+                as_bad (_("Destination register must be R0 or R1"));
              ret = -1;
            }
          continue;
@@ -2117,7 +1983,7 @@ tic4x_operands_match (inst, insn, check)
              && operand->expr.X_add_number != 0x18)
            {
               if (!check)
-                as_bad ("Invalid indirect addressing mode");
+                as_bad (_("Invalid indirect addressing mode"));
              ret = -1;
              continue;
            }
@@ -2139,15 +2005,15 @@ tic4x_operands_match (inst, insn, check)
              else
                {
                   if (!check)
-                    as_bad ("Displacement value of %ld is too large",
+                    as_bad (_("Displacement value of %ld is too large"),
                             (long) exp->X_add_number);
                  ret = -1;
                  continue;
                }
            }
-         insn->reloc = BFD_RELOC_16_PCREL;
-         insn->pcrel = 1;
-         insn->exp = *exp;
+         tinsn->reloc = BFD_RELOC_16_PCREL;
+         tinsn->pcrel = 1;
+         tinsn->exp = *exp;
          continue;
 
        case 'Q':
@@ -2161,13 +2027,13 @@ tic4x_operands_match (inst, insn, check)
          if (operand->mode != M_REGISTER)
            break;
          reg = exp->X_add_number;
-         if ( (reg >= REG_R0 && reg <= REG_R7) 
+         if ( (reg >= REG_R0 && reg <= REG_R7)
                || (IS_CPU_TIC4X (tic4x_cpu) && reg >= REG_R8 && reg <= REG_R11) )
            INSERTU (opcode, reg, 15, 0);
          else
            {
               if (!check)
-                as_bad ("Register must be Rn");
+                as_bad (_("Register must be Rn"));
              ret = -1;
            }
           continue;
@@ -2183,13 +2049,13 @@ tic4x_operands_match (inst, insn, check)
          if (operand->mode != M_REGISTER)
            break;
          reg = exp->X_add_number;
-         if ( (reg >= REG_R0 && reg <= REG_R7) 
+         if ( (reg >= REG_R0 && reg <= REG_R7)
                || (IS_CPU_TIC4X (tic4x_cpu) && reg >= REG_R8 && reg <= REG_R11) )
            INSERTU (opcode, reg, 20, 16);
          else
            {
               if (!check)
-                as_bad ("Register must be Rn");
+                as_bad (_("Register must be Rn"));
              ret = -1;
            }
           continue;
@@ -2200,7 +2066,7 @@ tic4x_operands_match (inst, insn, check)
          if (exp->X_op == O_big)
            {
               if (!check)
-                as_bad ("Floating point number not valid in expression");
+                as_bad (_("Floating point number not valid in expression"));
              ret = -1;
              continue;
            }
@@ -2214,7 +2080,7 @@ tic4x_operands_match (inst, insn, check)
              else
                {
                  if (!check)
-                    as_bad ("Signed immediate value %ld too large",
+                    as_bad (_("Signed immediate value %ld too large"),
                             (long) exp->X_add_number);
                  ret = -1;
                  continue;
@@ -2224,21 +2090,21 @@ tic4x_operands_match (inst, insn, check)
            {
              if (operand->mode == M_HI)
                {
-                 insn->reloc = BFD_RELOC_HI16;
+                 tinsn->reloc = BFD_RELOC_HI16;
                }
              else
                {
-                 insn->reloc = BFD_RELOC_LO16;
+                 tinsn->reloc = BFD_RELOC_LO16;
                }
-             insn->exp = *exp;
+             tinsn->exp = *exp;
              continue;
            }
          /* Handle cases like ldi foo - $, ar0  where foo
             is a forward reference.  Perhaps we should check
             for X_op == O_symbol and disallow things like
             ldi foo, ar0.  */
-         insn->reloc = BFD_RELOC_16;
-         insn->exp = *exp;
+         tinsn->reloc = BFD_RELOC_16;
+         tinsn->exp = *exp;
          continue;
 
        case 'T':               /* 5-bit immediate value for tic4x stik.  */
@@ -2256,7 +2122,7 @@ tic4x_operands_match (inst, insn, check)
              else
                {
                   if (!check)
-                    as_bad ("Immediate value of %ld is too large",
+                    as_bad (_("Immediate value of %ld is too large"),
                             (long) exp->X_add_number);
                  ret = -1;
                  continue;
@@ -2277,7 +2143,7 @@ tic4x_operands_match (inst, insn, check)
              else
                {
                   if (!check)
-                    as_bad ("Unsigned immediate value %ld too large",
+                    as_bad (_("Unsigned immediate value %ld too large"),
                             (long) exp->X_add_number);
                  ret = -1;
                  continue;
@@ -2286,15 +2152,15 @@ tic4x_operands_match (inst, insn, check)
          else if (exp->X_op == O_symbol)
            {
              if (operand->mode == M_HI)
-               insn->reloc = BFD_RELOC_HI16;
+               tinsn->reloc = BFD_RELOC_HI16;
              else
-               insn->reloc = BFD_RELOC_LO16;
+               tinsn->reloc = BFD_RELOC_LO16;
 
-             insn->exp = *exp;
+             tinsn->exp = *exp;
              continue;
            }
-         insn->reloc = BFD_RELOC_16;
-         insn->exp = *exp;
+         tinsn->reloc = BFD_RELOC_16;
+         tinsn->exp = *exp;
          continue;
 
        case 'V':               /* Trap numbers (immediate field).  */
@@ -2309,13 +2175,13 @@ tic4x_operands_match (inst, insn, check)
                }
              else if (exp->X_add_number < 32 && IS_CPU_TIC3X (tic4x_cpu))
                {
-                 INSERTU (opcode, exp->X_add_number | 0x20, 4, 0);
+                 INSERTU (opcode, exp->X_add_number | 0x20, 5, 0);
                  continue;
                }
              else
                {
                   if (!check)
-                    as_bad ("Immediate value of %ld is too large",
+                    as_bad (_("Immediate value of %ld is too large"),
                             (long) exp->X_add_number);
                  ret = -1;
                  continue;
@@ -2331,7 +2197,7 @@ tic4x_operands_match (inst, insn, check)
          if (exp->X_op == O_big)
            {
               if (!check)
-                as_bad ("Floating point number not valid in expression");
+                as_bad (_("Floating point number not valid in expression"));
              ret = -1;
              continue;
            }
@@ -2345,14 +2211,14 @@ tic4x_operands_match (inst, insn, check)
              else
                {
                   if (!check)
-                    as_bad ("Immediate value %ld too large",
+                    as_bad (_("Immediate value %ld too large"),
                             (long) exp->X_add_number);
                  ret = -1;
                  continue;
                }
            }
-         insn->reloc = BFD_RELOC_16;
-         insn->exp = *exp;
+         tinsn->reloc = BFD_RELOC_16;
+         tinsn->exp = *exp;
          continue;
 
        case 'X':               /* Expansion register for tic4x.  */
@@ -2364,7 +2230,7 @@ tic4x_operands_match (inst, insn, check)
          else
            {
               if (!check)
-                as_bad ("Register must be ivtp or tvtp");
+                as_bad (_("Register must be ivtp or tvtp"));
              ret = -1;
            }
          continue;
@@ -2378,7 +2244,7 @@ tic4x_operands_match (inst, insn, check)
          else
            {
               if (!check)
-                as_bad ("Register must be address register");
+                as_bad (_("Register must be address register"));
              ret = -1;
            }
          continue;
@@ -2392,7 +2258,7 @@ tic4x_operands_match (inst, insn, check)
          else
            {
               if (!check)
-                as_bad ("Register must be ivtp or tvtp");
+                as_bad (_("Register must be ivtp or tvtp"));
              ret = -1;
            }
          continue;
@@ -2406,7 +2272,7 @@ tic4x_operands_match (inst, insn, check)
          continue;
 
        case '|':               /* treat as `,' if have ldi_ldi form.  */
-         if (insn->parallel)
+         if (tinsn->parallel)
            {
              if (--num_operands < 0)
                break;          /* Too few operands.  */
@@ -2440,68 +2306,63 @@ tic4x_operands_match (inst, insn, check)
 }
 
 static void
-tic4x_insn_check (insn)
-     tic4x_insn_t *insn;
+tic4x_insn_check (tic4x_insn_t *tinsn)
 {
-  
-  if (!strcmp(insn->name, "lda"))
+
+  if (!strcmp (tinsn->name, "lda"))
     {
-      if (insn->num_operands < 2 || insn->num_operands > 2)
+      if (tinsn->num_operands < 2 || tinsn->num_operands > 2)
         as_fatal ("Illegal internal LDA insn definition");
 
-      if ( insn->operands[0].mode == M_REGISTER
-           && insn->operands[1].mode == M_REGISTER
-           && insn->operands[0].expr.X_add_number == insn->operands[1].expr.X_add_number )
-        as_bad ("Source and destination register should not be equal");
+      if (tinsn->operands[0].mode == M_REGISTER
+         && tinsn->operands[1].mode == M_REGISTER
+         && tinsn->operands[0].expr.X_add_number == tinsn->operands[1].expr.X_add_number )
+        as_bad (_("Source and destination register should not be equal"));
     }
-  else if( !strcmp(insn->name, "ldi_ldi")
-           || !strcmp(insn->name, "ldi1_ldi2")
-           || !strcmp(insn->name, "ldi2_ldi1")
-           || !strcmp(insn->name, "ldf_ldf")
-           || !strcmp(insn->name, "ldf1_ldf2")
-           || !strcmp(insn->name, "ldf2_ldf1") )
+  else if (!strcmp (tinsn->name, "ldi_ldi")
+           || !strcmp (tinsn->name, "ldi1_ldi2")
+           || !strcmp (tinsn->name, "ldi2_ldi1")
+           || !strcmp (tinsn->name, "ldf_ldf")
+           || !strcmp (tinsn->name, "ldf1_ldf2")
+           || !strcmp (tinsn->name, "ldf2_ldf1") )
     {
-      if ( insn->num_operands < 4 && insn->num_operands > 5 )
-        as_fatal ("Illegal internal %s insn definition", insn->name);
-      
-      if ( insn->operands[1].mode == M_REGISTER
-           && insn->operands[insn->num_operands-1].mode == M_REGISTER
-           && insn->operands[1].expr.X_add_number == insn->operands[insn->num_operands-1].expr.X_add_number )
-        as_warn ("Equal parallell destination registers, one result will be discarded");
+      if (tinsn->num_operands < 4 || tinsn->num_operands > 5)
+        as_fatal ("Illegal internal %s insn definition", tinsn->name);
+
+      if (tinsn->operands[1].mode == M_REGISTER
+         && tinsn->operands[tinsn->num_operands-1].mode == M_REGISTER
+         && tinsn->operands[1].expr.X_add_number == tinsn->operands[tinsn->num_operands-1].expr.X_add_number )
+        as_warn (_("Equal parallel destination registers, one result will be discarded"));
     }
 }
 
-static void 
-tic4x_insn_output (insn)
-     tic4x_insn_t *insn;
+static void
+tic4x_insn_output (tic4x_insn_t *tinsn)
 {
   char *dst;
 
   /* Grab another fragment for opcode.  */
-  dst = frag_more (insn->nchars);
+  dst = frag_more (tinsn->nchars);
 
   /* Put out opcode word as a series of bytes in little endian order.  */
-  md_number_to_chars (dst, insn->opcode, insn->nchars);
+  md_number_to_chars (dst, tinsn->opcode, tinsn->nchars);
 
   /* Put out the symbol-dependent stuff.  */
-  if (insn->reloc != NO_RELOC)
+  if (tinsn->reloc != NO_RELOC)
     {
       /* Where is the offset into the fragment for this instruction.  */
       fix_new_exp (frag_now,
                   dst - frag_now->fr_literal,  /* where */
-                  insn->nchars,        /* size */
-                  &insn->exp,
-                  insn->pcrel,
-                  insn->reloc);
+                  tinsn->nchars,       /* size */
+                  &tinsn->exp,
+                  tinsn->pcrel,
+                  tinsn->reloc);
     }
 }
 
 /* Parse the operands.  */
-int 
-tic4x_operands_parse (s, operands, num_operands)
-     char *s;
-     tic4x_operand_t *operands;
-     int num_operands;
+static int
+tic4x_operands_parse (char *s, tic4x_operand_t *operands, int num_operands)
 {
   if (!*s)
     return num_operands;
@@ -2512,7 +2373,7 @@ tic4x_operands_parse (s, operands, num_operands)
 
   if (num_operands > TIC4X_OPERANDS_MAX)
     {
-      as_bad ("Too many operands scanned");
+      as_bad (_("Too many operands scanned"));
       return -1;
     }
   return num_operands;
@@ -2521,14 +2382,14 @@ tic4x_operands_parse (s, operands, num_operands)
 /* Assemble a single instruction.  Its label has already been handled
    by the generic front end.  We just parse mnemonic and operands, and
    produce the bytes of data and relocation.  */
-void 
-md_assemble (str)
-     char *str;
+void
+md_assemble (char *str)
 {
   int ok = 0;
   char *s;
   int i;
   int parsed = 0;
+  size_t len;
   tic4x_inst_t *inst;          /* Instruction template.  */
   tic4x_inst_t *first_inst;
 
@@ -2538,17 +2399,17 @@ md_assemble (str)
       s = str;
       while (*s && *s != '|')
         s++;
-      
+
       if (*s && s[1]=='|')
         {
           if(insn->parallel)
             {
-              as_bad ("Parallel opcode cannot contain more than two instructions");
+              as_bad (_("Parallel opcode cannot contain more than two instructions"));
               insn->parallel = 0;
               insn->in_use = 0;
               return;
             }
-          
+
           /* Lets take care of the first part of the parallel insn */
           *s++ = 0;
           md_assemble(str);
@@ -2557,7 +2418,7 @@ md_assemble (str)
           /* .. and let the second run though here */
         }
     }
-  
+
   if (str && insn->parallel)
     {
       /* Find mnemonic (second part of parallel instruction).  */
@@ -2565,10 +2426,10 @@ md_assemble (str)
       /* Skip past instruction mnemonic.  */
       while (*s && *s != ' ')
        s++;
-      if (*s)                  /* Null terminate for hash_find.  */
+      if (*s)                  /* Null terminate for str_hash_find.  */
        *s++ = '\0';            /* and skip past null.  */
-      strcat (insn->name, "_");
-      strncat (insn->name, str, TIC4X_NAME_MAX - strlen (insn->name));
+      len = strlen (insn->name);
+      snprintf (insn->name + len, TIC4X_NAME_MAX - len, "_%s", str);
 
       insn->operands[insn->num_operands++].mode = M_PARALLEL;
 
@@ -2586,9 +2447,9 @@ md_assemble (str)
   if (insn->in_use)
     {
       if ((insn->inst = (struct tic4x_inst *)
-          hash_find (tic4x_op_hash, insn->name)) == NULL)
+          str_hash_find (tic4x_op_hash, insn->name)) == NULL)
        {
-         as_bad ("Unknown opcode `%s'.", insn->name);
+         as_bad (_("Unknown opcode `%s'."), insn->name);
          insn->parallel = 0;
          insn->in_use = 0;
          return;
@@ -2605,7 +2466,8 @@ md_assemble (str)
                 first_inst = inst;
               ok = 0;
             }
-      } while (!ok && !strcmp (inst->name, inst[1].name) && inst++);
+       }
+      while (!ok && !strcmp (inst->name, inst[1].name) && inst++);
 
       if (ok > 0)
         {
@@ -2616,10 +2478,10 @@ md_assemble (str)
         {
           if (first_inst)
             tic4x_operands_match (first_inst, insn, 0);
-          as_bad ("Invalid operands for %s", insn->name);
+          as_bad (_("Invalid operands for %s"), insn->name);
         }
       else
-       as_bad ("Invalid instruction %s", insn->name);
+       as_bad (_("Invalid instruction %s"), insn->name);
     }
 
   if (str && !parsed)
@@ -2628,9 +2490,10 @@ md_assemble (str)
       s = str;
       while (*s && *s != ' ')  /* Skip past instruction mnemonic.  */
        s++;
-      if (*s)                  /* Null terminate for hash_find.  */
+      if (*s)                  /* Null terminate for str_hash_find.  */
        *s++ = '\0';            /* and skip past null.  */
-      strncpy (insn->name, str, TIC4X_NAME_MAX - 3);
+      strncpy (insn->name, str, TIC4X_NAME_MAX - 1);
+      insn->name[TIC4X_NAME_MAX - 1] = '\0';
 
       if ((i = tic4x_operands_parse (s, insn->operands, 0)) < 0)
        {
@@ -2648,7 +2511,7 @@ md_assemble (str)
 }
 
 void
-tic4x_cleanup ()
+tic4x_cleanup (void)
 {
   if (insn->in_use)
     md_assemble (NULL);
@@ -2659,7 +2522,7 @@ tic4x_cleanup ()
    of chars emitted is stored in *sizeP.  An error message is
    returned, or NULL on OK.  */
 
-char *
+const char *
 md_atof (int type, char *litP, int *sizeP)
 {
   int prec;
@@ -2732,11 +2595,8 @@ md_atof (int type, char *litP, int *sizeP)
   return NULL;
 }
 
-void 
-md_apply_fix (fixP, value, seg)
-     fixS *fixP;
-     valueT *value;
-     segT seg ATTRIBUTE_UNUSED;
+void
+md_apply_fix (fixS *fixP, valueT *value, segT seg ATTRIBUTE_UNUSED)
 {
   char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
   valueT val = *value;
@@ -2758,9 +2618,11 @@ md_apply_fix (fixP, value, seg)
     {
     case BFD_RELOC_32:
       buf[3] = val >> 24;
+      /* Fall through.  */
     case BFD_RELOC_24:
     case BFD_RELOC_24_PCREL:
       buf[2] = val >> 16;
+      /* Fall through.  */
     case BFD_RELOC_16:
     case BFD_RELOC_16_PCREL:
     case BFD_RELOC_LO16:
@@ -2771,7 +2633,7 @@ md_apply_fix (fixP, value, seg)
 
     case NO_RELOC:
     default:
-      as_bad ("Bad relocation type: 0x%02x", fixP->fx_r_type);
+      as_bad (_("Bad relocation type: 0x%02x"), fixP->fx_r_type);
       break;
     }
 
@@ -2779,44 +2641,40 @@ md_apply_fix (fixP, value, seg)
 }
 
 /* Should never be called for tic4x.  */
-void 
-md_convert_frag (headers, sec, fragP)
-     bfd *headers ATTRIBUTE_UNUSED;
-     segT sec ATTRIBUTE_UNUSED;
-     fragS *fragP ATTRIBUTE_UNUSED;
+void
+md_convert_frag (bfd *headers ATTRIBUTE_UNUSED,
+                segT sec ATTRIBUTE_UNUSED,
+                fragS *fragP ATTRIBUTE_UNUSED)
 {
   as_fatal ("md_convert_frag");
 }
 
 /* Should never be called for tic4x.  */
 void
-md_create_short_jump (ptr, from_addr, to_addr, frag, to_symbol)
-     char *ptr ATTRIBUTE_UNUSED;
-     addressT from_addr ATTRIBUTE_UNUSED;
-     addressT to_addr ATTRIBUTE_UNUSED;
-     fragS *frag ATTRIBUTE_UNUSED;
-     symbolS *to_symbol ATTRIBUTE_UNUSED;
+md_create_short_jump (char *ptr ATTRIBUTE_UNUSED,
+                     addressT from_addr ATTRIBUTE_UNUSED,
+                     addressT to_addr ATTRIBUTE_UNUSED,
+                     fragS *frag ATTRIBUTE_UNUSED,
+                     symbolS *to_symbol ATTRIBUTE_UNUSED)
 {
   as_fatal ("md_create_short_jmp\n");
 }
 
 /* Should never be called for tic4x.  */
 void
-md_create_long_jump (ptr, from_addr, to_addr, frag, to_symbol)
-     char *ptr ATTRIBUTE_UNUSED;
-     addressT from_addr ATTRIBUTE_UNUSED;
-     addressT to_addr ATTRIBUTE_UNUSED;
-     fragS *frag ATTRIBUTE_UNUSED;
-     symbolS *to_symbol ATTRIBUTE_UNUSED;
+md_create_long_jump (char *ptr ATTRIBUTE_UNUSED,
+                    addressT from_addr ATTRIBUTE_UNUSED,
+                    addressT to_addr ATTRIBUTE_UNUSED,
+                    fragS *frag ATTRIBUTE_UNUSED,
+                    symbolS *to_symbol ATTRIBUTE_UNUSED)
 {
   as_fatal ("md_create_long_jump\n");
 }
 
 /* Should never be called for tic4x.  */
 int
-md_estimate_size_before_relax (fragP, segtype)
-     register fragS *fragP ATTRIBUTE_UNUSED;
-     segT segtype ATTRIBUTE_UNUSED;
+md_estimate_size_before_relax (fragS *fragP ATTRIBUTE_UNUSED,
+                              segT segtype ATTRIBUTE_UNUSED)
 {
   as_fatal ("md_estimate_size_before_relax\n");
   return 0;
@@ -2824,9 +2682,7 @@ md_estimate_size_before_relax (fragP, segtype)
 
 
 int
-md_parse_option (c, arg)
-     int c;
-     char *arg;
+md_parse_option (int c, const char *arg)
 {
   switch (c)
     {
@@ -2835,7 +2691,7 @@ md_parse_option (c, arg)
        arg++;
       tic4x_cpu = atoi (arg);
       if (!IS_CPU_TIC3X (tic4x_cpu) && !IS_CPU_TIC4X (tic4x_cpu))
-       as_warn ("Unsupported processor generation %d", tic4x_cpu);
+       as_warn (_("Unsupported processor generation %d"), tic4x_cpu);
       break;
 
     case OPTION_REV:             /* cpu revision */
@@ -2843,25 +2699,29 @@ md_parse_option (c, arg)
       break;
 
     case 'b':
-      as_warn ("Option -b is depreciated, please use -mbig");
+      as_warn (_("Option -b is depreciated, please use -mbig"));
+      /* Fall through.  */
     case OPTION_BIG:             /* big model */
       tic4x_big_model = 1;
       break;
 
     case 'p':
-      as_warn ("Option -p is depreciated, please use -mmemparm");
+      as_warn (_("Option -p is depreciated, please use -mmemparm"));
+      /* Fall through.  */
     case OPTION_MEMPARM:         /* push args */
       tic4x_reg_args = 0;
       break;
 
-    case 'r':                  
-      as_warn ("Option -r is depreciated, please use -mregparm");
+    case 'r':
+      as_warn (_("Option -r is depreciated, please use -mregparm"));
+      /* Fall through.  */
     case OPTION_REGPARM:        /* register args */
       tic4x_reg_args = 1;
       break;
 
     case 's':
-      as_warn ("Option -s is depreciated, please use -msmall");
+      as_warn (_("Option -s is depreciated, please use -msmall"));
+      /* Fall through.  */
     case OPTION_SMALL:         /* small model */
       tic4x_big_model = 0;
       break;
@@ -2886,8 +2746,7 @@ md_parse_option (c, arg)
 }
 
 void
-md_show_usage (stream)
-     FILE *stream;
+md_show_usage (FILE *stream)
 {
   fprintf (stream,
       _("\nTIC4X options:\n"
@@ -2914,9 +2773,8 @@ md_show_usage (stream)
 /* This is called when a line is unrecognized.  This is used to handle
    definitions of TI C3x tools style local labels $n where n is a single
    decimal digit.  */
-int 
-tic4x_unrecognized_line (c)
-     int c;
+int
+tic4x_unrecognized_line (int c)
 {
   int lab;
   char *s;
@@ -2936,7 +2794,7 @@ tic4x_unrecognized_line (c)
 
   if (dollar_label_defined (lab))
     {
-      as_bad ("Label \"$%d\" redefined", lab);
+      as_bad (_("Label \"$%d\" redefined"), lab);
       return 0;
     }
 
@@ -2949,8 +2807,7 @@ tic4x_unrecognized_line (c)
 
 /* Handle local labels peculiar to us referred to in an expression.  */
 symbolS *
-md_undefined_symbol (name)
-     char *name;
+md_undefined_symbol (char *name)
 {
   /* Look for local labels of the form $n.  */
   if (name[0] == '$' && ISDIGIT (name[1]))
@@ -2982,23 +2839,19 @@ md_undefined_symbol (name)
 
 /* Parse an operand that is machine-specific.  */
 void
-md_operand (expressionP)
-     expressionS *expressionP ATTRIBUTE_UNUSED;
+md_operand (expressionS *expressionP ATTRIBUTE_UNUSED)
 {
 }
 
 /* Round up a section size to the appropriate boundary---do we need this?  */
 valueT
-md_section_align (segment, size)
-     segT segment ATTRIBUTE_UNUSED;
-     valueT size;
+md_section_align (segT segment ATTRIBUTE_UNUSED, valueT size)
 {
   return size;                 /* Byte (i.e., 32-bit) alignment is fine?  */
 }
 
-static int 
-tic4x_pc_offset (op)
-     unsigned int op;
+static int
+tic4x_pc_offset (unsigned int op)
 {
   /* Determine the PC offset for a C[34]x instruction.
      This could be simplified using some boolean algebra
@@ -3060,14 +2913,13 @@ tic4x_pc_offset (op)
    DBcondD, BcondD  disp + PC + 3 => PC
  */
 long
-md_pcrel_from (fixP)
-     fixS *fixP;
+md_pcrel_from (fixS *fixP)
 {
   unsigned char *buf;
   unsigned int op;
 
   buf = (unsigned char *) fixP->fx_frag->fr_literal + fixP->fx_where;
-  op = (buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
+  op = ((unsigned) buf[3] << 24) | (buf[2] << 16) | (buf[1] << 8) | buf[0];
 
   return ((fixP->fx_where + fixP->fx_frag->fr_address) >> 2) +
     tic4x_pc_offset (op);
@@ -3075,41 +2927,42 @@ md_pcrel_from (fixP)
 
 /* Fill the alignment area with NOP's on .text, unless fill-data
    was specified. */
-int 
-tic4x_do_align (alignment, fill, len, max)
-     int alignment ATTRIBUTE_UNUSED;
-     const char *fill ATTRIBUTE_UNUSED;
-     int len ATTRIBUTE_UNUSED;
-     int max ATTRIBUTE_UNUSED;
+int
+tic4x_do_align (int alignment,
+               const char *fill,
+               int len,
+               int max)
 {
-  unsigned long nop = TIC_NOP_OPCODE;
-
   /* Because we are talking lwords, not bytes, adjust alignment to do words */
   alignment += 2;
-  
+
   if (alignment != 0 && !need_pass_2)
     {
       if (fill == NULL)
         {
-          /*if (subseg_text_p (now_seg))*/  /* FIXME: doesn't work for .text for some reason */
-          frag_align_pattern( alignment, (const char *)&nop, sizeof(nop), max);
-          return 1;
-          /*else
-            frag_align (alignment, 0, max);*/
+          if (subseg_text_p (now_seg))
+           {
+             char nop[4];
+
+             md_number_to_chars (nop, TIC_NOP_OPCODE, 4);
+             frag_align_pattern (alignment, nop, sizeof (nop), max);
+           }
+          else
+            frag_align (alignment, 0, max);
        }
       else if (len <= 1)
        frag_align (alignment, *fill, max);
       else
        frag_align_pattern (alignment, fill, len, max);
     }
-  
+
   /* Return 1 to skip the default alignment function */
   return 1;
 }
 
 /* Look for and remove parallel instruction operator ||.  */
-void 
-tic4x_start_line ()
+void
+tic4x_start_line (void)
 {
   char *s = input_line_pointer;
 
@@ -3137,15 +2990,13 @@ tic4x_start_line ()
 }
 
 arelent *
-tc_gen_reloc (seg, fixP)
-     asection *seg ATTRIBUTE_UNUSED;
-     fixS *fixP;
+tc_gen_reloc (asection *seg ATTRIBUTE_UNUSED, fixS *fixP)
 {
   arelent *reloc;
 
-  reloc = (arelent *) xmalloc (sizeof (arelent));
+  reloc = XNEW (arelent);
 
-  reloc->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
+  reloc->sym_ptr_ptr = XNEW (asymbol *);
   *reloc->sym_ptr_ptr = symbol_get_bfdsym (fixP->fx_addsy);
   reloc->address = fixP->fx_frag->fr_address + fixP->fx_where;
   reloc->address /= OCTETS_PER_BYTE;
@@ -3153,7 +3004,7 @@ tc_gen_reloc (seg, fixP)
   if (reloc->howto == (reloc_howto_type *) NULL)
     {
       as_bad_where (fixP->fx_file, fixP->fx_line,
-                   "Reloc %d not supported by object file format",
+                   _("Reloc %d not supported by object file format"),
                    (int) fixP->fx_r_type);
       return NULL;
     }