diff options
-rw-r--r-- | gas/ChangeLog | 12 | ||||
-rw-r--r-- | gas/listing.c | 6 | ||||
-rw-r--r-- | gas/macro.c | 65 | ||||
-rw-r--r-- | gas/read.c | 74 | ||||
-rw-r--r-- | gas/testsuite/ChangeLog | 7 | ||||
-rw-r--r-- | gas/testsuite/gas/macros/dot.l | 16 | ||||
-rw-r--r-- | gas/testsuite/gas/macros/dot.s | 4 | ||||
-rw-r--r-- | gas/testsuite/gas/macros/macros.exp | 4 |
8 files changed, 99 insertions, 89 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index af39035..2888010 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -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 diff --git a/gas/listing.c b/gas/listing.c index c8b6d63..d1c291c 100644 --- a/gas/listing.c +++ b/gas/listing.c @@ -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) diff --git a/gas/macro.c b/gas/macro.c index dd7f9a2..f77be59 100644 --- a/gas/macro.c +++ b/gas/macro.c @@ -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 (¯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. */ @@ -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 (¯o->sub); - free (macro); -} - /* Delete a macro. */ void @@ -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)) diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index b86bd64..5227066 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -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 diff --git a/gas/testsuite/gas/macros/dot.l b/gas/testsuite/gas/macros/dot.l index 980de4f..5c616b0 100644 --- a/gas/testsuite/gas/macros/dot.l +++ b/gas/testsuite/gas/macros/dot.l @@ -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 diff --git a/gas/testsuite/gas/macros/dot.s b/gas/testsuite/gas/macros/dot.s index 72ce972..1c9503b 100644 --- a/gas/testsuite/gas/macros/dot.s +++ b/gas/testsuite/gas/macros/dot.s @@ -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 diff --git a/gas/testsuite/gas/macros/macros.exp b/gas/testsuite/gas/macros/macros.exp index 9a4aec8..d2e30bb 100644 --- a/gas/testsuite/gas/macros/macros.exp +++ b/gas/testsuite/gas/macros/macros.exp @@ -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 "" |