+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>
@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
@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
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;
}
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
#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
+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
--- /dev/null
+/* { 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}" : :);
+}