+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
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++)
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)
/* 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) \
{
/* 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
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. */
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 (¯o->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. */
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 (¯o->sub);
- free (macro);
-}
-
/* Delete a macro. */
void
#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)
char c;
int mri_line_macro;
- LISTING_NEWLINE ();
HANDLE_CONDITIONAL_ASSEMBLY ();
c = get_symbol_end ();
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))
+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
.*: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
.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
case $target_triplet in {
{ *c54x*-*-* } { }
{ *c4x*-*-* } { }
- { h8500-*-* } { }
- { m68*-*-* } { }
- { m88*-*-* } { }
{ mmix-* } { }
{ rx-*-* } { }
- { z80-* } { }
default { run_list_test dot "-alm" }
}
run_list_test end ""