Add support for intel SERIALIZE instruction
[deliverable/binutils-gdb.git] / gas / config / tc-pj.c
index 7d5b835aecc7d12c03f01af61df5bb42d8919bca..752392b6e3983a8c225821a4970d914fbe166f6e 100644 (file)
@@ -1,12 +1,11 @@
-/*-
-   tc-pj.c -- Assemble code for Pico Java
-   Copyright 1999, 2000, 2001 Free Software Foundation, Inc.
+/* tc-pj.c -- Assemble code for Pico Java
+   Copyright (C) 1999-2020 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
 
    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,
    any later version.
 
    GAS is distributed in the hope that it will be useful,
@@ -16,8 +15,8 @@
 
    You should have received a copy of the GNU General Public License
    along with GAS; see the file COPYING.  If not, write to
 
    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.  */
+   the Free Software Foundation, 51 Franklin Street - Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 /* Contributed by Steve Chamberlain of Transmeta <sac@pobox.com>.  */
 
 
 /* Contributed by Steve Chamberlain of Transmeta <sac@pobox.com>.  */
 
 
 extern const pj_opc_info_t pj_opc_info[512];
 
 
 extern const pj_opc_info_t pj_opc_info[512];
 
-const char comment_chars[] = "!/";
+const char comment_chars[]        = "!/";
 const char line_separator_chars[] = ";";
 const char line_separator_chars[] = ";";
-const char line_comment_chars[] = "/!#";
+const char line_comment_chars[]   = "/!#";
 
 static int pending_reloc;
 static struct hash_control *opcode_hash_control;
 
 static void
 
 static int pending_reloc;
 static struct hash_control *opcode_hash_control;
 
 static void
-little (ignore)
-     int ignore ATTRIBUTE_UNUSED;
+little (int ignore ATTRIBUTE_UNUSED)
 {
   target_big_endian = 0;
 }
 
 static void
 {
   target_big_endian = 0;
 }
 
 static void
-big (ignore)
-     int ignore ATTRIBUTE_UNUSED;
+big (int ignore ATTRIBUTE_UNUSED)
 {
   target_big_endian = 1;
 }
 
 {
   target_big_endian = 1;
 }
 
-const pseudo_typeS md_pseudo_table[] = {
+const pseudo_typeS md_pseudo_table[] =
+{
   {"ml",    little, 0},
   {"mb",    big,    0},
   {0, 0, 0}
   {"ml",    little, 0},
   {"mb",    big,    0},
   {0, 0, 0}
@@ -58,8 +56,7 @@ const char FLT_CHARS[] = "rRsSfFdDxXpP";
 const char EXP_CHARS[] = "eE";
 
 void
 const char EXP_CHARS[] = "eE";
 
 void
-md_operand (op)
-     expressionS *op;
+md_operand (expressionS *op)
 {
   if (strncmp (input_line_pointer, "%hi16", 5) == 0)
     {
 {
   if (strncmp (input_line_pointer, "%hi16", 5) == 0)
     {
@@ -69,6 +66,7 @@ md_operand (op)
       input_line_pointer += 5;
       expression (op);
     }
       input_line_pointer += 5;
       expression (op);
     }
+
   if (strncmp (input_line_pointer, "%lo16", 5) == 0)
     {
       if (pending_reloc)
   if (strncmp (input_line_pointer, "%lo16", 5) == 0)
     {
       if (pending_reloc)
@@ -82,11 +80,10 @@ md_operand (op)
 /* Parse an expression and then restore the input line pointer.  */
 
 static char *
 /* Parse an expression and then restore the input line pointer.  */
 
 static char *
-parse_exp_save_ilp (s, op)
-     char *s;
-     expressionS *op;
+parse_exp_save_ilp (char *s, expressionS *op)
 {
   char *save = input_line_pointer;
 {
   char *save = input_line_pointer;
+
   input_line_pointer = s;
   expression (op);
   s = input_line_pointer;
   input_line_pointer = s;
   expression (op);
   s = input_line_pointer;
@@ -99,11 +96,8 @@ parse_exp_save_ilp (s, op)
    we want to handle magic pending reloc expressions specially.  */
 
 void
    we want to handle magic pending reloc expressions specially.  */
 
 void
-pj_cons_fix_new_pj (frag, where, nbytes, exp)
-     fragS *frag;
-     int where;
-     int nbytes;
-     expressionS *exp;
+pj_cons_fix_new_pj (fragS *frag, int where, int nbytes, expressionS *exp,
+                   bfd_reloc_code_real_type r ATTRIBUTE_UNUSED)
 {
   static int rv[5][2] =
   { { 0, 0 },
 {
   static int rv[5][2] =
   { { 0, 0 },
@@ -123,8 +117,7 @@ pj_cons_fix_new_pj (frag, where, nbytes, exp)
    code which BFD can handle.  */
 
 static int
    code which BFD can handle.  */
 
 static int
-c_to_r (x)
-     char x;
+c_to_r (int x)
 {
   switch (x)
     {
 {
   switch (x)
     {
@@ -151,19 +144,19 @@ c_to_r (x)
    turns ipush <foo> into sipush lo16<foo>, sethi hi16<foo>.  */
 
 static void
    turns ipush <foo> into sipush lo16<foo>, sethi hi16<foo>.  */
 
 static void
-ipush_code (opcode, str)
-     pj_opc_info_t *opcode ATTRIBUTE_UNUSED;
-     char *str;
+ipush_code (pj_opc_info_t *opcode ATTRIBUTE_UNUSED, char *str)
 {
 {
-  int mod = 0;
   char *b = frag_more (6);
   expressionS arg;
 
   b[0] = 0x11;
   b[3] = 0xed;
   char *b = frag_more (6);
   expressionS arg;
 
   b[0] = 0x11;
   b[3] = 0xed;
-  parse_exp_save_ilp (str + 1, &arg, &mod);
-  if (mod)
-    as_bad (_("can't have relocation for ipush"));
+  parse_exp_save_ilp (str + 1, &arg);
+  if (pending_reloc)
+    {
+      as_bad (_("can't have relocation for ipush"));
+      pending_reloc = 0;
+    }
 
   fix_new_exp (frag_now, b - frag_now->fr_literal + 1, 2,
               &arg, 0, BFD_RELOC_PJ_CODE_DIR16);
 
   fix_new_exp (frag_now, b - frag_now->fr_literal + 1, 2,
               &arg, 0, BFD_RELOC_PJ_CODE_DIR16);
@@ -172,18 +165,17 @@ ipush_code (opcode, str)
 }
 
 /* Insert names into the opcode table which are really mini macros,
 }
 
 /* Insert names into the opcode table which are really mini macros,
-   not opcodes.  The fakeness is inidicated with an opcode of -1.  */
+   not opcodes.  The fakeness is indicated with an opcode of -1.  */
 
 static void
 
 static void
-fake_opcode (name, func)
-     const char *name;
-     void (*func) ();
+fake_opcode (const char *name,
+            void (*func) (struct pj_opc_info_t *, char *))
 {
 {
-  pj_opc_info_t *fake = (pj_opc_info_t *) xmalloc (sizeof (pj_opc_info_t));
+  pj_opc_info_t * fake = XNEW (pj_opc_info_t);
 
   fake->opcode = -1;
   fake->opcode_next = -1;
 
   fake->opcode = -1;
   fake->opcode_next = -1;
-  fake->name = (const char *) func;
+  fake->u.func = func;
   hash_insert (opcode_hash_control, name, (char *) fake);
 }
 
   hash_insert (opcode_hash_control, name, (char *) fake);
 }
 
@@ -191,11 +183,9 @@ fake_opcode (name, func)
    can have another name.  */
 
 static void
    can have another name.  */
 
 static void
-alias (new, old)
-     const char *new;
-     const char *old;
+alias (const char *new_name, const char *old)
 {
 {
-  hash_insert (opcode_hash_control, new,
+  hash_insert (opcode_hash_control, new_name,
               (char *) hash_find (opcode_hash_control, old));
 }
 
               (char *) hash_find (opcode_hash_control, old));
 }
 
@@ -204,14 +194,14 @@ alias (new, old)
    some aliases for compatibility with other assemblers.  */
 
 void
    some aliases for compatibility with other assemblers.  */
 
 void
-md_begin ()
+md_begin (void)
 {
   const pj_opc_info_t *opcode;
   opcode_hash_control = hash_new ();
 
   /* Insert names into hash table.  */
 {
   const pj_opc_info_t *opcode;
   opcode_hash_control = hash_new ();
 
   /* Insert names into hash table.  */
-  for (opcode = pj_opc_info; opcode->name; opcode++)
-    hash_insert (opcode_hash_control, opcode->name, (char *) opcode);
+  for (opcode = pj_opc_info; opcode->u.name; opcode++)
+    hash_insert (opcode_hash_control, opcode->u.name, (char *) opcode);
 
   /* Insert the only fake opcode.  */
   fake_opcode ("ipush", ipush_code);
 
   /* Insert the only fake opcode.  */
   fake_opcode ("ipush", ipush_code);
@@ -233,15 +223,11 @@ md_begin ()
    the frags/bytes it assembles to.  */
 
 void
    the frags/bytes it assembles to.  */
 
 void
-md_assemble (str)
-     char *str;
+md_assemble (char *str)
 {
 {
-  unsigned char *op_start;
-  unsigned char *op_end;
+  char *op_start;
+  char *op_end;
 
 
-#if 0
-  pj_operan_info operand[3];
-#endif
   pj_opc_info_t *opcode;
   char *output;
   int idx = 0;
   pj_opc_info_t *opcode;
   char *output;
   int idx = 0;
@@ -254,8 +240,9 @@ md_assemble (str)
     str++;
 
   /* Find the op code end.  */
     str++;
 
   /* Find the op code end.  */
-  for (op_start = op_end = (unsigned char *) (str);
-       *op_end && !is_end_of_line[*op_end] && *op_end != ' ';
+  op_start = str;
+  for (op_end = str;
+       *op_end && !is_end_of_line[*op_end & 0xff] && *op_end != ' ';
        op_end++)
     nlen++;
 
        op_end++)
     nlen++;
 
@@ -274,11 +261,12 @@ md_assemble (str)
       return;
     }
 
       return;
     }
 
+  dwarf2_emit_insn (0);
   if (opcode->opcode == -1)
     {
       /* It's a fake opcode.  Dig out the args and pretend that was
          what we were passed.  */
   if (opcode->opcode == -1)
     {
       /* It's a fake opcode.  Dig out the args and pretend that was
          what we were passed.  */
-      ((void (*) ()) opcode->name) (opcode, op_end);
+      (*opcode->u.func) (opcode, op_end);
     }
   else
     {
     }
   else
     {
@@ -298,7 +286,7 @@ md_assemble (str)
            op_end++;
 
          if (*op_end == 0)
            op_end++;
 
          if (*op_end == 0)
-           as_bad ("expected expresssion");
+           as_bad (_("expected expression"));
 
          op_end = parse_exp_save_ilp (op_end, &arg);
 
 
          op_end = parse_exp_save_ilp (op_end, &arg);
 
@@ -317,76 +305,24 @@ md_assemble (str)
        op_end++;
 
       if (*op_end != 0)
        op_end++;
 
       if (*op_end != 0)
-       as_warn ("extra stuff on line ignored");
+       as_warn (_("extra stuff on line ignored"));
 
     }
 
   if (pending_reloc)
 
     }
 
   if (pending_reloc)
-    as_bad ("Something forgot to clean up\n");
-
+    as_bad (_("Something forgot to clean up\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.  */
-
-char *
-md_atof (type, litP, sizeP)
-     int type;
-     char *litP;
-     int *sizeP;
+const char *
+md_atof (int type, char *litP, int *sizeP)
 {
 {
-  int prec;
-  LITTLENUM_TYPE words[4];
-  char *t;
-  int i;
-
-  switch (type)
-    {
-    case 'f':
-      prec = 2;
-      break;
-
-    case 'd':
-      prec = 4;
-      break;
-
-    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 * 2;
-
-  if (!target_big_endian)
-    {
-      for (i = prec - 1; i >= 0; i--)
-       {
-         md_number_to_chars (litP, (valueT) words[i], 2);
-         litP += 2;
-       }
-    }
-  else
-    {
-      for (i = 0; i < prec; i++)
-       {
-         md_number_to_chars (litP, (valueT) words[i], 2);
-         litP += 2;
-       }
-    }
-
-  return NULL;
+  return ieee_md_atof (type, litP, sizeP, target_big_endian);
 }
 \f
 }
 \f
-CONST char *md_shortopts = "";
-
-struct option md_longopts[] = {
+const char *md_shortopts = "";
 
 
+struct option md_longopts[] =
+{
 #define OPTION_LITTLE (OPTION_MD_BASE)
 #define OPTION_BIG    (OPTION_LITTLE + 1)
 
 #define OPTION_LITTLE (OPTION_MD_BASE)
 #define OPTION_BIG    (OPTION_LITTLE + 1)
 
@@ -397,17 +333,15 @@ struct option md_longopts[] = {
 size_t md_longopts_size = sizeof (md_longopts);
 
 int
 size_t md_longopts_size = sizeof (md_longopts);
 
 int
-md_parse_option (c, arg)
-     int c;
-     char *arg ATTRIBUTE_UNUSED;
+md_parse_option (int c, const char *arg ATTRIBUTE_UNUSED)
 {
   switch (c)
     {
     case OPTION_LITTLE:
 {
   switch (c)
     {
     case OPTION_LITTLE:
-      little ();
+      little (0);
       break;
     case OPTION_BIG:
       break;
     case OPTION_BIG:
-      big ();
+      big (0);
       break;
     default:
       return 0;
       break;
     default:
       return 0;
@@ -416,8 +350,7 @@ md_parse_option (c, arg)
 }
 
 void
 }
 
 void
-md_show_usage (stream)
-     FILE *stream;
+md_show_usage (FILE *stream)
 {
   fprintf (stream, _("\
 PJ options:\n\
 {
   fprintf (stream, _("\
 PJ options:\n\
@@ -427,32 +360,20 @@ PJ options:\n\
 
 /* Apply a fixup to the object file.  */
 
 
 /* Apply a fixup to the object file.  */
 
-int
-md_apply_fix (fixP, valp)
-     fixS *fixP;
-     valueT *valp;
+void
+md_apply_fix (fixS *fixP, valueT * valP, segT seg ATTRIBUTE_UNUSED)
 {
   char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
 {
   char *buf = fixP->fx_where + fixP->fx_frag->fr_literal;
-  long val = *valp;
+  long val = *valP;
   long max, min;
   long max, min;
-  int shift;
-
-  /* adjust_reloc_syms won't convert a reloc against a weak symbol
-     into a reloc against a section, but bfd_install_relocation will
-     screw up if the symbol is defined, so we have to adjust val here
-     to avoid the screw up later.  */
-
-  if (fixP->fx_addsy != NULL && S_IS_WEAK (fixP->fx_addsy))
-    val -= S_GET_VALUE (fixP->fx_addsy);
 
   max = min = 0;
 
   max = min = 0;
-  shift = 0;
   switch (fixP->fx_r_type)
     {
     case BFD_RELOC_VTABLE_INHERIT:
     case BFD_RELOC_VTABLE_ENTRY:
       fixP->fx_done = 0;
   switch (fixP->fx_r_type)
     {
     case BFD_RELOC_VTABLE_INHERIT:
     case BFD_RELOC_VTABLE_ENTRY:
       fixP->fx_done = 0;
-      return 0;
+      return;
 
     case BFD_RELOC_PJ_CODE_REL16:
       if (val < -0x8000 || val >= 0x7fff)
 
     case BFD_RELOC_PJ_CODE_REL16:
       if (val < -0x8000 || val >= 0x7fff)
@@ -519,6 +440,10 @@ md_apply_fix (fixP, valp)
        }
       break;
 
        }
       break;
 
+    case BFD_RELOC_PJ_CODE_REL32:
+      fixP->fx_done = 0;
+      return;
+
     default:
       abort ();
     }
     default:
       abort ();
     }
@@ -526,17 +451,15 @@ md_apply_fix (fixP, valp)
   if (max != 0 && (val < min || val > max))
     as_bad_where (fixP->fx_file, fixP->fx_line, _("offset out of range"));
 
   if (max != 0 && (val < min || val > max))
     as_bad_where (fixP->fx_file, fixP->fx_line, _("offset out of range"));
 
-  return 0;
+  if (fixP->fx_addsy == NULL && fixP->fx_pcrel == 0)
+    fixP->fx_done = 1;
 }
 
 /* Put number into target byte order.  Always put values in an
    executable section into big endian order.  */
 
 void
 }
 
 /* Put number into target byte order.  Always put values in an
    executable section into big endian order.  */
 
 void
-md_number_to_chars (ptr, use, nbytes)
-     char *ptr;
-     valueT use;
-     int nbytes;
+md_number_to_chars (char *ptr, valueT use, int nbytes)
 {
   if (target_big_endian || now_seg->flags & SEC_CODE)
     number_to_chars_bigendian (ptr, use, nbytes);
 {
   if (target_big_endian || now_seg->flags & SEC_CODE)
     number_to_chars_bigendian (ptr, use, nbytes);
@@ -548,15 +471,13 @@ md_number_to_chars (ptr, use, nbytes)
    format.  */
 
 arelent *
    format.  */
 
 arelent *
-tc_gen_reloc (section, fixp)
-     asection *section ATTRIBUTE_UNUSED;
-     fixS *fixp;
+tc_gen_reloc (asection *section ATTRIBUTE_UNUSED, fixS *fixp)
 {
   arelent *rel;
   bfd_reloc_code_real_type r_type;
 
 {
   arelent *rel;
   bfd_reloc_code_real_type r_type;
 
-  rel = (arelent *) xmalloc (sizeof (arelent));
-  rel->sym_ptr_ptr = (asymbol **) xmalloc (sizeof (asymbol *));
+  rel = XNEW (arelent);
+  rel->sym_ptr_ptr = XNEW (asymbol *);
   *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
 
   *rel->sym_ptr_ptr = symbol_get_bfdsym (fixp->fx_addsy);
   rel->address = fixp->fx_frag->fr_address + fixp->fx_where;
 
@@ -571,7 +492,7 @@ tc_gen_reloc (section, fixp)
                    bfd_get_reloc_code_name (r_type));
       /* Set howto to a garbage value so that we can keep going.  */
       rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
                    bfd_get_reloc_code_name (r_type));
       /* Set howto to a garbage value so that we can keep going.  */
       rel->howto = bfd_reloc_type_lookup (stdoutput, BFD_RELOC_32);
-      assert (rel->howto != NULL);
+      gas_assert (rel->howto != NULL);
     }
 
   return rel;
     }
 
   return rel;
This page took 0.029236 seconds and 4 git commands to generate.