From: Neil Booth Date: Sat, 8 Dec 2001 19:13:04 +0000 (+0000) Subject: c-parse.in: Take string literals in assembler constructs, not expressions. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=78e7853794e3f161805694034afb628de9345461;p=gcc.git c-parse.in: Take string literals in assembler constructs, not expressions. * c-parse.in: Take string literals in assembler constructs, not expressions. * c-typeck.c (build_asm_stmt, simple_asm_stmt): No need to check the strings are STRING_CSTs. From-SVN: r47795 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6d7d6b62016..d66fb52f7ef 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2001-12-08 Neil Booth + + * c-parse.in: Take string literals in assembler constructs, + not expressions. + * c-typeck.c (build_asm_stmt, simple_asm_stmt): No need to + check the strings are STRING_CSTs. + 2001-12-08 Neil Booth * c-lex.c (c_lex): Peek a token ahead for a string to concatenate, diff --git a/gcc/c-parse.in b/gcc/c-parse.in index fadef4e23ee..324300d00e8 100644 --- a/gcc/c-parse.in +++ b/gcc/c-parse.in @@ -99,7 +99,7 @@ end ifobjc yylval is the node for the constant. */ %token CONSTANT -/* String constants as arrays of the appropriate character type. */ +/* A STRING_CST with type an array of the appropriate character type. */ %token STRING OBJC_STRING /* "...", used for functions with variable arglists. */ @@ -348,14 +348,8 @@ extdef: ifobjc | objcdef end ifobjc - | ASM_KEYWORD '(' expr ')' ';' - { STRIP_NOPS ($3); - if ((TREE_CODE ($3) == ADDR_EXPR - && TREE_CODE (TREE_OPERAND ($3, 0)) == STRING_CST) - || TREE_CODE ($3) == STRING_CST) - assemble_asm ($3); - else - error ("argument of `asm' is not a constant string"); } + | ASM_KEYWORD '(' STRING ')' ';' + { assemble_asm ($3); } | extension extdef { RESTORE_WARN_FLAGS ($1); } ; @@ -2306,20 +2300,20 @@ stmt: | RETURN expr ';' { stmt_count++; $$ = c_expand_return ($2); } - | ASM_KEYWORD maybe_type_qual '(' expr ')' ';' + | ASM_KEYWORD maybe_type_qual '(' STRING ')' ';' { stmt_count++; $$ = simple_asm_stmt ($4); } /* This is the case with just output operands. */ - | ASM_KEYWORD maybe_type_qual '(' expr ':' asm_operands ')' ';' + | ASM_KEYWORD maybe_type_qual '(' STRING ':' asm_operands ')' ';' { stmt_count++; $$ = build_asm_stmt ($2, $4, $6, NULL_TREE, NULL_TREE); } /* This is the case with input operands as well. */ - | ASM_KEYWORD maybe_type_qual '(' expr ':' asm_operands ':' + | ASM_KEYWORD maybe_type_qual '(' STRING ':' asm_operands ':' asm_operands ')' ';' { stmt_count++; $$ = build_asm_stmt ($2, $4, $6, $8, NULL_TREE); } /* This is the case with clobbered registers as well. */ - | ASM_KEYWORD maybe_type_qual '(' expr ':' asm_operands ':' + | ASM_KEYWORD maybe_type_qual '(' STRING ':' asm_operands ':' asm_operands ':' asm_clobbers ')' ';' { stmt_count++; $$ = build_asm_stmt ($2, $4, $6, $8, $10); } diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index df7606ef8b5..a2a06bac7bf 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -6820,27 +6820,16 @@ process_init_element (value) /* Build a simple asm-statement, from one string literal. */ tree -simple_asm_stmt (expr) - tree expr; +simple_asm_stmt (string) + tree string; { - STRIP_NOPS (expr); - - if (TREE_CODE (expr) == ADDR_EXPR) - expr = TREE_OPERAND (expr, 0); + tree stmt; - if (TREE_CODE (expr) == STRING_CST) - { - tree stmt; - - stmt = add_stmt (build_stmt (ASM_STMT, NULL_TREE, expr, - NULL_TREE, NULL_TREE, - NULL_TREE)); - ASM_INPUT_P (stmt) = 1; - return stmt; - } - - error ("argument of `asm' is not a constant string"); - return NULL_TREE; + stmt = add_stmt (build_stmt (ASM_STMT, NULL_TREE, string, + NULL_TREE, NULL_TREE, + NULL_TREE)); + ASM_INPUT_P (stmt) = 1; + return stmt; } /* Build an asm-statement, whose components are a CV_QUALIFIER, a @@ -6856,12 +6845,6 @@ build_asm_stmt (cv_qualifier, string, outputs, inputs, clobbers) { tree tail; - if (TREE_CODE (string) != STRING_CST) - { - error ("asm template is not a string constant"); - return NULL_TREE; - } - if (cv_qualifier != NULL_TREE && cv_qualifier != ridpointers[(int) RID_VOLATILE]) {