gas/
authorJan Beulich <jbeulich@novell.com>
Mon, 18 Apr 2005 13:35:46 +0000 (13:35 +0000)
committerJan Beulich <jbeulich@novell.com>
Mon, 18 Apr 2005 13:35:46 +0000 (13:35 +0000)
2005-04-18  Jan Beulich  <jbeulich@novell.com>

* macro.c (free_token): New, freeing all the memory associated with a
macro.
(do_formals): Move initializers to ...
(define_macro): ... here.
(delete_macro): Convert passed in name to lower case. Warn when
purging macro that doesn't exist. Use hash_jam instead of hash_delete.

gas/testsuite/
2005-04-18  Jan Beulich  <jbeulich@novell.com>

* gas/macros/purge.[ls]: 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/purge.l [new file with mode: 0644]
gas/testsuite/gas/macros/purge.s [new file with mode: 0644]

index eb938bf..7d8eb46 100644 (file)
@@ -1,3 +1,12 @@
+2005-04-18  Jan Beulich  <jbeulich@novell.com>
+
+       * macro.c (free_token): New, freeing all the memory associated with a
+       macro.
+       (do_formals): Move initializers to ...
+       (define_macro): ... here.
+       (delete_macro): Convert passed in name to lower case. Warn when
+       purging macro that doesn't exist. Use hash_jam instead of hash_delete.
+
 2005-04-15  Maciej W. Rozycki  <macro@linux-mips.org>
 
        * config/tc-mips.c (normalize_constant_expr): Fix formatting.
index 4f934ae..0819404 100644 (file)
@@ -77,6 +77,7 @@ 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 *, int);
 static const char *macro_expand (int, sb *, macro_entry *, sb *);
+static void free_macro(macro_entry *);
 
 #define ISWHITE(x) ((x) == ' ' || (x) == '\t')
 
@@ -471,8 +472,6 @@ do_formals (macro_entry *macro, int idx, sb *in)
 {
   formal_entry **p = &macro->formals;
 
-  macro->formal_count = 0;
-  macro->formal_hash = hash_new ();
   idx = sb_skip_white (idx, in);
   while (idx < in->len)
     {
@@ -568,6 +567,7 @@ define_macro (int idx, sb *in, sb *label,
 
   macro->formal_count = 0;
   macro->formals = 0;
+  macro->formal_hash = hash_new ();
 
   idx = sb_skip_white (idx, in);
   if (! buffer_and_nest ("MACRO", "ENDM", &macro->sub, get_line))
@@ -1142,12 +1142,52 @@ 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; )
+    {
+      void *ptr;
+
+      sb_kill (&formal->name);
+      sb_kill (&formal->def);
+      sb_kill (&formal->actual);
+      ptr = formal;
+      formal = formal->next;
+      free (ptr);
+    }
+  hash_die (macro->formal_hash);
+  sb_kill (&macro->sub);
+  free (macro);
+}
+
 /* Delete a macro.  */
 
 void
 delete_macro (const char *name)
 {
-  hash_delete (macro_hash, name);
+  char *copy;
+  size_t i, len;
+  macro_entry *macro;
+
+  len = strlen (name);
+  copy = (char *) alloca (len + 1);
+  for (i = 0; i < len; ++i)
+    copy[i] = TOLOWER (name[i]);
+  copy[i] = '\0';
+
+  /* Since hash_delete doesn't free memory, just clear out the entry.  */
+  if ((macro = hash_find (macro_hash, copy)) != NULL)
+    {
+      hash_jam (macro_hash, copy, NULL);
+      free_macro (macro);
+    }
+  else
+    as_warn (_("Attempt to purge non-existant macro `%s'"), copy);
 }
 
 /* Handle the MRI IRP and IRPC pseudo-ops.  These are handled as a
index a41d813..6fe22ce 100644 (file)
@@ -1,3 +1,8 @@
+2005-04-18  Jan Beulich  <jbeulich@novell.com>
+
+       * gas/macros/purge.[ls]: New.
+       * gas/macros/macros.exp: Run new test.
+
 2005-04-15  Jan Beulich  <jbeulich@novell.com>
 
        * gas/elf/struct.[sd]: New.
index 5b924ac..ed8debe 100644 (file)
@@ -78,4 +78,5 @@ case $target_triplet in {
     default { run_list_test dot "-alm" }
 }
 run_list_test end ""
+run_list_test purge "--hash-size=8000"
 run_list_test redef ""
diff --git a/gas/testsuite/gas/macros/purge.l b/gas/testsuite/gas/macros/purge.l
new file mode 100644 (file)
index 0000000..2b25b2c
--- /dev/null
@@ -0,0 +1,7 @@
+.*: Assembler messages:
+.*:11: Error: .*
+.*:12: Error: .*
+.*:13: Error: .*
+.*:14: Error: .*
+.*:15: Warning: .*
+.*:16: Warning: .*
diff --git a/gas/testsuite/gas/macros/purge.s b/gas/testsuite/gas/macros/purge.s
new file mode 100644 (file)
index 0000000..e46eef8
--- /dev/null
@@ -0,0 +1,41 @@
+ .macro MACRO1
+ .endm
+ .macro macro2
+ .endm
+       MACRO1
+       MACRO2
+       macro1
+       macro2
+ .purgem MACRO1
+ .purgem macro2
+       MACRO1
+       MACRO2
+       macro1
+       macro2
+ .purgem macro1
+ .purgem MACRO2
+ .macro macro1
+ .endm
+ .macro MACRO2
+ .endm
+       MACRO1
+       MACRO2
+       macro1
+       macro2
+ .purgem MACRO1
+ .purgem macro2
+
+ .irpc a,ABCDEFGHIJKLMNOPQRSTUVWXYZ
+  .irpc b,ABCDEFGHIJKLMNOPQRSTUVWXYZ
+   .irpc c,ABCDEFGHIJKLMNOPQRSTUVWXYZ
+    .irpc d,ABCDEFGHIJKLMNOPQRSTUVWXYZ
+     .macro \a\b\c\d arg1=0, arg2=0
+      .if \arg1 + \arg2
+       .purgem \a\b\c\d
+      .endif
+     .endm
+       \a\b\c\d 1, 2
+    .endr
+   .endr
+  .endr
+ .endr