Fix indentation in print_thread_info_1
[deliverable/binutils-gdb.git] / gas / config / tc-ip2k.c
index b9d63e4ffcd733e647399685f35cf39c09bd5dbf..53b4d88f111aa33bc3d4460dbb02a24f6de0019b 100644 (file)
@@ -1,11 +1,11 @@
 /* tc-ip2k.c -- Assembler for the Scenix IP2xxx.
-   Copyright (C) 2000, 2002 Free Software Foundation.
+   Copyright (C) 2000-2019 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
    GAS is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2, or (at your option)
+   the Free Software Foundation; either version 3, or (at your option)
    any later version.
 
    GAS is distributed in the hope that it will be useful,
 
    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, 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
-
-#include <stdio.h>
-#include <ctype.h>
+   the Free Software Foundation, 51 Franklin Street - Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 #include "as.h"
-#include "dwarf2dbg.h"
-#include "subsegs.h"     
+#include "subsegs.h"
 #include "symcat.h"
 #include "opcodes/ip2k-desc.h"
 #include "opcodes/ip2k-opc.h"
 #include "cgen.h"
 #include "elf/common.h"
 #include "elf/ip2k.h"
-#include "libbfd.h"
 
 /* Structure to hold all of the different components describing
    an individual instruction.  */
@@ -56,18 +51,43 @@ ip2k_insn;
 
 const char comment_chars[]        = ";";
 const char line_comment_chars[]   = "#";
-const char line_separator_chars[] = ""; 
+const char line_separator_chars[] = "";
 const char EXP_CHARS[]            = "eE";
 const char FLT_CHARS[]            = "dD";
 
-static void ip2k_elf_section_text (int);
-static void ip2k_elf_section_rtn (int);
+/* Flag to detect when switching to code section where insn alignment is
+   implied.  */
+static int force_code_align = 0;
+
+/* Mach selected from command line.  */
+static int ip2k_mach = 0;
+static unsigned ip2k_mach_bitmask = 0;
+
+
+static void
+ip2k_elf_section_rtn (int i)
+{
+  obj_elf_section(i);
+
+  if (force_code_align)
+    {
+      do_align (1, NULL, 0, 0);
+      force_code_align = 0;
+    }
+}
+
+static void
+ip2k_elf_section_text (int i)
+{
+  obj_elf_text(i);
+
+  do_align (1, NULL, 0, 0);
+  force_code_align = 0;
+}
 
 /* The target specific pseudo-ops which we support.  */
 const pseudo_typeS md_pseudo_table[] =
 {
-    { "file",  (void (*) PARAMS ((int))) dwarf2_directive_file, 0 },
-    { "loc",   dwarf2_directive_loc,   0 },
     { "text",   ip2k_elf_section_text,  0 },
     { "sect",   ip2k_elf_section_rtn,   0 },
     { NULL,    NULL,                   0 }
@@ -75,10 +95,13 @@ const pseudo_typeS md_pseudo_table[] =
 
 \f
 
-#define OPTION_CPU_IP2022    (OPTION_MD_BASE)
-#define OPTION_CPU_IP2022EXT (OPTION_MD_BASE+1)
+enum options
+{
+  OPTION_CPU_IP2022 = OPTION_MD_BASE,
+  OPTION_CPU_IP2022EXT
+};
 
-struct option md_longopts[] = 
+struct option md_longopts[] =
 {
   { "mip2022",     no_argument, NULL, OPTION_CPU_IP2022 },
   { "mip2022ext",  no_argument, NULL, OPTION_CPU_IP2022EXT },
@@ -88,18 +111,8 @@ size_t md_longopts_size = sizeof (md_longopts);
 
 const char * md_shortopts = "";
 
-/* Flag to detect when switching to code section where insn alignment is
-   implied.  */
-static int force_code_align = 0;
-
-/* Mach selected from command line.  */
-int ip2k_mach = 0;
-unsigned ip2k_mach_bitmask = 0;
-
 int
-md_parse_option (c, arg)
-    int c ATTRIBUTE_UNUSED;
-    char * arg ATTRIBUTE_UNUSED;
+md_parse_option (int c ATTRIBUTE_UNUSED, const char * arg ATTRIBUTE_UNUSED)
 {
   switch (c)
     {
@@ -120,10 +133,8 @@ md_parse_option (c, arg)
   return 1;
 }
 
-
 void
-md_show_usage (stream)
-    FILE * stream;
+md_show_usage (FILE * stream)
 {
   fprintf (stream, _("IP2K specific command line options:\n"));
   fprintf (stream, _("  -mip2022               restrict to IP2022 insns \n"));
@@ -132,10 +143,10 @@ md_show_usage (stream)
 
 \f
 void
-md_begin ()
+md_begin (void)
 {
   /* Initialize the `cgen' interface.  */
-  
+
   /* Set the machine number and endian.  */
   gas_cgen_cpu_desc = ip2k_cgen_cpu_open (CGEN_CPU_OPEN_MACHS,
                                          ip2k_mach_bitmask,
@@ -149,12 +160,13 @@ md_begin ()
 
   /* Set the machine type.  */
   bfd_default_set_arch_mach (stdoutput, bfd_arch_ip2k, ip2k_mach);
+
+  literal_prefix_dollar_hex = TRUE;
 }
 
 
 void
-md_assemble (str)
-     char * str;
+md_assemble (char * str)
 {
   ip2k_insn insn;
   char * errmsg;
@@ -178,16 +190,17 @@ md_assemble (str)
        the PCL (pc + 2) >> 1 is odd or even.  */
     {
       enum cgen_parse_operand_result result_type;
-      long value;
+      bfd_vma value;
       const char *curpc_plus_2 = ".+2";
+      const char *err;
 
-      errmsg = cgen_parse_address (gas_cgen_cpu_desc, & curpc_plus_2,
-                                  IP2K_OPERAND_ADDR16CJP,
-                                  BFD_RELOC_IP2K_PC_SKIP,
-                                  & result_type, & value);
-      if (errmsg)
+      err = cgen_parse_address (gas_cgen_cpu_desc, & curpc_plus_2,
+                               IP2K_OPERAND_ADDR16CJP,
+                               BFD_RELOC_IP2K_PC_SKIP,
+                               & result_type, & value);
+      if (err)
        {
-         as_bad ("%s", errmsg);
+         as_bad ("%s", err);
          return;
        }
     }
@@ -198,31 +211,27 @@ md_assemble (str)
 }
 
 valueT
-md_section_align (segment, size)
-     segT   segment;
-     valueT size;
+md_section_align (segT segment, valueT size)
 {
-  int align = bfd_get_section_alignment (stdoutput, segment);
+  int align = bfd_section_alignment (segment);
 
-  return ((size + (1 << align) - 1) & (-1 << align));
+  return ((size + (1 << align) - 1) & -(1 << align));
 }
 
 
 symbolS *
-md_undefined_symbol (name)
-    char * name ATTRIBUTE_UNUSED;
+md_undefined_symbol (char * name ATTRIBUTE_UNUSED)
 {
     return 0;
 }
 \f
 int
-md_estimate_size_before_relax (fragP, segment)
-     fragS * fragP ATTRIBUTE_UNUSED;
-     segT    segment ATTRIBUTE_UNUSED;
+md_estimate_size_before_relax (fragS * fragP ATTRIBUTE_UNUSED,
+                              segT    segment ATTRIBUTE_UNUSED)
 {
-  as_fatal (_("md_estimate_size_before_relax\n"));
+  as_fatal (_("relaxation not supported\n"));
   return 1;
-} 
+}
 
 
 /* *fragP has been relaxed to its final size, and now needs to have
@@ -233,10 +242,9 @@ md_estimate_size_before_relax (fragP, segment)
    fragP->fr_subtype is the subtype of what the address relaxed to.  */
 
 void
-md_convert_frag (abfd, sec, fragP)
-    bfd   * abfd  ATTRIBUTE_UNUSED;
-    segT    sec   ATTRIBUTE_UNUSED;
-    fragS * fragP ATTRIBUTE_UNUSED;
+md_convert_frag (bfd   * abfd  ATTRIBUTE_UNUSED,
+                segT    sec   ATTRIBUTE_UNUSED,
+                fragS * fragP ATTRIBUTE_UNUSED)
 {
 }
 
@@ -244,13 +252,9 @@ md_convert_frag (abfd, sec, fragP)
 /* Functions concerning relocs.  */
 
 long
-md_pcrel_from (fixP)
-     fixS *fixP;
+md_pcrel_from (fixS *fixP ATTRIBUTE_UNUSED)
 {
-  as_fatal (_("md_pcrel_from\n"));
-
-  /* Return the address of the delay slot. */
-  return fixP->fx_size + fixP->fx_where + fixP->fx_frag->fr_address;
+  abort ();
 }
 
 
@@ -259,10 +263,9 @@ md_pcrel_from (fixP)
    *FIXP may be modified if desired.  */
 
 bfd_reloc_code_real_type
-md_cgen_lookup_reloc (insn, operand, fixP)
-     const CGEN_INSN *    insn     ATTRIBUTE_UNUSED;
-     const CGEN_OPERAND * operand;
-     fixS *               fixP     ATTRIBUTE_UNUSED;
+md_cgen_lookup_reloc (const CGEN_INSN *    insn     ATTRIBUTE_UNUSED,
+                     const CGEN_OPERAND * operand,
+                     fixS *               fixP     ATTRIBUTE_UNUSED)
 {
   bfd_reloc_code_real_type result;
 
@@ -304,71 +307,15 @@ md_cgen_lookup_reloc (insn, operand, fixP)
 /* Write a value out to the object file, using the appropriate endianness.  */
 
 void
-md_number_to_chars (buf, val, n)
-     char * buf;
-     valueT val;
-     int    n;
+md_number_to_chars (char * buf, valueT val, int n)
 {
   number_to_chars_bigendian (buf, val, n);
 }
 
-/* Turn a string in input_line_pointer into a floating point constant of type
-   type, and store the appropriate bytes in *litP.  The number of LITTLENUMS
-   emitted is stored in *sizeP .  An error message is returned, or NULL on
-   OK.  */
-
-/* Equal to MAX_PRECISION in atof-ieee.c  */
-#define MAX_LITTLENUMS 6
-
-char *
-md_atof (type, litP, sizeP)
-     char   type;
-     char * litP;
-     int *  sizeP;
+const char *
+md_atof (int type, char * litP, int *  sizeP)
 {
-  int              prec;
-  LITTLENUM_TYPE   words [MAX_LITTLENUMS];
-  LITTLENUM_TYPE  *wordP;
-  char *           t;
-  char *           atof_ieee PARAMS ((char *, int, LITTLENUM_TYPE *));
-
-  switch (type)
-    {
-    case 'f':
-    case 'F':
-    case 's':
-    case 'S':
-      prec = 2;
-      break;
-
-    case 'd':
-    case 'D':
-    case 'r':
-    case 'R':
-      prec = 4;
-      break;
-
-   /* FIXME: Some targets allow other format chars for bigger sizes here.  */
-
-    default:
-      * sizeP = 0;
-      return _("Bad call to md_atof()");
-    }
-
-  t = atof_ieee (input_line_pointer, type, words);
-  if (t)
-    input_line_pointer = t;
-  * sizeP = prec * sizeof (LITTLENUM_TYPE);
-
-  /* This loops outputs the LITTLENUMs in REVERSE order; in accord with
-     the ip2k endianness.  */
-  for (wordP = words; prec--;)
-    {
-      md_number_to_chars (litP, (valueT) (*wordP++), sizeof (LITTLENUM_TYPE));
-      litP += sizeof (LITTLENUM_TYPE);
-    }
-     
-  return 0;
+  return ieee_md_atof (type, litP, sizeP, TRUE);
 }
 
 
@@ -379,15 +326,10 @@ md_atof (type, litP, sizeP)
    the instruction it will be eventually encoded within.  */
 
 int
-ip2k_force_relocation (fix)
-     fixS * fix;
+ip2k_force_relocation (fixS * fix)
 {
   switch (fix->fx_r_type)
     {
-      /* (No C++ support in ip2k.  */
-      /* case BFD_RELOC_VTABLE_INHERIT: */
-      /* case BFD_RELOC_VTABLE_ENTRY: */
-
     case BFD_RELOC_IP2K_FR9:
     case BFD_RELOC_IP2K_FR_OFFSET:
     case BFD_RELOC_IP2K_BANK:
@@ -403,31 +345,30 @@ ip2k_force_relocation (fix)
       return 1;
 
     case BFD_RELOC_16:
-      if (fix->fx_subsy  && S_IS_DEFINED (fix->fx_subsy)
+      if (fix->fx_subsy && S_IS_DEFINED (fix->fx_subsy)
          && fix->fx_addsy && S_IS_DEFINED (fix->fx_addsy)
          && (S_GET_SEGMENT (fix->fx_addsy)->flags & SEC_CODE))
        {
          fix->fx_r_type = BFD_RELOC_IP2K_TEXT;
          return 0;
        }
-      return 0;
+      break;
 
     default:
-      return 0;
+      break;
     }
+
+  return generic_force_reloc (fix);
 }
 
 void
-ip2k_apply_fix3 (fixP, valueP, seg)
-     fixS *fixP;
-     valueT *valueP;
-     segT seg;
+ip2k_apply_fix (fixS *fixP, valueT *valueP, segT seg)
 {
   if (fixP->fx_r_type == BFD_RELOC_IP2K_TEXT
       && ! fixP->fx_addsy
       && ! fixP->fx_subsy)
     {
-      *valueP = ((int)(*valueP)) / 2;
+      *valueP = ((int)(* valueP)) / 2;
       fixP->fx_r_type = BFD_RELOC_16;
     }
   else if (fixP->fx_r_type == BFD_RELOC_UNUSED + IP2K_OPERAND_FR)
@@ -435,7 +376,7 @@ ip2k_apply_fix3 (fixP, valueP, seg)
       /* Must be careful when we are fixing up an FR.  We could be
         fixing up an offset to (SP) or (DP) in which case we don't
         want to step on the top 2 bits of the FR operand.  The
-        gas_cgen_md_apply_fix3 doesn't know any better and overwrites
+        gas_cgen_md_apply_fix doesn't know any better and overwrites
         the entire operand.  We counter this by adding the bits
         to the new value.  */
       char *where = fixP->fx_frag->fr_literal + fixP->fx_where;
@@ -443,20 +384,19 @@ ip2k_apply_fix3 (fixP, valueP, seg)
       /* Canonical name, since used a lot.  */
       CGEN_CPU_DESC cd = gas_cgen_cpu_desc;
       CGEN_INSN_INT insn_value
-       = cgen_get_insn_value (cd, where,
+       = cgen_get_insn_value (cd, (unsigned char *) where,
                               CGEN_INSN_BITSIZE (fixP->fx_cgen.insn));
       /* Preserve (DP) or (SP) specification.  */
       *valueP += (insn_value & 0x180);
     }
 
-  gas_cgen_md_apply_fix3 (fixP, valueP, seg);
+  gas_cgen_md_apply_fix (fixP, valueP, seg);
 }
 
 int
-ip2k_elf_section_flags (flags, attr, type)
-     int flags;
-     int attr ATTRIBUTE_UNUSED;
-     int type ATTRIBUTE_UNUSED;
+ip2k_elf_section_flags (flagword flags,
+                       bfd_vma attr ATTRIBUTE_UNUSED,
+                       int type ATTRIBUTE_UNUSED)
 {
   /* This is used to detect when the section changes to an executable section.
      This function is called by the elf section processing.  When we note an
@@ -464,44 +404,7 @@ ip2k_elf_section_flags (flags, attr, type)
      word alignment should be forced.  */
   if (flags & SEC_CODE)
     force_code_align = 1;
-  return flags;
-}
-
-static void
-ip2k_elf_section_rtn (int i)
-{
-  obj_elf_section(i);
 
-  if (force_code_align)
-    {
-      /* The s_align_ptwo function expects that we are just after a .align
-        directive and it will either try and read the align value or stop
-        if end of line so we must fake it out so it thinks we are at the
-        end of the line.  */
-      char *old_input_line_pointer = input_line_pointer;
-      input_line_pointer = "\n";
-      s_align_ptwo (1);
-      force_code_align = 0;
-      /* Restore.  */
-      input_line_pointer = old_input_line_pointer;
-    }
+  return flags;
 }
 
-static void
-ip2k_elf_section_text (int i)
-{
-  char *old_input_line_pointer;
-  obj_elf_text(i);
-
-  /* the s_align_ptwo function expects that we are just after a .align
-     directive and it will either try and read the align value or stop if
-     end of line so we must fake it out so it thinks we are at the end of
-     the line.  */
-  old_input_line_pointer = input_line_pointer;
-  input_line_pointer = "\n";
-  s_align_ptwo (1);
-  force_code_align = 0;
-  /* Restore.  */
-  input_line_pointer = old_input_line_pointer;
-}
This page took 0.0315 seconds and 4 git commands to generate.