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.
This commit is contained in:
Jan Beulich 2005-04-18 13:35:46 +00:00
parent 0f061b69fb
commit e6ca91be4f
6 changed files with 106 additions and 3 deletions

View 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.

View 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

View 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.

View 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 ""

View file

@ -0,0 +1,7 @@
.*: Assembler messages:
.*:11: Error: .*
.*:12: Error: .*
.*:13: Error: .*
.*:14: Error: .*
.*:15: Warning: .*
.*:16: Warning: .*

View file

@ -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