From b2975779eb358805eab47e6ea2ad56b43769fcd8 Mon Sep 17 00:00:00 2001 From: jakub Date: Fri, 12 Oct 2001 10:51:17 +0000 Subject: [PATCH] * final.c (output_asm_insn): Make sure assembly dialects are terminated, not nested. Output `|' and `}' characters if they don't appear inside assembly dialect selection. * config/i386/i386.md (rep_movdi_rex64, rep_movsi, rep_movsi_rex64, rep_movqi, rep_movqi_rex64, rep_stosdi_rex64, rep_stossi, rep_stossi_rex64, rep_stosqi, rep_stosqi_rex64, strsetsi_1, strsetsi_rex_1): Add {} braces. * testsuite/gcc.dg/20011009-1.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@46227 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 10 ++++++++++ gcc/config/i386/i386.md | 24 ++++++++++++------------ gcc/final.c | 33 ++++++++++++++++++++++++++++++--- gcc/testsuite/ChangeLog | 4 ++++ gcc/testsuite/gcc.dg/20011009-1.c | 16 ++++++++++++++++ 5 files changed, 72 insertions(+), 15 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/20011009-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7d07060..82d84f6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2001-10-12 Jakub Jelinek + + * final.c (output_asm_insn): Make sure assembly dialects are + terminated, not nested. Output `|' and `}' characters if they + don't appear inside assembly dialect selection. + * config/i386/i386.md (rep_movdi_rex64, rep_movsi, rep_movsi_rex64, + rep_movqi, rep_movqi_rex64, rep_stosdi_rex64, rep_stossi, + rep_stossi_rex64, rep_stosqi, rep_stosqi_rex64, strsetsi_1, + strsetsi_rex_1): Add {} braces. + 2001-10-11 Zack Weinberg * toplev.c (compile_file): Ignore return value from yyparse. diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 01a9be0..db14396 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -14938,7 +14938,7 @@ (use (match_dup 5)) (use (reg:SI 19))] "TARGET_64BIT" - "rep\;movsq|rep movsq" + "{rep\;movsq|rep movsq}" [(set_attr "type" "str") (set_attr "prefix_rep" "1") (set_attr "memory" "both") @@ -14958,7 +14958,7 @@ (use (match_dup 5)) (use (reg:SI 19))] "!TARGET_64BIT" - "rep\;movsl|rep movsd" + "{rep\;movsl|rep movsd}" [(set_attr "type" "str") (set_attr "prefix_rep" "1") (set_attr "memory" "both") @@ -14978,7 +14978,7 @@ (use (match_dup 5)) (use (reg:SI 19))] "TARGET_64BIT" - "rep\;movsl|rep movsd" + "{rep\;movsl|rep movsd}" [(set_attr "type" "str") (set_attr "prefix_rep" "1") (set_attr "memory" "both") @@ -14996,7 +14996,7 @@ (use (match_dup 5)) (use (reg:SI 19))] "!TARGET_64BIT" - "rep\;movsb|rep movsb" + "{rep\;movsb|rep movsb}" [(set_attr "type" "str") (set_attr "prefix_rep" "1") (set_attr "memory" "both") @@ -15014,7 +15014,7 @@ (use (match_dup 5)) (use (reg:SI 19))] "TARGET_64BIT" - "rep\;movsb|rep movsb" + "{rep\;movsb|rep movsb}" [(set_attr "type" "str") (set_attr "prefix_rep" "1") (set_attr "memory" "both") @@ -15181,7 +15181,7 @@ (const_int 4))) (use (reg:SI 19))] "!TARGET_64BIT && (TARGET_SINGLE_STRINGOP || optimize_size)" - "stosl|stosd" + "{stosl|stosd}" [(set_attr "type" "str") (set_attr "memory" "store") (set_attr "mode" "SI")]) @@ -15194,7 +15194,7 @@ (const_int 4))) (use (reg:SI 19))] "TARGET_64BIT && (TARGET_SINGLE_STRINGOP || optimize_size)" - "stosl|stosd" + "{stosl|stosd}" [(set_attr "type" "str") (set_attr "memory" "store") (set_attr "mode" "SI")]) @@ -15263,7 +15263,7 @@ (use (match_dup 4)) (use (reg:SI 19))] "TARGET_64BIT" - "rep\;stosq|rep stosq" + "{rep\;stosq|rep stosq}" [(set_attr "type" "str") (set_attr "prefix_rep" "1") (set_attr "memory" "store") @@ -15281,7 +15281,7 @@ (use (match_dup 4)) (use (reg:SI 19))] "!TARGET_64BIT" - "rep\;stosl|rep stosd" + "{rep\;stosl|rep stosd}" [(set_attr "type" "str") (set_attr "prefix_rep" "1") (set_attr "memory" "store") @@ -15299,7 +15299,7 @@ (use (match_dup 4)) (use (reg:SI 19))] "TARGET_64BIT" - "rep\;stosl|rep stosd" + "{rep\;stosl|rep stosd}" [(set_attr "type" "str") (set_attr "prefix_rep" "1") (set_attr "memory" "store") @@ -15316,7 +15316,7 @@ (use (match_dup 4)) (use (reg:SI 19))] "!TARGET_64BIT" - "rep\;stosb|rep stosb" + "{rep\;stosb|rep stosb}" [(set_attr "type" "str") (set_attr "prefix_rep" "1") (set_attr "memory" "store") @@ -15333,7 +15333,7 @@ (use (match_dup 4)) (use (reg:DI 19))] "TARGET_64BIT" - "rep\;stosb|rep stosb" + "{rep\;stosb|rep stosb}" [(set_attr "type" "str") (set_attr "prefix_rep" "1") (set_attr "memory" "store") diff --git a/gcc/final.c b/gcc/final.c index 5884382..5d2d8d9 100644 --- a/gcc/final.c +++ b/gcc/final.c @@ -3313,6 +3313,9 @@ output_asm_insn (template, operands) { const char *p; int c; +#ifdef ASSEMBLER_DIALECT + int dialect = 0; +#endif /* An insn may return a null string template in a case where no assembler code is needed. */ @@ -3347,6 +3350,11 @@ output_asm_insn (template, operands) { int i; + if (dialect) + output_operand_lossage ("nested assembly dialect alternatives"); + else + dialect = 1; + /* If we want the first dialect, do nothing. Otherwise, skip DIALECT_NUMBER of strings ending with '|'. */ for (i = 0; i < dialect_number; i++) @@ -3358,16 +3366,35 @@ output_asm_insn (template, operands) if (*p == '|') p++; } + + if (*p == '\0') + output_operand_lossage ("unterminated assembly dialect alternative"); } break; case '|': - /* Skip to close brace. */ - while (*p && *p++ != '}') - ; + if (dialect) + { + /* Skip to close brace. */ + do + { + if (*p == '\0') + { + output_operand_lossage ("unterminated assembly dialect alternative"); + break; + } + } + while (*p++ != '}'); + dialect = 0; + } + else + putc (c, asm_out_file); break; case '}': + if (! dialect) + putc (c, asm_out_file); + dialect = 0; break; #endif diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2a50b83..35f40e5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2001-10-12 Jakub Jelinek + + * testsuite/gcc.dg/20011009-1.c: New test. + 2001-10-12 Nathan Sidwell PR g++/4476 diff --git a/gcc/testsuite/gcc.dg/20011009-1.c b/gcc/testsuite/gcc.dg/20011009-1.c new file mode 100644 index 0000000..dbf32e6 --- /dev/null +++ b/gcc/testsuite/gcc.dg/20011009-1.c @@ -0,0 +1,16 @@ +/* { dg-do run { target i?86-*-* } } */ +/* { dg-options "-O2" } */ + +extern void abort (void); +extern void exit (int); + +int main () +{ + int x; + + asm ("movl $26, %0 # 26 |-> reg \n\t" + "movl $28, %0" : "=r" (x)); + if (x != 28) + abort (); + exit (0); +} -- 2.7.4