gas/
authorJan Beulich <jbeulich@novell.com>
Tue, 28 Feb 2006 07:55:36 +0000 (07:55 +0000)
committerJan Beulich <jbeulich@novell.com>
Tue, 28 Feb 2006 07:55:36 +0000 (07:55 +0000)
2006-02-28  Jan Beulich  <jbeulich@novell.com>

PR/1070
* macro.c (getstring): Don't treat parentheses special anymore.
(get_any_string): Don't consider '(' and ')' as quoting anymore.
Special-case '(', ')', '[', and ']' when dealing with non-quoting
characters.

gas/testsuite/
2006-02-28  Jan Beulich  <jbeulich@novell.com>

* gas/macros/paren[sd]: New.
* gas/macros/macros.exp: Run new test.

gas/ChangeLog
gas/macro.c
gas/testsuite/ChangeLog
gas/testsuite/gas/macros/macros.exp
gas/testsuite/gas/macros/paren.d [new file with mode: 0644]
gas/testsuite/gas/macros/paren.s [new file with mode: 0644]

index 75d9eda..83d9f6b 100644 (file)
@@ -1,3 +1,11 @@
+2006-02-28  Jan Beulich  <jbeulich@novell.com>
+
+       PR/1070
+       * macro.c (getstring): Don't treat parentheses special anymore.
+       (get_any_string): Don't consider '(' and ')' as quoting anymore.
+       Special-case '(', ')', '[', and ']' when dealing with non-quoting
+       characters.
+
 2006-02-28  Mat <mat@csail.mit.edu>
 
        * dwarf2dbg.c (get_filenum): Don't inadvertently decrease files_in_use.
index 23156a1..0f3d507 100644 (file)
@@ -303,18 +303,14 @@ getstring (int idx, sb *in, sb *acc)
 {
   while (idx < in->len
         && (in->ptr[idx] == '"'
-            || in->ptr[idx] == '('
             || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
             || (in->ptr[idx] == '\'' && macro_alternate)))
     {
       if (in->ptr[idx] == '<')
        {
          int nest = 0;
-         char start_char = '>';
-         char end_char = '>';
-
          idx++;
-         while ((in->ptr[idx] != end_char || nest)
+         while ((in->ptr[idx] != '>' || nest)
                 && idx < in->len)
            {
              if (in->ptr[idx] == '!')
@@ -324,37 +320,15 @@ getstring (int idx, sb *in, sb *acc)
                }
              else
                {
-                 if (in->ptr[idx] == end_char)
+                 if (in->ptr[idx] == '>')
                    nest--;
-                 if (in->ptr[idx] == start_char)
+                 if (in->ptr[idx] == '<')
                    nest++;
                  sb_add_char (acc, in->ptr[idx++]);
                }
            }
          idx++;
        }
-      else if (in->ptr[idx] == '(')
-       {
-         int nest = 0;
-         char c;
-
-         do
-           {
-             c = in->ptr[idx];
-
-             if (c == '!')
-               c = in->ptr[++idx];
-             else if (c == ')')
-               nest--;
-             else if (c == '(')
-               nest++;
-
-             sb_add_char (acc, c);
-             idx++;
-           }
-         while ((c != ')' || nest)
-                && idx < in->len);
-       }
       else if (in->ptr[idx] == '"' || in->ptr[idx] == '\'')
        {
          char tchar = in->ptr[idx];
@@ -438,7 +412,6 @@ get_any_string (int idx, sb *in, sb *out)
          sb_add_string (out, buf);
        }
       else if (in->ptr[idx] == '"'
-              || in->ptr[idx] == '('
               || (in->ptr[idx] == '<' && (macro_alternate || macro_mri))
               || (macro_alternate && in->ptr[idx] == '\''))
        {
@@ -457,27 +430,57 @@ get_any_string (int idx, sb *in, sb *out)
        }
       else
        {
+         char *br_buf = xmalloc(1);
+         char *in_br = br_buf;
+
+         *in_br = '\0';
          while (idx < in->len
-                && in->ptr[idx] != ' '
-                && in->ptr[idx] != '\t'
+                && (*in_br
+                    || (in->ptr[idx] != ' '
+                        && in->ptr[idx] != '\t'))
                 && in->ptr[idx] != ','
                 && (in->ptr[idx] != '<'
                     || (! macro_alternate && ! macro_mri)))
            {
-             if (in->ptr[idx] == '"'
-                 || in->ptr[idx] == '\'')
-               {
-                 char tchar = in->ptr[idx];
+             char tchar = in->ptr[idx];
 
+             switch (tchar)
+               {
+               case '"':
+               case '\'':
                  sb_add_char (out, in->ptr[idx++]);
                  while (idx < in->len
                         && in->ptr[idx] != tchar)
                    sb_add_char (out, in->ptr[idx++]);
                  if (idx == in->len)
                    return idx;
+                 break;
+               case '(':
+               case '[':
+                 if (in_br > br_buf)
+                   --in_br;
+                 else
+                   {
+                     br_buf = xmalloc(strlen(in_br) + 2);
+                     strcpy(br_buf + 1, in_br);
+                     free(in_br);
+                     in_br = br_buf;
+                   }
+                 *in_br = tchar;
+                 break;
+               case ')':
+                 if (*in_br == '(')
+                   ++in_br;
+                 break;
+               case ']':
+                 if (*in_br == '[')
+                   ++in_br;
+                 break;
                }
-             sb_add_char (out, in->ptr[idx++]);
+             sb_add_char (out, tchar);
+             ++idx;
            }
+         free(br_buf);
        }
     }
 
index 53c6926..4f3e09d 100644 (file)
@@ -1,3 +1,8 @@
+2006-02-28  Jan Beulich  <jbeulich@novell.com>
+
+       * gas/macros/paren[sd]: New.
+       * gas/macros/macros.exp: Run new test.
+
 2006-02-27  H.J. Lu <hongjiu.lu@intel.com>
 
        * gas/i386/i386.exp: Add merom and x86-64-merom.
index 3bd1982..e175ad9 100644 (file)
@@ -82,3 +82,9 @@ case $target_triplet in {
 run_list_test end ""
 run_list_test purge "--hash-size=8000"
 run_list_test redef ""
+
+# This test is valid only when '!' is not a comment character
+# (it is allowed to be a line comment character).
+if [string match "" [lindex [gas_run ../all/excl.s "-o /dev/null" ""] 0]] {
+    run_dump_test paren
+}
diff --git a/gas/testsuite/gas/macros/paren.d b/gas/testsuite/gas/macros/paren.d
new file mode 100644 (file)
index 0000000..e4c0975
--- /dev/null
@@ -0,0 +1,9 @@
+#as: -f
+#objdump: -s -j .data
+#name parenthesized macro arguments
+
+.*: .*
+
+Contents of section .data:
+ 0000 01000202 020402.. ........ ........  ................
+#pass
diff --git a/gas/testsuite/gas/macros/paren.s b/gas/testsuite/gas/macros/paren.s
new file mode 100644 (file)
index 0000000..f8462e5
--- /dev/null
@@ -0,0 +1,12 @@
+ .data
+ .macro m x
+ .byte (\x)
+ .endm
+
+       m       (1)
+       m       (!1)
+       m       (1)+(1)
+       m       1+(1)
+       m       (1 + 1)
+       m       (1 + 1)*(1 + 1)
+       m       (! 0)+(! 0)