PR gas/1491

gas/
	* macro.c: Delete unnecessary function declarations.
	(buffer_and_nest): Support multiple labels per line for
	LABELS_WITHOUT_COLONS targets if the labels do have colons.
	(free_macro): Move so that we don't need forward declaration.
	* read.c (read_a_source_file): Take a copy of macro expansion line
	before we trim labels.
	* listing.c (listing_newline): Adjust stdin line save for
	input_line_pointer still at start of line.
gas/testsuite/
	* gas/macros/dot.s: Don't start macro invocations is first column.
	* gas/macros/dot.l: Update.
	* gas/macros/macros.exp: Run dot test on more targets.
This commit is contained in:
Alan Modra 2009-10-15 10:58:34 +00:00
parent c44c601a50
commit f19df8f73a
8 changed files with 99 additions and 89 deletions

View File

@ -1,3 +1,15 @@
2009-10-15 Alan Modra <amodra@bigpond.net.au>
PR gas/1491
* macro.c: Delete unnecessary function declarations.
(buffer_and_nest): Support multiple labels per line for
LABELS_WITHOUT_COLONS targets if the labels do have colons.
(free_macro): Move so that we don't need forward declaration.
* read.c (read_a_source_file): Take a copy of macro expansion line
before we trim labels.
* listing.c (listing_newline): Adjust stdin line save for
input_line_pointer still at start of line.
2009-10-13 H.J. Lu <hongjiu.lu@intel.com>
PR gas/10766

View File

@ -342,7 +342,7 @@ listing_newline (char *ps)
int seen_quote = 0;
int seen_slash = 0;
for (copy = input_line_pointer - 1;
for (copy = input_line_pointer;
*copy && (seen_quote
|| is_end_of_line [(unsigned char) *copy] != 1);
copy++)
@ -353,13 +353,13 @@ listing_newline (char *ps)
seen_quote = ! seen_quote;
}
len = (copy - input_line_pointer) + 2;
len = copy - input_line_pointer + 1;
copy = (char *) xmalloc (len);
if (copy != NULL)
{
char *src = input_line_pointer - 1;
char *src = input_line_pointer;
char *dest = copy;
while (--len)

View File

@ -30,21 +30,6 @@
/* The routines in this file handle macro definition and expansion.
They are called by gas. */
/* Internal functions. */
static int get_token (int, sb *, sb *);
static int getstring (int, sb *, sb *);
static int get_any_string (int, sb *, sb *);
static formal_entry *new_formal (void);
static void del_formal (formal_entry *);
static int do_formals (macro_entry *, int, sb *);
static int get_apost_token (int, sb *, sb *, int);
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 *, const macro_entry *);
static const char *macro_expand (int, sb *, macro_entry *, sb *);
static void free_macro(macro_entry *);
#define ISWHITE(x) ((x) == ' ' || (x) == '\t')
#define ISSEP(x) \
@ -146,6 +131,7 @@ buffer_and_nest (const char *from, const char *to, sb *ptr,
{
/* Try to find the first pseudo op on the line. */
int i = line_start;
bfd_boolean had_colon = FALSE;
/* With normal syntax we can suck what we want till we get
to the dot. With the alternate, labels have to start in
@ -169,19 +155,24 @@ buffer_and_nest (const char *from, const char *to, sb *ptr,
i++;
if (i < ptr->len && is_name_ender (ptr->ptr[i]))
i++;
if (LABELS_WITHOUT_COLONS)
break;
/* Skip whitespace. */
while (i < ptr->len && ISWHITE (ptr->ptr[i]))
i++;
/* Check for the colon. */
if (i >= ptr->len || ptr->ptr[i] != ':')
{
/* LABELS_WITHOUT_COLONS doesn't mean we cannot have a
colon after a label. If we do have a colon on the
first label then handle more than one label on the
line, assuming that each label has a colon. */
if (LABELS_WITHOUT_COLONS && !had_colon)
break;
i = line_start;
break;
}
i++;
line_start = i;
had_colon = TRUE;
}
/* Skip trailing whitespace. */
@ -606,6 +597,26 @@ do_formals (macro_entry *macro, int idx, sb *in)
return idx;
}
/* Free the memory allocated to a macro. */
static void
free_macro (macro_entry *macro)
{
formal_entry *formal;
for (formal = macro->formals; formal; )
{
formal_entry *f;
f = formal;
formal = formal->next;
del_formal (f);
}
hash_die (macro->formal_hash);
sb_kill (&macro->sub);
free (macro);
}
/* Define a new macro. Returns NULL on success, otherwise returns an
error message. If NAMEP is not NULL, *NAMEP is set to the name of
the macro which was defined. */
@ -1235,26 +1246,6 @@ 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; )
{
formal_entry *f;
f = formal;
formal = formal->next;
del_formal (f);
}
hash_die (macro->formal_hash);
sb_kill (&macro->sub);
free (macro);
}
/* Delete a macro. */
void

View File

@ -620,19 +620,57 @@ read_a_source_file (char *name)
#endif
while (input_line_pointer < buffer_limit)
{
bfd_boolean was_new_line;
/* We have more of this buffer to parse. */
/* We now have input_line_pointer->1st char of next line.
If input_line_pointer [-1] == '\n' then we just
scanned another line: so bump line counters. */
if (is_end_of_line[(unsigned char) input_line_pointer[-1]])
was_new_line = is_end_of_line[(unsigned char) input_line_pointer[-1]];
if (was_new_line)
{
#ifdef md_start_line_hook
md_start_line_hook ();
#endif
if (input_line_pointer[-1] == '\n')
bump_line_counters ();
}
#ifndef NO_LISTING
/* If listing is on, and we are expanding a macro, then give
the listing code the contents of the expanded line. */
if (listing)
{
if ((listing & LISTING_MACEXP) && macro_nest > 0)
{
/* Find the end of the current expanded macro line. */
s = find_end_of_line (input_line_pointer, flag_m68k_mri);
if (s != last_eol)
{
char *copy;
int len;
last_eol = s;
/* Copy it for safe keeping. Also give an indication of
how much macro nesting is involved at this point. */
len = s - input_line_pointer;
copy = (char *) xmalloc (len + macro_nest + 2);
memset (copy, '>', macro_nest);
copy[macro_nest] = ' ';
memcpy (copy + macro_nest + 1, input_line_pointer, len);
copy[macro_nest + 1 + len] = '\0';
/* Install the line with the listing facility. */
listing_newline (copy);
}
}
else
listing_newline (NULL);
}
#endif
if (was_new_line)
{
line_label = NULL;
if (LABELS_WITHOUT_COLONS || flag_m68k_mri)
@ -645,7 +683,6 @@ read_a_source_file (char *name)
char c;
int mri_line_macro;
LISTING_NEWLINE ();
HANDLE_CONDITIONAL_ASSEMBLY ();
c = get_symbol_end ();
@ -712,39 +749,6 @@ read_a_source_file (char *name)
c = *input_line_pointer++;
while (c == '\t' || c == ' ' || c == '\f');
#ifndef NO_LISTING
/* If listing is on, and we are expanding a macro, then give
the listing code the contents of the expanded line. */
if (listing)
{
if ((listing & LISTING_MACEXP) && macro_nest > 0)
{
char *copy;
int len;
/* Find the end of the current expanded macro line. */
s = find_end_of_line (input_line_pointer - 1, flag_m68k_mri);
if (s != last_eol)
{
last_eol = s;
/* Copy it for safe keeping. Also give an indication of
how much macro nesting is involved at this point. */
len = s - (input_line_pointer - 1);
copy = (char *) xmalloc (len + macro_nest + 2);
memset (copy, '>', macro_nest);
copy[macro_nest] = ' ';
memcpy (copy + macro_nest + 1, input_line_pointer - 1, len);
copy[macro_nest + 1 + len] = '\0';
/* Install the line with the listing facility. */
listing_newline (copy);
}
}
else
listing_newline (NULL);
}
#endif
/* C is the 1st significant character.
Input_line_pointer points after that character. */
if (is_name_beginner (c))

View File

@ -1,3 +1,10 @@
2009-10-15 Alan Modra <amodra@bigpond.net.au>
PR gas/1491
* gas/macros/dot.s: Don't start macro invocations is first column.
* gas/macros/dot.l: Update.
* gas/macros/macros.exp: Run dot test on more targets.
2009-10-13 H.J. Lu <hongjiu.lu@intel.com>
PR gas/10740

View File

@ -4,16 +4,16 @@
.*:28: Error: .*
#...
[ ]*[1-9][0-9]*[ ]+m 4, 2
[ ]*[1-9][0-9]*[ ]+> \.data
[ ]*[1-9][0-9]*[ ]+> \.data
[ ]*[1-9][0-9]*[ ]+> labelA:labelB:labelC:labelD:x\.y\.z 4\+2
[ ]*[1-9][0-9]*[ ]+>> \.align 4
[ ]*[1-9][0-9]*[ ]+\?+[ ]+0606[ ]+>> \.byte 4\+2,4\+2
[ ]*[1-9][0-9]*[ ]+\?+[ ]+0000[ ]+> \.skip 2
[ ]*[1-9][0-9]*[ ]+>> \.align 4
[ ]*[1-9][0-9]*[ ]+\?+[ ]+06 ?06[ ]+>> \.byte 4\+2,4\+2
[ ]*[1-9][0-9]*[ ]+\?+[ ]+00 ?00[ ]+> \.skip 2
[ ]*[1-9][0-9]*[ ]+> labelZ:labelY:labelX:labelW:\.xyz 4-2
[ ]*[1-9][0-9]*[ ]+>> \.align 8
[ ]*[1-9][0-9]*[ ]+\?+[ ]+0202[ ]+>> \.byte 4-2,4-2
[ ]*[1-9][0-9]*[ ]+\?+[ ]+0000 ?0000[ ]+> \.skip 4\*2
[ ]*[1-9][0-9]*[ ]+0000 ?0000[ ]*
[ ]*[1-9][0-9]*[ ]+>> \.align 8
[ ]*[1-9][0-9]*[ ]+\?+[ ]+02 ?02[ ]+>> \.byte 4-2,4-2
[ ]*[1-9][0-9]*[ ]+\?+[ ]+00 ?00 ?00 ?00[ ]+> \.skip 4\*2
[ ]*[1-9][0-9]*[ ]+00 ?00 ?00 ?00[ ]*
[ ]*[1-9][0-9]*[ ]+> label9:label8:label7:label6:
[ ]*[1-9][0-9]*[ ]+
[ ]*[1-9][0-9]*[ ]+\.purgem \.xyz, x\.y\.z

View File

@ -21,8 +21,8 @@ labelZ:labelY : labelX :labelW: .xyz arg.1-arg.2
.skip arg.1*arg.2
label9:label8 : label7 :label6: .endm
m 4, 2
m 4, 2
.purgem .xyz, x.y.z
.xyz 0
x.y.z 0
x.y.z 0

View File

@ -61,12 +61,8 @@ run_list_test badarg ""
case $target_triplet in {
{ *c54x*-*-* } { }
{ *c4x*-*-* } { }
{ h8500-*-* } { }
{ m68*-*-* } { }
{ m88*-*-* } { }
{ mmix-* } { }
{ rx-*-* } { }
{ z80-* } { }
default { run_list_test dot "-alm" }
}
run_list_test end ""