OSDN Git Service

PR gas/1491
authoramodra <amodra>
Thu, 15 Oct 2009 10:58:34 +0000 (10:58 +0000)
committeramodra <amodra>
Thu, 15 Oct 2009 10:58:34 +0000 (10:58 +0000)
gas/
* macro.c: Delete unnecessary function declarations.
(buffer_and_nest): Support multiple labels per line for
LABELS_WITHOUT_COLONS targets if the labels do have colons.
(free_macro): Move so that we don't need forward declaration.
* read.c (read_a_source_file): Take a copy of macro expansion line
before we trim labels.
* listing.c (listing_newline): Adjust stdin line save for
input_line_pointer still at start of line.
gas/testsuite/
* gas/macros/dot.s: Don't start macro invocations is first column.
* gas/macros/dot.l: Update.
* gas/macros/macros.exp: Run dot test on more targets.

gas/ChangeLog
gas/listing.c
gas/macro.c
gas/read.c
gas/testsuite/ChangeLog
gas/testsuite/gas/macros/dot.l
gas/testsuite/gas/macros/dot.s
gas/testsuite/gas/macros/macros.exp

index af39035..2888010 100644 (file)
@@ -1,3 +1,15 @@
+2009-10-15  Alan Modra  <amodra@bigpond.net.au>
+
+       PR gas/1491
+       * macro.c: Delete unnecessary function declarations.
+       (buffer_and_nest): Support multiple labels per line for
+       LABELS_WITHOUT_COLONS targets if the labels do have colons.
+       (free_macro): Move so that we don't need forward declaration.
+       * read.c (read_a_source_file): Take a copy of macro expansion line
+       before we trim labels.
+       * listing.c (listing_newline): Adjust stdin line save for
+       input_line_pointer still at start of line.
+
 2009-10-13  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR gas/10766
index c8b6d63..d1c291c 100644 (file)
@@ -342,7 +342,7 @@ listing_newline (char *ps)
          int seen_quote = 0;
          int seen_slash = 0;
 
-         for (copy = input_line_pointer - 1;
+         for (copy = input_line_pointer;
               *copy && (seen_quote
                         || is_end_of_line [(unsigned char) *copy] != 1);
               copy++)
@@ -353,13 +353,13 @@ listing_newline (char *ps)
                seen_quote = ! seen_quote;
            }
 
-         len = (copy - input_line_pointer) + 2;
+         len = copy - input_line_pointer + 1;
 
          copy = (char *) xmalloc (len);
 
          if (copy != NULL)
            {
-             char *src = input_line_pointer - 1;
+             char *src = input_line_pointer;
              char *dest = copy;
 
              while (--len)
index dd7f9a2..f77be59 100644 (file)
 /* The routines in this file handle macro definition and expansion.
    They are called by gas.  */
 
-/* Internal functions.  */
-
-static int get_token (int, sb *, sb *);
-static int getstring (int, sb *, sb *);
-static int get_any_string (int, sb *, sb *);
-static formal_entry *new_formal (void);
-static void del_formal (formal_entry *);
-static int do_formals (macro_entry *, int, sb *);
-static int get_apost_token (int, sb *, sb *, int);
-static int sub_actual (int, sb *, sb *, struct hash_control *, int, sb *, int);
-static const char *macro_expand_body
-  (sb *, sb *, formal_entry *, struct hash_control *, const macro_entry *);
-static const char *macro_expand (int, sb *, macro_entry *, sb *);
-static void free_macro(macro_entry *);
-
 #define ISWHITE(x) ((x) == ' ' || (x) == '\t')
 
 #define ISSEP(x) \
@@ -146,6 +131,7 @@ buffer_and_nest (const char *from, const char *to, sb *ptr,
     {
       /* Try to find the first pseudo op on the line.  */
       int i = line_start;
+      bfd_boolean had_colon = FALSE;
 
       /* With normal syntax we can suck what we want till we get
         to the dot.  With the alternate, labels have to start in
@@ -169,19 +155,24 @@ buffer_and_nest (const char *from, const char *to, sb *ptr,
            i++;
          if (i < ptr->len && is_name_ender (ptr->ptr[i]))
            i++;
-         if (LABELS_WITHOUT_COLONS)
-           break;
          /* Skip whitespace.  */
          while (i < ptr->len && ISWHITE (ptr->ptr[i]))
            i++;
          /* Check for the colon.  */
          if (i >= ptr->len || ptr->ptr[i] != ':')
            {
+             /* LABELS_WITHOUT_COLONS doesn't mean we cannot have a
+                colon after a label.  If we do have a colon on the
+                first label then handle more than one label on the
+                line, assuming that each label has a colon.  */
+             if (LABELS_WITHOUT_COLONS && !had_colon)
+               break;
              i = line_start;
              break;
            }
          i++;
          line_start = i;
+         had_colon = TRUE;
        }
 
       /* Skip trailing whitespace.  */
@@ -606,6 +597,26 @@ do_formals (macro_entry *macro, int idx, sb *in)
   return idx;
 }
 
+/* Free the memory allocated to a macro.  */
+
+static void
+free_macro (macro_entry *macro)
+{
+  formal_entry *formal;
+
+  for (formal = macro->formals; formal; )
+    {
+      formal_entry *f;
+
+      f = formal;
+      formal = formal->next;
+      del_formal (f);
+    }
+  hash_die (macro->formal_hash);
+  sb_kill (&macro->sub);
+  free (macro);
+}
+
 /* Define a new macro.  Returns NULL on success, otherwise returns an
    error message.  If NAMEP is not NULL, *NAMEP is set to the name of
    the macro which was defined.  */
@@ -1235,26 +1246,6 @@ check_macro (const char *line, sb *expand,
   return 1;
 }
 
-/* Free the memory allocated to a macro.  */
-
-static void
-free_macro(macro_entry *macro)
-{
-  formal_entry *formal;
-
-  for (formal = macro->formals; formal; )
-    {
-      formal_entry *f;
-
-      f = formal;
-      formal = formal->next;
-      del_formal (f);
-    }
-  hash_die (macro->formal_hash);
-  sb_kill (&macro->sub);
-  free (macro);
-}
-
 /* Delete a macro.  */
 
 void
index cf4461e..6144570 100644 (file)
@@ -620,19 +620,57 @@ read_a_source_file (char *name)
 #endif
       while (input_line_pointer < buffer_limit)
        {
+         bfd_boolean was_new_line;
          /* We have more of this buffer to parse.  */
 
          /* We now have input_line_pointer->1st char of next line.
             If input_line_pointer [-1] == '\n' then we just
             scanned another line: so bump line counters.  */
-         if (is_end_of_line[(unsigned char) input_line_pointer[-1]])
+         was_new_line = is_end_of_line[(unsigned char) input_line_pointer[-1]];
+         if (was_new_line)
            {
 #ifdef md_start_line_hook
              md_start_line_hook ();
 #endif
              if (input_line_pointer[-1] == '\n')
                bump_line_counters ();
+           }
 
+#ifndef NO_LISTING
+         /* If listing is on, and we are expanding a macro, then give
+            the listing code the contents of the expanded line.  */
+         if (listing)
+           {
+             if ((listing & LISTING_MACEXP) && macro_nest > 0)
+               {
+                 /* Find the end of the current expanded macro line.  */
+                 s = find_end_of_line (input_line_pointer, flag_m68k_mri);
+
+                 if (s != last_eol)
+                   {
+                     char *copy;
+                     int len;
+
+                     last_eol = s;
+                     /* Copy it for safe keeping.  Also give an indication of
+                        how much macro nesting is involved at this point.  */
+                     len = s - input_line_pointer;
+                     copy = (char *) xmalloc (len + macro_nest + 2);
+                     memset (copy, '>', macro_nest);
+                     copy[macro_nest] = ' ';
+                     memcpy (copy + macro_nest + 1, input_line_pointer, len);
+                     copy[macro_nest + 1 + len] = '\0';
+
+                     /* Install the line with the listing facility.  */
+                     listing_newline (copy);
+                   }
+               }
+             else
+               listing_newline (NULL);
+           }
+#endif
+         if (was_new_line)
+           {
              line_label = NULL;
 
              if (LABELS_WITHOUT_COLONS || flag_m68k_mri)
@@ -645,7 +683,6 @@ read_a_source_file (char *name)
                      char c;
                      int mri_line_macro;
 
-                     LISTING_NEWLINE ();
                      HANDLE_CONDITIONAL_ASSEMBLY ();
 
                      c = get_symbol_end ();
@@ -712,39 +749,6 @@ read_a_source_file (char *name)
            c = *input_line_pointer++;
          while (c == '\t' || c == ' ' || c == '\f');
 
-#ifndef NO_LISTING
-         /* If listing is on, and we are expanding a macro, then give
-            the listing code the contents of the expanded line.  */
-         if (listing)
-           {
-             if ((listing & LISTING_MACEXP) && macro_nest > 0)
-               {
-                 char *copy;
-                 int len;
-
-                 /* Find the end of the current expanded macro line.  */
-                 s = find_end_of_line (input_line_pointer - 1, flag_m68k_mri);
-
-                 if (s != last_eol)
-                   {
-                     last_eol = s;
-                     /* Copy it for safe keeping.  Also give an indication of
-                        how much macro nesting is involved at this point.  */
-                     len = s - (input_line_pointer - 1);
-                     copy = (char *) xmalloc (len + macro_nest + 2);
-                     memset (copy, '>', macro_nest);
-                     copy[macro_nest] = ' ';
-                     memcpy (copy + macro_nest + 1, input_line_pointer - 1, len);
-                     copy[macro_nest + 1 + len] = '\0';
-
-                     /* Install the line with the listing facility.  */
-                     listing_newline (copy);
-                   }
-               }
-             else
-               listing_newline (NULL);
-           }
-#endif
          /* C is the 1st significant character.
             Input_line_pointer points after that character.  */
          if (is_name_beginner (c))
index b86bd64..5227066 100644 (file)
@@ -1,3 +1,10 @@
+2009-10-15  Alan Modra  <amodra@bigpond.net.au>
+
+       PR gas/1491
+       * gas/macros/dot.s: Don't start macro invocations is first column.
+       * gas/macros/dot.l: Update.
+       * gas/macros/macros.exp: Run dot test on more targets.
+
 2009-10-13  H.J. Lu  <hongjiu.lu@intel.com>
 
        PR gas/10740
index 980de4f..5c616b0 100644 (file)
@@ -4,16 +4,16 @@
 .*:28: Error: .*
 #...
 [      ]*[1-9][0-9]*[  ]+m 4, 2
-[      ]*[1-9][0-9]*[  ]+> \.data
+[      ]*[1-9][0-9]*[  ]+>  \.data
 [      ]*[1-9][0-9]*[  ]+> labelA:labelB:labelC:labelD:x\.y\.z 4\+2
-[      ]*[1-9][0-9]*[  ]+>> \.align 4
-[      ]*[1-9][0-9]*[  ]+\?+[  ]+0606[         ]+>> \.byte 4\+2,4\+2
-[      ]*[1-9][0-9]*[  ]+\?+[  ]+0000[         ]+> \.skip 2
+[      ]*[1-9][0-9]*[  ]+>>  \.align 4
+[      ]*[1-9][0-9]*[  ]+\?+[  ]+06 ?06[       ]+>>  \.byte 4\+2,4\+2
+[      ]*[1-9][0-9]*[  ]+\?+[  ]+00 ?00[       ]+>  \.skip 2
 [      ]*[1-9][0-9]*[  ]+> labelZ:labelY:labelX:labelW:\.xyz 4-2
-[      ]*[1-9][0-9]*[  ]+>> \.align 8
-[      ]*[1-9][0-9]*[  ]+\?+[  ]+0202[         ]+>> \.byte 4-2,4-2
-[      ]*[1-9][0-9]*[  ]+\?+[  ]+0000 ?0000[   ]+> \.skip 4\*2
-[      ]*[1-9][0-9]*[  ]+0000 ?0000[   ]*
+[      ]*[1-9][0-9]*[  ]+>>  \.align 8
+[      ]*[1-9][0-9]*[  ]+\?+[  ]+02 ?02[       ]+>>  \.byte 4-2,4-2
+[      ]*[1-9][0-9]*[  ]+\?+[  ]+00 ?00 ?00 ?00[       ]+>  \.skip 4\*2
+[      ]*[1-9][0-9]*[  ]+00 ?00 ?00 ?00[       ]*
 [      ]*[1-9][0-9]*[  ]+> label9:label8:label7:label6:
 [      ]*[1-9][0-9]*[  ]+
 [      ]*[1-9][0-9]*[  ]+\.purgem \.xyz, x\.y\.z
index 72ce972..1c9503b 100644 (file)
@@ -21,8 +21,8 @@ labelZ:labelY : labelX :labelW: .xyz arg.1-arg.2
  .skip arg.1*arg.2
 label9:label8 : label7 :label6: .endm
 
-m 4, 2
+ m 4, 2
 
  .purgem .xyz, x.y.z
  .xyz 0
-x.y.z 0
+ x.y.z 0
index 9a4aec8..d2e30bb 100644 (file)
@@ -61,12 +61,8 @@ run_list_test badarg ""
 case $target_triplet in {
     { *c54x*-*-* } { }
     { *c4x*-*-* } { }
-    { h8500-*-* } { }
-    { m68*-*-* } { }
-    { m88*-*-* } { }
     { mmix-* } { }
     { rx-*-* } { }
-    { z80-* } { }
     default { run_list_test dot "-alm" }
 }
 run_list_test end ""