diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7d0706022f8c..82d84f68b86d 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 01a9be026e70..db143969dc62 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 5884382b2391..5d2d8d9ae69e 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 2a50b83736d8..35f40e591793 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 000000000000..dbf32e63fba8 --- /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); +}