From: Maxim Kuznetsov Date: Mon, 6 May 2013 19:35:44 +0000 (+0000) Subject: Support {, } and | in assembly output X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=382522cb0336edecbfa2ee6445cd43407ebc6776;p=gcc.git Support {, } and | in assembly output gcc/ 2013-05-06 Maxim Kuznetsov * 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. gcc/testsuite/ 2013-05-06 Maxim Kuznetsov * gcc.target/i386/asm-dialect-2.c: New testcase. From-SVN: r198641 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 47868064267..48f69ac967d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2013-05-06 Maxim Kuznetsov + + * 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 diff --git a/gcc/doc/tm.texi b/gcc/doc/tm.texi index ec7ef758086..2482eb484b0 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 a4187335b62..611d6813a56 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 f6974f4be27..c836e5dc842 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 fb06bb16429..73d27cf6296 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2013-05-06 Maxim Kuznetsov + + * gcc.target/i386/asm-dialect-2.c: New testcase. + 2013-05-06 Paolo Carlini 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 00000000000..8386d64e52c --- /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}" : :); +}