+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,
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. */
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); }
;
| 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); }
\f
/* 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
{
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])
{