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
This commit is contained in:
Neil Booth 2001-12-08 19:13:04 +00:00 committed by Neil Booth
parent 46af705afa
commit 78e7853794
3 changed files with 22 additions and 38 deletions

View file

@ -1,3 +1,10 @@
2001-12-08 Neil Booth <neil@daikokuya.demon.co.uk>
* 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 <neil@daikokuya.demon.co.uk>
* c-lex.c (c_lex): Peek a token ahead for a string to concatenate,

View file

@ -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); }

View file

@ -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);
tree stmt;
if (TREE_CODE (expr) == ADDR_EXPR)
expr = TREE_OPERAND (expr, 0);
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])
{