Fix Opcode generation of ld a,(bc) and ld a,(de) on target z80
[binutils-gdb.git] / gas / read.c
index baf85be39b13fd8b4d22706525e5f1ab110cafb4..ec69c4e7a90f84a6f01025f133e5e6dd432c2175 100644 (file)
@@ -1,6 +1,6 @@
 /* read.c - read a source file -
    Copyright 1986, 1987, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997,
-   1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007
+   1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008
    Free Software Foundation, Inc.
 
    This file is part of GAS, the GNU Assembler.
@@ -1276,13 +1276,14 @@ do_align (int n, char *fill, int len, int max)
    (in bytes).  A negative ARG is the negative of the length of the
    fill pattern.  BYTES_P is non-zero if the alignment value should be
    interpreted as the byte boundary, rather than the power of 2.  */
-
-#define ALIGN_LIMIT (stdoutput->arch_info->bits_per_address - 1)
+#ifndef TC_ALIGN_LIMIT
+#define TC_ALIGN_LIMIT (stdoutput->arch_info->bits_per_address - 1)
+#endif
 
 static void
 s_align (int arg, int bytes_p)
 {
-  unsigned int align_limit = ALIGN_LIMIT;
+  unsigned int align_limit = TC_ALIGN_LIMIT;
   unsigned int align;
   char *stop = NULL;
   char stopc = 0;
@@ -2553,8 +2554,13 @@ s_macro (int ignore ATTRIBUTE_UNUSED)
 void
 s_mexit (int ignore ATTRIBUTE_UNUSED)
 {
-  cond_exit_macro (macro_nest);
-  buffer_limit = input_scrub_next_buffer (&input_line_pointer);
+  if (macro_nest)
+    {
+      cond_exit_macro (macro_nest);
+      buffer_limit = input_scrub_next_buffer (&input_line_pointer);
+    }
+  else
+    as_warn (_("ignoring macro exit outside a macro definition."));
 }
 
 /* Switch in and out of MRI mode.  */
@@ -3167,7 +3173,7 @@ s_space (int mult)
 
       if (exp.X_op == O_constant)
        {
-         long repeat;
+         offsetT repeat;
 
          repeat = exp.X_add_number;
          if (mult)
@@ -3297,7 +3303,7 @@ s_float_space (int float_type)
 
       err = md_atof (float_type, temp, &flen);
       know (flen <= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT);
-      know (flen > 0);
+      know (err != NULL || flen > 0);
       if (err)
        {
          as_bad (_("bad floating literal: %s"), err);
@@ -3448,14 +3454,15 @@ s_weakref (int ignore ATTRIBUTE_UNUSED)
          char *loop;
 
          loop = concat (S_GET_NAME (symbolP),
-                        " => ", S_GET_NAME (symbolP2), NULL);
+                        " => ", S_GET_NAME (symbolP2), (const char *) NULL);
 
          symp = symbolP2;
          while (symp != symbolP)
            {
              char *old_loop = loop;
              symp = symbol_get_value_expression (symp)->X_add_symbol;
-             loop = concat (loop, " => ", S_GET_NAME (symp), NULL);
+             loop = concat (loop, " => ", S_GET_NAME (symp),
+                            (const char *) NULL);
              free (old_loop);
            }
 
@@ -3602,6 +3609,12 @@ pseudo_set (symbolS *symbolP)
       break;
 
     case O_register:
+      if (S_IS_EXTERNAL (symbolP))
+       {
+         as_bad ("can't equate global symbol `%s' with register name",
+                 S_GET_NAME (symbolP));
+         return;
+       }
       S_SET_SEGMENT (symbolP, reg_section);
       S_SET_VALUE (symbolP, (valueT) exp.X_add_number);
       set_zero_frag (symbolP);
@@ -4111,8 +4124,13 @@ emit_expr (expressionS *exp, unsigned int nbytes)
              || (get & hibit) == 0))
        {               /* Leading bits contain both 0s & 1s.  */
 #if defined (BFD64) && BFD_HOST_64BIT_LONG_LONG
+#ifndef __MSVCRT__
          as_warn (_("value 0x%llx truncated to 0x%llx"),
                   (unsigned long long) get, (unsigned long long) use);
+#else
+         as_warn (_("value 0x%I64x truncated to 0x%I64x"),
+                  (unsigned long long) get, (unsigned long long) use);
+#endif
 #else
          as_warn (_("value 0x%lx truncated to 0x%lx"),
                   (unsigned long) get, (unsigned long) use);
@@ -4174,41 +4192,45 @@ emit_expr (expressionS *exp, unsigned int nbytes)
        }
     }
   else
-    {
-      memset (p, 0, nbytes);
+    emit_expr_fix (exp, nbytes, frag_now, p);
+}
 
-      /* Now we need to generate a fixS to record the symbol value.  */
+void
+emit_expr_fix (expressionS *exp, unsigned int nbytes, fragS *frag, char *p)
+{
+  memset (p, 0, nbytes);
+
+  /* Generate a fixS to record the symbol value.  */
 
 #ifdef TC_CONS_FIX_NEW
-      TC_CONS_FIX_NEW (frag_now, p - frag_now->fr_literal, nbytes, exp);
+  TC_CONS_FIX_NEW (frag, p - frag->fr_literal, nbytes, exp);
 #else
-      {
-       bfd_reloc_code_real_type r;
+  {
+    bfd_reloc_code_real_type r;
 
-       switch (nbytes)
-         {
-         case 1:
-           r = BFD_RELOC_8;
-           break;
-         case 2:
-           r = BFD_RELOC_16;
-           break;
-         case 4:
-           r = BFD_RELOC_32;
-           break;
-         case 8:
-           r = BFD_RELOC_64;
-           break;
-         default:
-           as_bad (_("unsupported BFD relocation size %u"), nbytes);
-           r = BFD_RELOC_32;
-           break;
-         }
-       fix_new_exp (frag_now, p - frag_now->fr_literal, (int) nbytes, exp,
-                    0, r);
+    switch (nbytes)
+      {
+      case 1:
+       r = BFD_RELOC_8;
+       break;
+      case 2:
+       r = BFD_RELOC_16;
+       break;
+      case 4:
+       r = BFD_RELOC_32;
+       break;
+      case 8:
+       r = BFD_RELOC_64;
+       break;
+      default:
+       as_bad (_("unsupported BFD relocation size %u"), nbytes);
+       r = BFD_RELOC_32;
+       break;
       }
+    fix_new_exp (frag, p - frag->fr_literal, (int) nbytes, exp,
+                0, r);
+  }
 #endif
-    }
 }
 \f
 #ifdef BITFIELD_CONS_EXPRESSIONS
@@ -4602,7 +4624,7 @@ float_cons (/* Clobbers input_line-pointer, checks end-of-line.  */
        {
          err = md_atof (float_type, temp, &length);
          know (length <= MAXIMUM_NUMBER_OF_CHARS_FOR_FLOAT);
-         know (length > 0);
+         know (err != NULL || length > 0);
          if (err)
            {
              as_bad (_("bad floating literal: %s"), err);
@@ -5671,14 +5693,20 @@ do_s_func (int end_p, const char *default_prefix)
       if (*input_line_pointer != ',')
        {
          if (default_prefix)
-           asprintf (&label, "%s%s", default_prefix, name);
+           {
+             if (asprintf (&label, "%s%s", default_prefix, name) == -1)
+               as_fatal ("%s", xstrerror (errno));
+           }
          else
            {
              char leading_char = bfd_get_symbol_leading_char (stdoutput);
              /* Missing entry point, use function's name with the leading
                 char prepended.  */
              if (leading_char)
-               asprintf (&label, "%c%s", leading_char, name);
+               {
+                 if (asprintf (&label, "%c%s", leading_char, name) == -1)
+                   as_fatal ("%s", xstrerror (errno));
+               }
              else
                label = name;
            }