Allow symbol and label names to be enclosed in double quotes.
[deliverable/binutils-gdb.git] / gas / config / tc-rx.c
index 0e4b7a81830c5c35a80e990142cec06a82449dde..e70295d7dc6d3e76d20666bb99b2702189b8bffa 100644 (file)
@@ -1,5 +1,5 @@
 /* tc-rx.c -- Assembler for the Renesas RX
-   Copyright 2008-2013 Free Software Foundation, Inc.
+   Copyright (C) 2008-2015 Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
 
@@ -20,7 +20,6 @@
 
 #include "as.h"
 #include "struc-symbol.h"
-#include "obstack.h"
 #include "safe-ctype.h"
 #include "dwarf2dbg.h"
 #include "libbfd.h"
@@ -74,6 +73,7 @@ enum options
   OPTION_USES_GCC_ABI,
   OPTION_USES_RX_ABI,
   OPTION_CPU,
+  OPTION_DISALLOW_STRING_INSNS,
 };
 
 #define RX_SHORTOPTS ""
@@ -100,7 +100,8 @@ struct option md_longopts[] =
   {"mint-register", required_argument, NULL, OPTION_INT_REGS},
   {"mgcc-abi", no_argument, NULL, OPTION_USES_GCC_ABI},
   {"mrx-abi", no_argument, NULL, OPTION_USES_RX_ABI},
-  {"mcpu",required_argument,NULL,OPTION_CPU},
+  {"mcpu", required_argument, NULL, OPTION_CPU},
+  {"mno-allow-string-insns", no_argument, NULL, OPTION_DISALLOW_STRING_INSNS},
   {NULL, no_argument, NULL, 0}
 };
 size_t md_longopts_size = sizeof (md_longopts);
@@ -174,6 +175,10 @@ md_parse_option (int c ATTRIBUTE_UNUSED, char * arg ATTRIBUTE_UNUSED)
          break;
        }
       return 1;
+
+    case OPTION_DISALLOW_STRING_INSNS:
+      elf_flags |= E_FLAG_RX_SINSNS_SET | E_FLAG_RX_SINSNS_NO;
+      return 1;
     }
   return 0;
 }
@@ -193,6 +198,7 @@ md_show_usage (FILE * stream)
   fprintf (stream, _("  --mpid\n"));
   fprintf (stream, _("  --mint-register=<value>\n"));
   fprintf (stream, _("  --mcpu=<rx100|rx200|rx600|rx610>\n"));
+  fprintf (stream, _("  --mno-allow-string-insns"));
 }
 
 static void
@@ -936,43 +942,50 @@ rx_field5s2 (expressionS exp)
 void
 rx_op (expressionS exp, int nbytes, int type)
 {
-  int v = 0;
+  offsetT v = 0;
 
   if ((exp.X_op == O_constant || exp.X_op == O_big)
       && type != RXREL_PCREL)
     {
-      if (exp.X_op == O_big && exp.X_add_number <= 0)
+      if (exp.X_op == O_big)
        {
-         LITTLENUM_TYPE w[2];
-         char * ip = rx_bytes.ops + rx_bytes.n_ops;
+         if (exp.X_add_number == -1)
+           {
+             LITTLENUM_TYPE w[2];
+             char * ip = rx_bytes.ops + rx_bytes.n_ops;
 
-         gen_to_words (w, F_PRECISION, 8);
+             gen_to_words (w, F_PRECISION, 8);
 #if RX_OPCODE_BIG_ENDIAN
-         ip[0] = w[0] >> 8;
-         ip[1] = w[0];
-         ip[2] = w[1] >> 8;
-         ip[3] = w[1];
+             ip[0] = w[0] >> 8;
+             ip[1] = w[0];
+             ip[2] = w[1] >> 8;
+             ip[3] = w[1];
 #else
-         ip[3] = w[0] >> 8;
-         ip[2] = w[0];
-         ip[1] = w[1] >> 8;
-         ip[0] = w[1];
+             ip[3] = w[0] >> 8;
+             ip[2] = w[0];
+             ip[1] = w[1] >> 8;
+             ip[0] = w[1];
 #endif
-         rx_bytes.n_ops += 4;
+             rx_bytes.n_ops += 4;
+             return;
+           }
+
+         v = ((generic_bignum[1] & LITTLENUM_MASK) << LITTLENUM_NUMBER_OF_BITS)
+           |  (generic_bignum[0] & LITTLENUM_MASK);
+
        }
       else
+       v = exp.X_add_number;
+
+      while (nbytes)
        {
-         v = exp.X_add_number;
-         while (nbytes)
-           {
 #if RX_OPCODE_BIG_ENDIAN
-             OP ((v >> (8 * (nbytes - 1))) & 0xff);
+         OP ((v >> (8 * (nbytes - 1))) & 0xff);
 #else
-             OP (v & 0xff);
-             v >>= 8;
+         OP (v & 0xff);
+         v >>= 8;
 #endif
-             nbytes --;
-           }
+         nbytes --;
        }
     }
   else
@@ -2170,10 +2183,9 @@ void
 rx_cons_fix_new (fragS *       frag,
                 int            where,
                 int            size,
-                expressionS *  exp)
+                expressionS *  exp,
+                bfd_reloc_code_real_type type)
 {
-  bfd_reloc_code_real_type type;
-
   switch (size)
     {
     case 1:
@@ -2428,7 +2440,7 @@ tc_gen_reloc (asection * sec ATTRIBUTE_UNUSED, fixS * fixp)
     }
   else if (sec)
     is_opcode = sec->flags & SEC_CODE;
-      
+
   /* Certain BFD relocations cannot be translated directly into
      a single (non-Red Hat) RX relocation, but instead need
      multiple RX relocations - handle them here.  */
@@ -2625,6 +2637,14 @@ tc_gen_reloc (asection * sec ATTRIBUTE_UNUSED, fixS * fixp)
   return reloc;
 }
 
+void
+rx_note_string_insn_use (void)
+{
+  if ((elf_flags & E_FLAG_RX_SINSNS_MASK) == (E_FLAG_RX_SINSNS_SET | E_FLAG_RX_SINSNS_NO))
+    as_bad (_("Use of an RX string instruction detected in a file being assembled without string instruction support"));
+  elf_flags |= E_FLAG_RX_SINSNS_SET | E_FLAG_RX_SINSNS_YES;
+}
+
 /* Set the ELF specific flags.  */
 
 void
This page took 0.02523 seconds and 4 git commands to generate.