diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/doc/tm.texi | 4 | ||||
-rw-r--r-- | gcc/doc/tm.texi.in | 4 | ||||
-rw-r--r-- | gcc/final.c | 42 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/asm-dialect-2.c | 11 |
6 files changed, 66 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4786806..48f69ac 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2013-05-06 Maxim Kuznetsov <maks.kuznetsov@gmail.com> + + * final.c (do_assembler_dialects): Don't handle curly braces and + vertical bar escaped by % as dialect delimiters. + (output_asm_insn): Print curly braces and vertical bar if escaped + by % and ASSEMBLER_DIALECT defined. + * doc/tm.texi.in (ASSEMBLER_DIALECT): Document new standard escapes. + * doc/tm.texi: Regenerated. + 2013-05-06 Steven Bosscher <steven@gcc.gnu.org> diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index ec7ef75..2482eb4 100644 --- a/gcc/doc/tm.texi +++ b/gcc/doc/tm.texi @@ -8729,7 +8729,9 @@ first argument of @code{asm_fprintf}. This construct outputs @code{ASSEMBLER_DIALECT} is zero, one, two, etc. Any special characters within these strings retain their usual meaning. If there are fewer alternatives within the braces than the value of -@code{ASSEMBLER_DIALECT}, the construct outputs nothing. +@code{ASSEMBLER_DIALECT}, the construct outputs nothing. If it's needed +to print curly braces or @samp{|} character in assembler output directly, +@samp{%@{}, @samp{%@}} and @samp{%|} can be used. If you do not define this macro, the characters @samp{@{}, @samp{|} and @samp{@}} do not have any special meaning when used in templates or diff --git a/gcc/doc/tm.texi.in b/gcc/doc/tm.texi.in index a418733..611d681 100644 --- a/gcc/doc/tm.texi.in +++ b/gcc/doc/tm.texi.in @@ -8602,7 +8602,9 @@ first argument of @code{asm_fprintf}. This construct outputs @code{ASSEMBLER_DIALECT} is zero, one, two, etc. Any special characters within these strings retain their usual meaning. If there are fewer alternatives within the braces than the value of -@code{ASSEMBLER_DIALECT}, the construct outputs nothing. +@code{ASSEMBLER_DIALECT}, the construct outputs nothing. If it's needed +to print curly braces or @samp{|} character in assembler output directly, +@samp{%@{}, @samp{%@}} and @samp{%|} can be used. If you do not define this macro, the characters @samp{@{}, @samp{|} and @samp{@}} do not have any special meaning when used in templates or diff --git a/gcc/final.c b/gcc/final.c index f6974f4..c836e5d 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -3430,8 +3430,21 @@ do_assembler_dialects (const char *p, int *dialect) DIALECT_NUMBER of strings ending with '|'. */ for (i = 0; i < dialect_number; i++) { - while (*p && *p != '}' && *p++ != '|') - ; + while (*p && *p != '}') + { + if (*p == '|') + { + p++; + break; + } + + /* Skip over any character after a percent sign. */ + if (*p == '%') + p++; + if (*p) + p++; + } + if (*p == '}') break; } @@ -3452,8 +3465,19 @@ do_assembler_dialects (const char *p, int *dialect) output_operand_lossage ("unterminated assembly dialect alternative"); break; } + + /* Skip over any character after a percent sign. */ + if (*p == '%' && p[1]) + { + p += 2; + continue; + } + + if (*p++ == '}') + break; } - while (*p++ != '}'); + while (1); + *dialect = 0; } else @@ -3546,11 +3570,17 @@ output_asm_insn (const char *templ, rtx *operands) #endif case '%': - /* %% outputs a single %. */ - if (*p == '%') + /* %% outputs a single %. %{, %} and %| print {, } and | respectively + if ASSEMBLER_DIALECT defined and these characters have a special + meaning as dialect delimiters.*/ + if (*p == '%' +#ifdef ASSEMBLER_DIALECT + || *p == '{' || *p == '}' || *p == '|' +#endif + ) { + putc (*p, asm_out_file); p++; - putc (c, asm_out_file); } /* %= outputs a number which is unique to each insn in the entire compilation. This is useful for making local labels that are diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index fb06bb1..73d27cf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-05-06 Maxim Kuznetsov <maks.kuznetsov@gmail.com> + + * gcc.target/i386/asm-dialect-2.c: New testcase. + 2013-05-06 Paolo Carlini <paolo.carlini@oracle.com> PR c++/57183 diff --git a/gcc/testsuite/gcc.target/i386/asm-dialect-2.c b/gcc/testsuite/gcc.target/i386/asm-dialect-2.c new file mode 100644 index 0000000..8386d64 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/asm-dialect-2.c @@ -0,0 +1,11 @@ +/* { dg-do compile } */ +/* { dg-options "-masm=att" } */ +/* { dg-final { scan-assembler "%{a}|" } } */ + +int a, b; + +void f() +{ + /* Check for escaped curly braces support. */ + asm volatile ("{%%%{a%}%||%%%}b}" : :); +} |