gas/
authorJan Beulich <jbeulich@novell.com>
Mon, 31 Jan 2005 14:26:13 +0000 (14:26 +0000)
committerJan Beulich <jbeulich@novell.com>
Mon, 31 Jan 2005 14:26:13 +0000 (14:26 +0000)
2005-01-31  Jan Beulich  <jbeulich@novell.com>

* macro.c (do_formals): Adjust to no longer accept empty parameter
names.
(define_macro): Adjust to no longer accept empty macro name, garbage
following the parameters, or macros that were previously defined.
* read.c (s_bad_end): Declare.
(potable): Add endm. Handler for endr and endm is s_bad_end.
(s_bad_end): Rename from s_bad_endr. Adjust to handle both .endm
and .endr.
* read.h (s_bad_endr): Remove.

gas/testsuite/
2005-01-31  Jan Beulich  <jbeulich@novell.com>

* gas/macros/badarg.[ls]: New.
* gas/macros/end.[ls]: New.
* gas/macros/redef.[ls]: New.
* gas/macros/macros.exp (run_list_test): Copy from elsewhere.
Run new tests.

12 files changed:
gas/ChangeLog
gas/macro.c
gas/read.c
gas/read.h
gas/testsuite/ChangeLog
gas/testsuite/gas/macros/badarg.l [new file with mode: 0644]
gas/testsuite/gas/macros/badarg.s [new file with mode: 0644]
gas/testsuite/gas/macros/end.l [new file with mode: 0644]
gas/testsuite/gas/macros/end.s [new file with mode: 0644]
gas/testsuite/gas/macros/macros.exp
gas/testsuite/gas/macros/redef.l [new file with mode: 0644]
gas/testsuite/gas/macros/redef.s [new file with mode: 0644]

index c110fafd013338d7e581ff1bc42fdadb00e94fc8..01e2c04a1a245b1a76ba41a53f5fc4c132f1a244 100644 (file)
@@ -1,3 +1,15 @@
+2005-01-31  Jan Beulich  <jbeulich@novell.com>
+
+       * macro.c (do_formals): Adjust to no longer accept empty parameter
+       names.
+       (define_macro): Adjust to no longer accept empty macro name, garbage
+       following the parameters, or macros that were previously defined.
+       * read.c (s_bad_end): Declare.
+       (potable): Add endm. Handler for endr and endm is s_bad_end.
+       (s_bad_end): Rename from s_bad_endr. Adjust to handle both .endm
+       and .endr.
+       * read.h (s_bad_endr): Remove.
+
 2005-01-31  Jan Beulich  <jbeulich@novell.com>
 
        * config/tc-ia64.c (parse_operands): Parse all specified operands,
index edadcc947ae91cc6b15feb270c54ced642ee5b16..2173d00a17cb5ad19691666df49a526775fd2cd6 100644 (file)
@@ -435,9 +435,11 @@ do_formals (macro_entry *macro, int idx, sb *in)
 
   macro->formal_count = 0;
   macro->formal_hash = hash_new ();
+  idx = sb_skip_white (idx, in);
   while (idx < in->len)
     {
       formal_entry *formal;
+      int cidx;
 
       formal = (formal_entry *) xmalloc (sizeof (formal_entry));
 
@@ -445,27 +447,33 @@ do_formals (macro_entry *macro, int idx, sb *in)
       sb_new (&formal->def);
       sb_new (&formal->actual);
 
-      idx = sb_skip_white (idx, in);
       idx = get_token (idx, in, &formal->name);
       if (formal->name.len == 0)
-       break;
+       {
+         if (macro->formal_count)
+           --idx;
+         break;
+       }
       idx = sb_skip_white (idx, in);
-      if (formal->name.len)
+      /* This is a formal.  */
+      if (idx < in->len && in->ptr[idx] == '=')
        {
-         /* This is a formal.  */
-         if (idx < in->len && in->ptr[idx] == '=')
-           {
-             /* Got a default.  */
-             idx = get_any_string (idx + 1, in, &formal->def, 1, 0);
-           }
+         /* Got a default.  */
+         idx = get_any_string (idx + 1, in, &formal->def, 1, 0);
+         idx = sb_skip_white (idx, in);
        }
 
       /* Add to macro's hash table.  */
       hash_jam (macro->formal_hash, sb_terminate (&formal->name), formal);
 
-      formal->index = macro->formal_count;
+      formal->index = macro->formal_count++;
+      cidx = idx;
       idx = sb_skip_comma (idx, in);
-      macro->formal_count++;
+      if (idx != cidx && idx >= in->len)
+       {
+         idx = cidx;
+         break;
+       }
       *p = formal;
       p = &formal->next;
       *p = NULL;
@@ -533,8 +541,9 @@ define_macro (int idx, sb *in, sb *label,
        {
          /* It's the label: MACRO (formals,...)  sort  */
          idx = do_formals (macro, idx + 1, in);
-         if (in->ptr[idx] != ')')
+         if (idx >= in->len || in->ptr[idx] != ')')
            return _("missing ) after formals");
+         idx = sb_skip_white (idx + 1, in);
        }
       else
        {
@@ -544,15 +553,27 @@ define_macro (int idx, sb *in, sb *label,
     }
   else
     {
+      int cidx;
+
       idx = get_token (idx, in, &name);
-      idx = sb_skip_comma (idx, in);
-      idx = do_formals (macro, idx, in);
+      if (name.len == 0)
+       return _("Missing macro name");
+      cidx = sb_skip_white (idx, in);
+      idx = sb_skip_comma (cidx, in);
+      if (idx == cidx || idx < in->len)
+       idx = do_formals (macro, idx, in);
+      else
+       idx = cidx;
     }
+  if (idx < in->len)
+    return _("Bad macro parameter list");
 
   /* And stick it in the macro hash table.  */
   for (idx = 0; idx < name.len; idx++)
     name.ptr[idx] = TOLOWER (name.ptr[idx]);
   namestr = sb_terminate (&name);
+  if (hash_find (macro_hash, namestr))
+    return _("Macro with this name was already defined");
   hash_jam (macro_hash, namestr, (PTR) macro);
 
   macro_defined = 1;
index ffb208a686b5c8f9be72ca0b78599f78bee822ec..131937edb24221f6a315b9f6612769a21e4d7c05 100644 (file)
@@ -214,6 +214,7 @@ static int dwarf_file_string;
 static void do_align (int, char *, int, int);
 static void s_align (int, int);
 static void s_altmacro (int);
+static void s_bad_end (int);
 static int hex_float (int, char *);
 static segT get_known_segmented_expression (expressionS * expP);
 static void pobegin (void);
@@ -298,7 +299,8 @@ static const pseudo_typeS potable[] = {
   {"endc", s_endif, 0},
   {"endfunc", s_func, 1},
   {"endif", s_endif, 0},
-  {"endr", s_bad_endr, 0},
+  {"endm", s_bad_end, 0},
+  {"endr", s_bad_end, 1},
 /* endef  */
   {"equ", s_set, 0},
   {"equiv", s_set, 1},
@@ -2659,12 +2661,14 @@ s_purgem (int ignore ATTRIBUTE_UNUSED)
   demand_empty_rest_of_line ();
 }
 
-/* Handle the .rept pseudo-op.  */
+/* Handle the .endm/.endr pseudo-ops.  */
 
-void
-s_bad_endr (int ignore ATTRIBUTE_UNUSED)
+static void
+s_bad_end (int endr)
 {
-  as_warn (_(".endr encountered without preceeding .rept, .irc, or .irp"));
+  as_warn (_(".end%c encountered without preceeding %s"),
+          endr ? 'r' : 'm',
+          endr ? ".rept, .irp, or .irpc" : ".macro");
   demand_empty_rest_of_line ();
 }
 
index 10acef9622f5fec8237d1a1b13409848f5b34580..75050f362530a253dd31c4951d22f859cd17d6f3 100644 (file)
@@ -142,7 +142,6 @@ extern symbolS *s_lcomm_internal (int, symbolS *, addressT);
 extern void s_app_file_string (char *, int);
 extern void s_app_file (int);
 extern void s_app_line (int);
-extern void s_bad_endr (int);
 extern void s_comm (int);
 extern void s_data (int);
 extern void s_desc (int);
index 860a9a9e7dac93dc37435b46e7b76455e53ff9f3..aba29e04158151bdc38c1885c7c4634168571adc 100644 (file)
@@ -1,3 +1,11 @@
+2005-01-31  Jan Beulich  <jbeulich@novell.com>
+
+       * gas/macros/badarg.[ls]: New.
+       * gas/macros/end.[ls]: New.
+       * gas/macros/redef.[ls]: New.
+       * gas/macros/macros.exp (run_list_test): Copy from elsewhere.
+       Run new tests.
+
 2005-01-31  Jan Beulich  <jbeulich@novell.com>
 
        * gas/ia64/operands.[ls]: New.
diff --git a/gas/testsuite/gas/macros/badarg.l b/gas/testsuite/gas/macros/badarg.l
new file mode 100644 (file)
index 0000000..80e0670
--- /dev/null
@@ -0,0 +1,7 @@
+.*: Assembler messages:
+.*:1: Error: .*
+.*:4: Error: .*
+.*:7: Error: .*
+.*:10: Error: .*
+.*:13: Error: .*
+.*:16: Error: .*
diff --git a/gas/testsuite/gas/macros/badarg.s b/gas/testsuite/gas/macros/badarg.s
new file mode 100644 (file)
index 0000000..d6d729b
--- /dev/null
@@ -0,0 +1,17 @@
+       .macro
+       .endm
+
+       .macro  ,arg1
+       .endm
+
+       .macro  m1,
+       .endm
+
+       .macro  m2,,
+       .endm
+
+       .macro  m3,arg1,
+       .endm
+
+       .macro  m4,,arg2
+       .endm
diff --git a/gas/testsuite/gas/macros/end.l b/gas/testsuite/gas/macros/end.l
new file mode 100644 (file)
index 0000000..1675ff8
--- /dev/null
@@ -0,0 +1,3 @@
+.*: Assembler messages:
+.*:1: Warning: \.endm .* \.macro
+.*:2: Warning: \.endr .* (\.rept|\.irpc?).*(\.rept|\.irpc?).*(\.rept|\.irpc?)
diff --git a/gas/testsuite/gas/macros/end.s b/gas/testsuite/gas/macros/end.s
new file mode 100644 (file)
index 0000000..3a136c6
--- /dev/null
@@ -0,0 +1,2 @@
+       .endm
+       .endr
index 46e5284c6300d98fd9b3e62a128c5b8e32776d6d..100a3a3d40c682ba960da3adece3a62aec0c9f93 100644 (file)
@@ -1,5 +1,18 @@
 # Run some tests of gas macros.
 
+proc run_list_test { name opts } {
+    global srcdir subdir
+    set testname "macros $name"
+    set file $srcdir/$subdir/$name
+    gas_run ${name}.s $opts ">&dump.out"
+    if { [regexp_diff "dump.out" "${file}.l"] } then {
+       fail $testname
+       verbose "output is [file_contents "dump.out"]" 2
+       return
+    }
+    pass $testname
+}
+
 if { ![istarget hppa*-*-*] || [istarget *-*-linux*] } {
     run_dump_test test1
 }
@@ -47,3 +60,7 @@ run_dump_test app1
 run_dump_test app2
 run_dump_test app3
 run_dump_test app4
+
+run_list_test badarg ""
+run_list_test end ""
+run_list_test redef ""
diff --git a/gas/testsuite/gas/macros/redef.l b/gas/testsuite/gas/macros/redef.l
new file mode 100644 (file)
index 0000000..a97cb3d
--- /dev/null
@@ -0,0 +1,2 @@
+.*: Assembler messages:
+.*:3: Error: .*
diff --git a/gas/testsuite/gas/macros/redef.s b/gas/testsuite/gas/macros/redef.s
new file mode 100644 (file)
index 0000000..0b3290b
--- /dev/null
@@ -0,0 +1,4 @@
+       .macro m
+       .endm
+       .macro m
+       .endm