* config/tc-m68k.c: Convert to C90. Remove redundant
[deliverable/binutils-gdb.git] / gas / config / tc-mcore.c
index 786ae8b591f63b8251cb2bb018b2c1f67b895d2c..c10b75d226c76f9aaed71dbe32e4c1b4dc85e6cf 100644 (file)
@@ -1,5 +1,5 @@
 /* tc-mcore.c -- Assemble code for M*Core
-   Copyright 1999, 2000, 2001 Free Software Foundation, Inc.
+   Copyright 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -37,6 +37,7 @@
 
 /* Forward declarations for dumb compilers.  */
 static void   mcore_s_literals PARAMS ((int));
+static void   mcore_pool_count PARAMS ((void (*) (int), int));
 static void   mcore_cons PARAMS ((int));
 static void   mcore_float_cons PARAMS ((int));
 static void   mcore_stringer PARAMS ((int));
@@ -124,9 +125,9 @@ const relax_typeS md_relax_table[] = {
   {    0,     0, C32_LEN, 0 },                   /* UNDEF_WORD_DISP */
 
   /* UNCD_JUMP */
-  {    0,     0, 0,      0 },                    /* UNDEF_DISP */     
-  { 2048, -2046, U12_LEN, C(UNCD_JUMP, DISP32) }, /* DISP12 */         
-  {    0,     0, U32_LEN, 0 },                   /* DISP32 */         
+  {    0,     0, 0,      0 },                    /* UNDEF_DISP */
+  { 2048, -2046, U12_LEN, C(UNCD_JUMP, DISP32) }, /* DISP12 */
+  {    0,     0, U32_LEN, 0 },                   /* DISP32 */
   {    0,     0, U32_LEN, 0 }                    /* UNDEF_WORD_DISP */
 
 };
@@ -209,7 +210,7 @@ const pseudo_typeS md_pseudo_table[] =
   { "text",      mcore_s_text,    0 },
   { "data",      mcore_s_data,    0 },
   { "bss",       mcore_s_bss,     1 },
-#ifdef OBJ_EF
+#ifdef OBJ_ELF
   { "comm",      mcore_s_comm,    0 },
 #endif
   { "section",   mcore_s_section, 0 },
@@ -222,29 +223,42 @@ const pseudo_typeS md_pseudo_table[] =
 
 static void
 mcore_s_literals (ignore)
-     int ignore;
+     int ignore ATTRIBUTE_UNUSED;
 {
   dump_literals (0);
   demand_empty_rest_of_line ();
 }
 
+/* Perform FUNC (ARG), and track number of bytes added to frag.  */
+
 static void
-mcore_cons (nbytes)
-     int nbytes;
+mcore_pool_count (func, arg)
+     void (*func) PARAMS ((int));
+     int arg;
 {
-  if (now_seg == text_section)
-    {
-      char * ptr = input_line_pointer;
-      int    commas = 1;
+  const fragS *curr_frag = frag_now;
+  offsetT added = -frag_now_fix_octets ();
 
-      /* Count the number of commas on the line.  */
-      while (! is_end_of_line [(unsigned char) * ptr])
-       commas += * ptr ++ == ',';
+  (*func) (arg);
 
-      poolspan += nbytes * commas;
+  while (curr_frag != frag_now)
+    {
+      added += curr_frag->fr_fix;
+      curr_frag = curr_frag->fr_next;
     }
 
-  cons (nbytes);
+  added += frag_now_fix_octets ();
+  poolspan += added;
+}
+
+static void
+mcore_cons (nbytes)
+     int nbytes;
+{
+  if (now_seg == text_section)
+    mcore_pool_count (cons, nbytes);
+  else
+    cons (nbytes);
 
   /* In theory we ought to call check_literals (2,0) here in case
      we need to dump the literal table.  We cannot do this however,
@@ -258,25 +272,9 @@ mcore_float_cons (float_type)
      int float_type;
 {
   if (now_seg == text_section)
-    {
-      char * ptr = input_line_pointer;
-      int    commas = 1;
-
-#ifdef REPEAT_CONS_EXPRESSIONS
-#error REPEAT_CONS_EXPRESSIONS not handled
-#endif
-
-      /* Count the number of commas on the line.  */
-      while (! is_end_of_line [(unsigned char) * ptr])
-       commas += * ptr ++ == ',';
-
-      /* We would like to compute "hex_float (float_type) * commas"
-        but hex_float is not exported from read.c  */
-      float_type == 'f' ? 4 : (float_type == 'd' ? 8 : 12);
-      poolspan += float_type * commas;
-    }
-
-  float_cons (float_type);
+    mcore_pool_count (float_cons, float_type);
+  else
+    float_cons (float_type);
 
   /* See the comment in mcore_cons () about calling check_literals.
      It is unlikely that a switch table will be constructed using
@@ -290,23 +288,9 @@ mcore_stringer (append_zero)
      int append_zero;
 {
   if (now_seg == text_section)
-    {
-      char * ptr = input_line_pointer;
-
-      /* In theory we should compute how many bytes are going to
-        be occupied by the string(s) and add this to the poolspan.
-        To keep things simple however, we just add the number of
-        bytes left on the current line.  This will be an over-
-        estimate, which is OK, and automatically allows for the
-        appending a zero byte, since the real string(s) is/are
-        required to be enclosed in double quotes.  */
-      while (! is_end_of_line [(unsigned char) * ptr])
-       ptr ++;
-
-      poolspan += ptr - input_line_pointer;
-    }
-
-  stringer (append_zero);
+    mcore_pool_count (stringer, append_zero);
+  else
+    stringer (append_zero);
 
   /* We call check_literals here in case a large number of strings are
      being placed into the text section with a sequence of stringer
@@ -321,31 +305,9 @@ mcore_fill (unused)
      int unused;
 {
   if (now_seg == text_section)
-    {
-      char * str = input_line_pointer;
-      int    size = 1;
-      int    repeat;
-
-      repeat = atoi (str);
-
-      /* Look to see if a size has been specified.  */
-      while (*str != '\n' && *str != 0 && *str != ',')
-       ++ str;
-
-      if (* str == ',')
-       {
-         size = atoi (str + 1);
-
-         if (size > 8)
-           size = 8;
-         else if (size < 0)
-           size = 0;
-       }
-
-      poolspan += size * repeat;
-    }
-
-  s_fill (unused);
+    mcore_pool_count (s_fill, unused);
+  else
+    s_fill (unused);
 
   check_literals (2, 0);
 }
@@ -384,7 +346,7 @@ mcore_s_section (ignore)
 {
   /* Scan forwards to find the name of the section.  If the section
      being switched to is ".line" then this is a DWARF1 debug section
-     which is arbitarily placed inside generated code.  In this case
+     which is arbitrarily placed inside generated code.  In this case
      do not dump the literal pool because it is a) inefficient and
      b) would require the generation of extra code to jump around the
      pool.  */
@@ -432,7 +394,7 @@ mcore_s_comm (needs_align)
 void
 md_begin ()
 {
-  mcore_opcode_info * opcode;
+  const mcore_opcode_info * opcode;
   char * prev_name = "";
 
   opcode_hash_control = hash_new ();
@@ -440,13 +402,7 @@ md_begin ()
   /* Insert unique names into hash table */
   for (opcode = mcore_table; opcode->name; opcode ++)
     {
-      if (streq (prev_name, opcode->name))
-       {
-         /* Make all the opcodes with the same name point to the same
-            string.  */
-         opcode->name = prev_name;
-       }
-      else
+      if (! streq (prev_name, opcode->name))
        {
          prev_name = opcode->name;
          hash_insert (opcode_hash_control, opcode->name, (char *) opcode);
@@ -454,10 +410,6 @@ md_begin ()
     }
 }
 
-static int reg_m;
-static int reg_n;
-static expressionS immediate;  /* absolute expression */
-
 /* Get a log2(val).  */
 static int
 log2 (val)
@@ -466,8 +418,8 @@ log2 (val)
     int log = -1;
     while (val != 0)
       {
-        log ++;
-        val >>= 1;
+       log ++;
+       val >>= 1;
       }
 
     return log;
@@ -621,9 +573,9 @@ parse_psrmod (s, reg)
     {
       if (! strncmp (psrmods[i].name, buf, 2))
        {
-          * reg = psrmods[i].value;
+         * reg = psrmods[i].value;
 
-          return s + 2;
+         return s + 2;
        }
     }
 
@@ -685,9 +637,9 @@ static void
 dump_literals (isforce)
      int isforce;
 {
-  int i;
+  unsigned int i;
   struct literal * p;
-  symbolS * brarsym;
+  symbolS * brarsym = NULL;
 
   if (poolsize == 0)
     return;
@@ -722,7 +674,7 @@ dump_literals (isforce)
   for (i = 0, p = litpool; i < poolsize; i++, p++)
     emit_expr (& p->e, 4);
 
-  if (isforce)
+  if (brarsym != NULL)
     colon (S_GET_NAME (brarsym));
 
    poolsize = 0;
@@ -770,17 +722,17 @@ enter_literal (e, ispcrel)
      expressionS * e;
      int ispcrel;
 {
-  int i;
+  unsigned int i;
   struct literal * p;
 
   if (poolsize >= MAX_POOL_SIZE - 2)
     {
       /* The literal pool is as full as we can handle. We have
-         to be 2 entries shy of the 1024/4=256 entries because we
-         have to allow for the branch (2 bytes) and the alignment
-         (2 bytes before the first insn referencing the pool and
-         2 bytes before the pool itself) == 6 bytes, rounds up
-         to 2 entries.  */
+        to be 2 entries shy of the 1024/4=256 entries because we
+        have to allow for the branch (2 bytes) and the alignment
+        (2 bytes before the first insn referencing the pool and
+        2 bytes before the pool itself) == 6 bytes, rounds up
+        to 2 entries.  */
       dump_literals (1);
     }
 
@@ -883,9 +835,9 @@ parse_imm (s, val, min, max)
     ; /* An error message has already been emitted.  */
   else if (e.X_op != O_constant)
     as_bad (_("operand must be a constant"));
-  else if (e.X_add_number < min || e.X_add_number > max)
-    as_bad (_("operand must be absolute in range %d..%d, not %d"),
-           min, max, e.X_add_number);
+  else if ((addressT) e.X_add_number < min || (addressT) e.X_add_number > max)
+    as_bad (_("operand must be absolute in range %u..%u, not %ld"),
+           min, max, (long) e.X_add_number);
 
   * val = e.X_add_number;
 
@@ -899,8 +851,6 @@ parse_mem (s, reg, off, siz)
      unsigned * off;
      unsigned siz;
 {
-  char * new;
-
   * off = 0;
 
   while (ISSPACE (* s))
@@ -1022,7 +972,7 @@ md_assemble (str)
       inst |= reg;
       output = frag_more (2);
       /* In a sifilter mode, we emit this insn 2 times,
-         fixes problem of an interrupt during a jmp..  */
+        fixes problem of an interrupt during a jmp..  */
       if (sifilter_mode)
        {
          output[0] = INST_BYTE0 (inst);
@@ -1367,6 +1317,8 @@ md_assemble (str)
            size = 2;
          else if ((inst & 0x6000) == 0x2000)
            size = 1;
+         else
+           abort ();
 
          op_end = parse_mem (op_end + 1, & reg, & off, size);
 
@@ -1397,7 +1349,7 @@ md_assemble (str)
        {
          /* parse_rt calls frag_more() for us.  */
          input_line_pointer = parse_rt (op_end + 1, & output, 0, 0);
-          op_end = input_line_pointer;
+         op_end = input_line_pointer;
        }
       else
        {
@@ -1705,7 +1657,7 @@ md_assemble (str)
 
 symbolS *
 md_undefined_symbol (name)
-       char * name;
+       char *name ATTRIBUTE_UNUSED;
 {
   return 0;
 }
@@ -1734,7 +1686,6 @@ md_atof (type, litP, sizeP)
   LITTLENUM_TYPE words[MAX_LITTLENUMS];
   int    i;
   char * t;
-  char * atof_ieee ();
 
   switch (type)
     {
@@ -1794,7 +1745,7 @@ md_atof (type, litP, sizeP)
   return 0;
 }
 \f
-CONST char * md_shortopts = "";
+const char * md_shortopts = "";
 
 #define OPTION_JSRI2BSR_ON     (OPTION_MD_BASE + 0)
 #define OPTION_JSRI2BSR_OFF    (OPTION_MD_BASE + 1)
@@ -1823,9 +1774,6 @@ md_parse_option (c, arg)
      int c;
      char * arg;
 {
-  int i;
-  char * p;
-
   switch (c)
     {
     case OPTION_CPU:
@@ -1837,7 +1785,7 @@ md_parse_option (c, arg)
       else if (streq (arg, "340"))
        cpu = M340;
       else
-        as_warn (_("unrecognised cpu type '%s'"), arg);
+       as_warn (_("unrecognised cpu type '%s'"), arg);
       break;
 
     case OPTION_EB: target_big_endian = 1; break;
@@ -1869,22 +1817,22 @@ int md_short_jump_size;
 
 void
 md_create_short_jump (ptr, from_Nddr, to_Nddr, frag, to_symbol)
-     char * ptr;
-     addressT from_Nddr;
-     addressT to_Nddr;
-     fragS * frag;
-     symbolS * to_symbol;
+     char * ptr ATTRIBUTE_UNUSED;
+     addressT from_Nddr ATTRIBUTE_UNUSED;
+     addressT to_Nddr ATTRIBUTE_UNUSED;
+     fragS * frag ATTRIBUTE_UNUSED;
+     symbolS * to_symbol ATTRIBUTE_UNUSED;
 {
   as_fatal (_("failed sanity check: short_jump"));
 }
 
 void
 md_create_long_jump (ptr, from_Nddr, to_Nddr, frag, to_symbol)
-     char * ptr;
-     addressT from_Nddr;
-     addressT to_Nddr;
-     fragS * frag;
-     symbolS * to_symbol;
+     char * ptr ATTRIBUTE_UNUSED;
+     addressT from_Nddr ATTRIBUTE_UNUSED;
+     addressT to_Nddr ATTRIBUTE_UNUSED;
+     fragS * frag ATTRIBUTE_UNUSED;
+     symbolS * to_symbol ATTRIBUTE_UNUSED;
 {
   as_fatal (_("failed sanity check: long_jump"));
 }
@@ -1892,8 +1840,8 @@ md_create_long_jump (ptr, from_Nddr, to_Nddr, frag, to_symbol)
 /* Called after relaxing, change the frags so they know how big they are.  */
 void
 md_convert_frag (abfd, sec, fragP)
-     bfd * abfd;
-     segT sec;
+     bfd * abfd ATTRIBUTE_UNUSED;
+     segT sec ATTRIBUTE_UNUSED;
      register fragS * fragP;
 {
   unsigned char * buffer;
@@ -2093,25 +2041,20 @@ void
 md_apply_fix3 (fixP, valP, segment)
      fixS *   fixP;
      valueT * valP;
-     segT     segment;
+     segT     segment ATTRIBUTE_UNUSED;
 {
   char *       buf  = fixP->fx_where + fixP->fx_frag->fr_literal;
   char *       file = fixP->fx_file ? fixP->fx_file : _("unknown");
   const char * symname;
   /* Note: use offsetT because it is signed, valueT is unsigned.  */
-  offsetT      val  = * (offsetT *)  valP;
+  offsetT      val  = *valP;
 
   symname = fixP->fx_addsy ? S_GET_NAME (fixP->fx_addsy) : _("<unknown>");
   /* Save this for the addend in the relocation record.  */
   fixP->fx_addnumber = val;
 
-  /* If the fix is relative to a symbol which is not defined, or not
-     in the same segment as the fix, we cannot resolve it here.  */
-  if (fixP->fx_addsy != NULL
-      && (   ! S_IS_DEFINED (fixP->fx_addsy)
-         || (S_GET_SEGMENT (fixP->fx_addsy) != segment)))
+  if (fixP->fx_addsy != NULL)
     {
-      fixP->fx_done = 0;
 #ifdef OBJ_ELF
       /* For ELF we can just return and let the reloc that will be generated
         take care of everything.  For COFF we still have to insert 'val'
@@ -2127,12 +2070,12 @@ md_apply_fix3 (fixP, valP, segment)
     case BFD_RELOC_MCORE_PCREL_IMM11BY2:     /* second byte of 2 byte opcode */
       if ((val & 1) != 0)
        as_bad_where (file, fixP->fx_line,
-                     _("odd distance branch (0x%x bytes)"), val);
+                     _("odd distance branch (0x%lx bytes)"), (long) val);
       val /= 2;
       if (((val & ~0x3ff) != 0) && ((val | 0x3ff) != -1))
        as_bad_where (file, fixP->fx_line,
-                     _("pcrel for branch to %s too far (0x%x)"),
-                     symname, val);
+                     _("pcrel for branch to %s too far (0x%lx)"),
+                     symname, (long) val);
       if (target_big_endian)
        {
          buf[0] |= ((val >> 8) & 0x7);
@@ -2150,8 +2093,8 @@ md_apply_fix3 (fixP, valP, segment)
       val /= 4;
       if (val & ~0xff)
        as_bad_where (file, fixP->fx_line,
-                     _("pcrel for lrw/jmpi/jsri to %s too far (0x%x)"),
-                     symname, val);
+                     _("pcrel for lrw/jmpi/jsri to %s too far (0x%lx)"),
+                     symname, (long) val);
       else if (! target_big_endian)
        buf[0] |= (val & 0xff);
       else
@@ -2161,7 +2104,7 @@ md_apply_fix3 (fixP, valP, segment)
     case BFD_RELOC_MCORE_PCREL_IMM4BY2:        /* loopt instruction */
       if ((val < -32) || (val > -2))
        as_bad_where (file, fixP->fx_line,
-                     _("pcrel for loopt too far (0x%x)"), val);
+                     _("pcrel for loopt too far (0x%lx)"), (long) val);
       val /= 2;
       if (! target_big_endian)
        buf[0] |= (val & 0xf);
@@ -2172,7 +2115,7 @@ md_apply_fix3 (fixP, valP, segment)
     case BFD_RELOC_MCORE_PCREL_JSR_IMM11BY2:
       /* Conditional linker map jsri to bsr.  */
       /* If its a local target and close enough, fix it.
-         NB: >= -2k for backwards bsr; < 2k for forwards...  */
+        NB: >= -2k for backwards bsr; < 2k for forwards...  */
       if (fixP->fx_addsy == 0 && val >= -2048  && val < 2048)
        {
          long nval = (val / 2) & 0x7ff;
@@ -2324,7 +2267,7 @@ md_number_to_chars (ptr, use, nbytes)
 /* Round up a section size to the appropriate boundary.  */
 valueT
 md_section_align (segment, size)
-     segT segment;
+     segT segment ATTRIBUTE_UNUSED;
      valueT size;
 {
   return size;                 /* Byte alignment is fine */
@@ -2335,7 +2278,7 @@ md_section_align (segment, size)
 long
 md_pcrel_from_section (fixp, sec)
      fixS * fixp;
-     segT sec;
+     segT sec ATTRIBUTE_UNUSED;
 {
 #ifdef OBJ_ELF
   /* If the symbol is undefined or defined in another section
@@ -2360,12 +2303,11 @@ md_pcrel_from_section (fixp, sec)
 
 arelent *
 tc_gen_reloc (section, fixp)
-     asection * section;
+     asection * section ATTRIBUTE_UNUSED;
      fixS * fixp;
 {
   arelent * rel;
   bfd_reloc_code_real_type code;
-  int handled = 0;
 
   switch (fixp->fx_r_type)
     {
@@ -2382,19 +2324,19 @@ tc_gen_reloc (section, fixp)
 
     default:
       switch (F (fixp->fx_size, fixp->fx_pcrel))
-        {
-          MAP (1, 0, BFD_RELOC_8);
-          MAP (2, 0, BFD_RELOC_16);
-          MAP (4, 0, BFD_RELOC_32);
-          MAP (1, 1, BFD_RELOC_8_PCREL);
-          MAP (2, 1, BFD_RELOC_16_PCREL);
-          MAP (4, 1, BFD_RELOC_32_PCREL);
-        default:
+       {
+         MAP (1, 0, BFD_RELOC_8);
+         MAP (2, 0, BFD_RELOC_16);
+         MAP (4, 0, BFD_RELOC_32);
+         MAP (1, 1, BFD_RELOC_8_PCREL);
+         MAP (2, 1, BFD_RELOC_16_PCREL);
+         MAP (4, 1, BFD_RELOC_32_PCREL);
+       default:
          code = fixp->fx_r_type;
-          as_bad (_("Can not do %d byte %srelocation"),
+         as_bad (_("Can not do %d byte %srelocation"),
                  fixp->fx_size,
-                 fixp->fx_pcrel ? _("pc-relative") : "");
-        }
+                 fixp->fx_pcrel ? _("pc-relative") : "");
+       }
       break;
   }
 
@@ -2410,8 +2352,8 @@ tc_gen_reloc (section, fixp)
   if (rel->howto == NULL)
     {
       as_bad_where (fixp->fx_file, fixp->fx_line,
-                    _("Cannot represent relocation type %s"),
-                    bfd_get_reloc_code_name (code));
+                   _("Cannot represent relocation type %s"),
+                   bfd_get_reloc_code_name (code));
 
       /* Set howto to a garbage value so that we can keep going.  */
       rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
@@ -2429,23 +2371,18 @@ int
 mcore_force_relocation (fix)
      fixS * fix;
 {
-  if (   fix->fx_r_type == BFD_RELOC_VTABLE_INHERIT
-      || fix->fx_r_type == BFD_RELOC_VTABLE_ENTRY
-      || fix->fx_r_type == BFD_RELOC_RVA)
+  if (fix->fx_r_type == BFD_RELOC_RVA)
     return 1;
 
-  return 0;
+  return generic_force_reloc (fix);
 }
 
 /* Return true if the fix can be handled by GAS, false if it must
    be passed through to the linker.  */
-boolean
+bfd_boolean
 mcore_fix_adjustable (fixP)
    fixS * fixP;
 {
-  if (fixP->fx_addsy == NULL)
-    return 1;
-
   /* We need the symbol name for the VTABLE entries.  */
   if (   fixP->fx_r_type == BFD_RELOC_VTABLE_INHERIT
       || fixP->fx_r_type == BFD_RELOC_VTABLE_ENTRY)
This page took 0.031415 seconds and 4 git commands to generate.