From e6ca91be4f25f03e5b7c8960c34736a31f77c549 Mon Sep 17 00:00:00 2001 From: Jan Beulich Date: Mon, 18 Apr 2005 13:35:46 +0000 Subject: gas/ 2005-04-18 Jan Beulich * 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 * gas/macros/purge.[ls]: New. * gas/macros/macros.exp: Run new test. --- gas/ChangeLog | 9 ++++++++ gas/macro.c | 46 ++++++++++++++++++++++++++++++++++--- gas/testsuite/ChangeLog | 5 ++++ gas/testsuite/gas/macros/macros.exp | 1 + gas/testsuite/gas/macros/purge.l | 7 ++++++ gas/testsuite/gas/macros/purge.s | 41 +++++++++++++++++++++++++++++++++ 6 files changed, 106 insertions(+), 3 deletions(-) create mode 100644 gas/testsuite/gas/macros/purge.l create mode 100644 gas/testsuite/gas/macros/purge.s diff --git a/gas/ChangeLog b/gas/ChangeLog index eb938bf..7d8eb46 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,12 @@ +2005-04-18 Jan Beulich + + * 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 * config/tc-mips.c (normalize_constant_expr): Fix formatting. diff --git a/gas/macro.c b/gas/macro.c index 4f934ae..0819404 100644 --- a/gas/macro.c +++ b/gas/macro.c @@ -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 = ¯o->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", ¯o->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 (¯o->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 diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index a41d813..6fe22ce 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-04-18 Jan Beulich + + * gas/macros/purge.[ls]: New. + * gas/macros/macros.exp: Run new test. + 2005-04-15 Jan Beulich * gas/elf/struct.[sd]: New. diff --git a/gas/testsuite/gas/macros/macros.exp b/gas/testsuite/gas/macros/macros.exp index 5b924ac..ed8debe 100644 --- a/gas/testsuite/gas/macros/macros.exp +++ b/gas/testsuite/gas/macros/macros.exp @@ -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 index 0000000..2b25b2c --- /dev/null +++ b/gas/testsuite/gas/macros/purge.l @@ -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 index 0000000..e46eef8 --- /dev/null +++ b/gas/testsuite/gas/macros/purge.s @@ -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 -- cgit v1.1