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:
parent
46af705afa
commit
78e7853794
3 changed files with 22 additions and 38 deletions
|
@ -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,
|
||||
|
|
|
@ -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); }
|
||||
|
|
|
@ -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])
|
||||
{
|
||||
|
|
Loading…
Add table
Reference in a new issue