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

	* macro.c (buffer_and_nest): Allow 'from' being NULL; handle anything
	that can end with .endr in that case. Make requiring/permitting
	pseudo-ops without leading dot closer to the logic in read.c serving
	the same purpose.
	(expand_irp): Don't pass a mnemonic to buffer_and_nest as it will be
	ignored.

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

	* gas/macros/repeat.[ds]: New.
	* gas/macros/macros.exp: Run new test.
This commit is contained in:
Jan Beulich 2005-01-31 14:30:34 +00:00
parent 057f53c1ad
commit ca3bc58f0a
6 changed files with 137 additions and 13 deletions

View file

@ -1,3 +1,12 @@
2005-01-31 Jan Beulich <jbeulich@novell.com>
* macro.c (buffer_and_nest): Allow 'from' being NULL; handle anything
that can end with .endr in that case. Make requiring/permitting
pseudo-ops without leading dot closer to the logic in read.c serving
the same purpose.
(expand_irp): Don't pass a mnemonic to buffer_and_nest as it will be
ignored.
2005-01-31 Jan Beulich <jbeulich@novell.com>
* macro.c (do_formals): Adjust to no longer accept empty parameter

View file

@ -152,6 +152,7 @@ macro_mri_mode (int mri)
/* Read input lines till we get to a TO string.
Increase nesting depth if we get a FROM string.
Put the results into sb at PTR.
FROM may be NULL (or will be ignored) if TO is "ENDR".
Add a new input line to an sb using GET_LINE.
Return 1 on success, 0 on unexpected EOF. */
@ -159,23 +160,31 @@ int
buffer_and_nest (const char *from, const char *to, sb *ptr,
int (*get_line) (sb *))
{
int from_len = strlen (from);
int from_len;
int to_len = strlen (to);
int depth = 1;
int line_start = ptr->len;
int more = get_line (ptr);
if (to_len == 4 && strcasecmp(to, "ENDR") == 0)
{
from = NULL;
from_len = 0;
}
else
from_len = strlen (from);
while (more)
{
/* Try and find the first pseudo op on the line. */
int i = line_start;
if (! macro_alternate && ! macro_mri)
if (! NO_PSEUDO_DOT && ! flag_m68k_mri)
{
/* With normal syntax we can suck what we want till we get
to the dot. With the alternate, labels have to start in
the first column, since we cant tell what's a label and
the first column, since we can't tell what's a label and
whats a pseudoop. */
/* Skip leading whitespace. */
@ -200,12 +209,22 @@ buffer_and_nest (const char *from, const char *to, sb *ptr,
i++;
if (i < ptr->len && (ptr->ptr[i] == '.'
|| macro_alternate
|| NO_PSEUDO_DOT
|| macro_mri))
{
if (ptr->ptr[i] == '.')
if (! flag_m68k_mri && ptr->ptr[i] == '.')
i++;
if (strncasecmp (ptr->ptr + i, from, from_len) == 0
if (from == NULL
&& strncasecmp (ptr->ptr + i, "IRPC", from_len = 4) != 0
&& strncasecmp (ptr->ptr + i, "IRP", from_len = 3) != 0
&& strncasecmp (ptr->ptr + i, "IREPC", from_len = 5) != 0
&& strncasecmp (ptr->ptr + i, "IREP", from_len = 4) != 0
&& strncasecmp (ptr->ptr + i, "REPT", from_len = 4) != 0
&& strncasecmp (ptr->ptr + i, "REP", from_len = 3) != 0)
from_len = 0;
if ((from != NULL
? strncasecmp (ptr->ptr + i, from, from_len) == 0
: from_len > 0)
&& (ptr->len == (i + from_len)
|| ! ISALNUM (ptr->ptr[i + from_len])))
depth++;
@ -1122,21 +1141,15 @@ delete_macro (const char *name)
const char *
expand_irp (int irpc, int idx, sb *in, sb *out, int (*get_line) (sb *))
{
const char *mn;
sb sub;
formal_entry f;
struct hash_control *h;
const char *err;
if (irpc)
mn = "IRPC";
else
mn = "IRP";
idx = sb_skip_white (idx, in);
sb_new (&sub);
if (! buffer_and_nest (mn, "ENDR", &sub, get_line))
if (! buffer_and_nest (NULL, "ENDR", &sub, get_line))
return _("unexpected end of file in irp or irpc");
sb_new (&f.name);

View file

@ -1,3 +1,8 @@
2005-01-31 Jan Beulich <jbeulich@novell.com>
* gas/macros/repeat.[ds]: New.
* gas/macros/macros.exp: Run new test.
2005-01-31 Jan Beulich <jbeulich@novell.com>
* gas/macros/badarg.[ls]: New.

View file

@ -26,6 +26,7 @@ run_dump_test test3
if { ![istarget *c54x*-*-*] && ![istarget *c4x*-*-*] } {
run_dump_test irp
run_dump_test rept
run_dump_test repeat
}

View file

@ -0,0 +1,43 @@
#objdump: -r
#name: nested irp/irpc/rept
.*: +file format .*
RELOCATION RECORDS FOR .*
OFFSET[ ]+TYPE[ ]+VALUE.*
0+00[ ]+[a-zA-Z0-9_]+[ ]+irp_irp_19
0+04[ ]+[a-zA-Z0-9_]+[ ]+irp_irp_18
0+08[ ]+[a-zA-Z0-9_]+[ ]+irp_irp_29
0+0c[ ]+[a-zA-Z0-9_]+[ ]+irp_irp_28
0+10[ ]+[a-zA-Z0-9_]+[ ]+irp_irpc_19
0+14[ ]+[a-zA-Z0-9_]+[ ]+irp_irpc_18
0+18[ ]+[a-zA-Z0-9_]+[ ]+irp_irpc_29
0+1c[ ]+[a-zA-Z0-9_]+[ ]+irp_irpc_28
0+20[ ]+[a-zA-Z0-9_]+[ ]+irp_rept_1
0+24[ ]+[a-zA-Z0-9_]+[ ]+irp_rept_1
0+28[ ]+[a-zA-Z0-9_]+[ ]+irp_rept_2
0+2c[ ]+[a-zA-Z0-9_]+[ ]+irp_rept_2
0+30[ ]+[a-zA-Z0-9_]+[ ]+irpc_irp_19
0+34[ ]+[a-zA-Z0-9_]+[ ]+irpc_irp_18
0+38[ ]+[a-zA-Z0-9_]+[ ]+irpc_irp_29
0+3c[ ]+[a-zA-Z0-9_]+[ ]+irpc_irp_28
0+40[ ]+[a-zA-Z0-9_]+[ ]+irpc_irpc_19
0+44[ ]+[a-zA-Z0-9_]+[ ]+irpc_irpc_18
0+48[ ]+[a-zA-Z0-9_]+[ ]+irpc_irpc_29
0+4c[ ]+[a-zA-Z0-9_]+[ ]+irpc_irpc_28
0+50[ ]+[a-zA-Z0-9_]+[ ]+irpc_rept_1
0+54[ ]+[a-zA-Z0-9_]+[ ]+irpc_rept_1
0+58[ ]+[a-zA-Z0-9_]+[ ]+irpc_rept_2
0+5c[ ]+[a-zA-Z0-9_]+[ ]+irpc_rept_2
0+60[ ]+[a-zA-Z0-9_]+[ ]+rept_irp_9
0+64[ ]+[a-zA-Z0-9_]+[ ]+rept_irp_8
0+68[ ]+[a-zA-Z0-9_]+[ ]+rept_irp_9
0+6c[ ]+[a-zA-Z0-9_]+[ ]+rept_irp_8
0+70[ ]+[a-zA-Z0-9_]+[ ]+rept_irpc_9
0+74[ ]+[a-zA-Z0-9_]+[ ]+rept_irpc_8
0+78[ ]+[a-zA-Z0-9_]+[ ]+rept_irpc_9
0+7c[ ]+[a-zA-Z0-9_]+[ ]+rept_irpc_8
0+80[ ]+[a-zA-Z0-9_]+[ ]+rept_rept
0+84[ ]+[a-zA-Z0-9_]+[ ]+rept_rept
0+88[ ]+[a-zA-Z0-9_]+[ ]+rept_rept
0+8c[ ]+[a-zA-Z0-9_]+[ ]+rept_rept

View file

@ -0,0 +1,53 @@
.irp param1,1,2
.irp param2,9,8
.long irp_irp_\param1\param2
.endr
.endr
.irp param1,1,2
.irpc param2,98
.long irp_irpc_\param1\param2
.endr
.endr
.irp param1,1,2
.rept 2
.long irp_rept_\param1
.endr
.endr
.irpc param1,12
.irp param2,9,8
.long irpc_irp_\param1\param2
.endr
.endr
.irpc param1,12
.irpc param2,98
.long irpc_irpc_\param1\param2
.endr
.endr
.irpc param1,12
.rept 2
.long irpc_rept_\param1
.endr
.endr
.rept 2
.irp param2,9,8
.long rept_irp_\param2
.endr
.endr
.rept 2
.irpc param2,98
.long rept_irpc_\param2
.endr
.endr
.rept 2
.rept 2
.long rept_rept
.endr
.endr