aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog9
-rw-r--r--gcc/doc/tm.texi4
-rw-r--r--gcc/doc/tm.texi.in4
-rw-r--r--gcc/final.c42
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.target/i386/asm-dialect-2.c11
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}" : :);
+}