gas/
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:
parent
0f061b69fb
commit
e6ca91be4f
6 changed files with 106 additions and 3 deletions
|
@ -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.
|
||||
|
|
46
gas/macro.c
46
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
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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 ""
|
||||
|
|
7
gas/testsuite/gas/macros/purge.l
Normal file
7
gas/testsuite/gas/macros/purge.l
Normal file
|
@ -0,0 +1,7 @@
|
|||
.*: Assembler messages:
|
||||
.*:11: Error: .*
|
||||
.*:12: Error: .*
|
||||
.*:13: Error: .*
|
||||
.*:14: Error: .*
|
||||
.*:15: Warning: .*
|
||||
.*:16: Warning: .*
|
41
gas/testsuite/gas/macros/purge.s
Normal file
41
gas/testsuite/gas/macros/purge.s
Normal 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
|
Loading…
Reference in a new issue