diff options
-rw-r--r-- | gas/ChangeLog | 8 | ||||
-rw-r--r-- | gas/macro.c | 77 | ||||
-rw-r--r-- | gas/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gas/testsuite/gas/macros/macros.exp | 6 | ||||
-rw-r--r-- | gas/testsuite/gas/macros/paren.d | 9 | ||||
-rw-r--r-- | gas/testsuite/gas/macros/paren.s | 12 |
6 files changed, 80 insertions, 37 deletions
diff --git a/gas/ChangeLog b/gas/ChangeLog index 75d9eda..83d9f6b 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,11 @@ +2006-02-28 Jan Beulich <jbeulich@novell.com> + + PR/1070 + * macro.c (getstring): Don't treat parentheses special anymore. + (get_any_string): Don't consider '(' and ')' as quoting anymore. + Special-case '(', ')', '[', and ']' when dealing with non-quoting + characters. + 2006-02-28 Mat <mat@csail.mit.edu> * dwarf2dbg.c (get_filenum): Don't inadvertently decrease files_in_use. diff --git a/gas/macro.c b/gas/macro.c index 23156a1..0f3d507 100644 --- a/gas/macro.c +++ b/gas/macro.c @@ -303,18 +303,14 @@ getstring (int idx, sb *in, sb *acc) { while (idx < in->len && (in->ptr[idx] == '"' - || in->ptr[idx] == '(' || (in->ptr[idx] == '<' && (macro_alternate || macro_mri)) || (in->ptr[idx] == '\'' && macro_alternate))) { if (in->ptr[idx] == '<') { int nest = 0; - char start_char = '>'; - char end_char = '>'; - idx++; - while ((in->ptr[idx] != end_char || nest) + while ((in->ptr[idx] != '>' || nest) && idx < in->len) { if (in->ptr[idx] == '!') @@ -324,37 +320,15 @@ getstring (int idx, sb *in, sb *acc) } else { - if (in->ptr[idx] == end_char) + if (in->ptr[idx] == '>') nest--; - if (in->ptr[idx] == start_char) + if (in->ptr[idx] == '<') nest++; sb_add_char (acc, in->ptr[idx++]); } } idx++; } - else if (in->ptr[idx] == '(') - { - int nest = 0; - char c; - - do - { - c = in->ptr[idx]; - - if (c == '!') - c = in->ptr[++idx]; - else if (c == ')') - nest--; - else if (c == '(') - nest++; - - sb_add_char (acc, c); - idx++; - } - while ((c != ')' || nest) - && idx < in->len); - } else if (in->ptr[idx] == '"' || in->ptr[idx] == '\'') { char tchar = in->ptr[idx]; @@ -438,7 +412,6 @@ get_any_string (int idx, sb *in, sb *out) sb_add_string (out, buf); } else if (in->ptr[idx] == '"' - || in->ptr[idx] == '(' || (in->ptr[idx] == '<' && (macro_alternate || macro_mri)) || (macro_alternate && in->ptr[idx] == '\'')) { @@ -457,27 +430,57 @@ get_any_string (int idx, sb *in, sb *out) } else { + char *br_buf = xmalloc(1); + char *in_br = br_buf; + + *in_br = '\0'; while (idx < in->len - && in->ptr[idx] != ' ' - && in->ptr[idx] != '\t' + && (*in_br + || (in->ptr[idx] != ' ' + && in->ptr[idx] != '\t')) && in->ptr[idx] != ',' && (in->ptr[idx] != '<' || (! macro_alternate && ! macro_mri))) { - if (in->ptr[idx] == '"' - || in->ptr[idx] == '\'') - { - char tchar = in->ptr[idx]; + char tchar = in->ptr[idx]; + switch (tchar) + { + case '"': + case '\'': sb_add_char (out, in->ptr[idx++]); while (idx < in->len && in->ptr[idx] != tchar) sb_add_char (out, in->ptr[idx++]); if (idx == in->len) return idx; + break; + case '(': + case '[': + if (in_br > br_buf) + --in_br; + else + { + br_buf = xmalloc(strlen(in_br) + 2); + strcpy(br_buf + 1, in_br); + free(in_br); + in_br = br_buf; + } + *in_br = tchar; + break; + case ')': + if (*in_br == '(') + ++in_br; + break; + case ']': + if (*in_br == '[') + ++in_br; + break; } - sb_add_char (out, in->ptr[idx++]); + sb_add_char (out, tchar); + ++idx; } + free(br_buf); } } diff --git a/gas/testsuite/ChangeLog b/gas/testsuite/ChangeLog index 53c6926..4f3e09d 100644 --- a/gas/testsuite/ChangeLog +++ b/gas/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-02-28 Jan Beulich <jbeulich@novell.com> + + * gas/macros/paren[sd]: New. + * gas/macros/macros.exp: Run new test. + 2006-02-27 H.J. Lu <hongjiu.lu@intel.com> * gas/i386/i386.exp: Add merom and x86-64-merom. diff --git a/gas/testsuite/gas/macros/macros.exp b/gas/testsuite/gas/macros/macros.exp index 3bd1982..e175ad9 100644 --- a/gas/testsuite/gas/macros/macros.exp +++ b/gas/testsuite/gas/macros/macros.exp @@ -82,3 +82,9 @@ case $target_triplet in { run_list_test end "" run_list_test purge "--hash-size=8000" run_list_test redef "" + +# This test is valid only when '!' is not a comment character +# (it is allowed to be a line comment character). +if [string match "" [lindex [gas_run ../all/excl.s "-o /dev/null" ""] 0]] { + run_dump_test paren +} diff --git a/gas/testsuite/gas/macros/paren.d b/gas/testsuite/gas/macros/paren.d new file mode 100644 index 0000000..e4c0975 --- /dev/null +++ b/gas/testsuite/gas/macros/paren.d @@ -0,0 +1,9 @@ +#as: -f +#objdump: -s -j .data +#name parenthesized macro arguments + +.*: .* + +Contents of section .data: + 0000 01000202 020402.. ........ ........ ................ +#pass diff --git a/gas/testsuite/gas/macros/paren.s b/gas/testsuite/gas/macros/paren.s new file mode 100644 index 0000000..f8462e5 --- /dev/null +++ b/gas/testsuite/gas/macros/paren.s @@ -0,0 +1,12 @@ + .data + .macro m x + .byte (\x) + .endm + + m (1) + m (!1) + m (1)+(1) + m 1+(1) + m (1 + 1) + m (1 + 1)*(1 + 1) + m (! 0)+(! 0) |