This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Strings and asm
- From: Neil Booth <neil at daikokuya dot demon dot co dot uk>
- To: gcc-patches at gcc dot gnu dot org
- Cc: "Joseph S. Myers" <jsm28 at cam dot ac dot uk>
- Date: Sat, 8 Dec 2001 18:49:15 +0000
- Subject: Strings and asm
This makes the C front end consistent with itself, its documentation,
and with the C++ front end.
Bootstrapped x86 Linux without regressions. OK to commit?
Neil.
* 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.
Index: c-parse.in
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-parse.in,v
retrieving revision 1.118
diff -u -p -r1.118 c-parse.in
--- c-parse.in 2001/12/08 12:01:52 1.118
+++ c-parse.in 2001/12/08 17:16:41
@@ -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); }
Index: c-typeck.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/c-typeck.c,v
retrieving revision 1.156
diff -u -p -r1.156 c-typeck.c
--- c-typeck.c 2001/12/08 12:01:52 1.156
+++ c-typeck.c 2001/12/08 17:16:54
@@ -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);
-
- if (TREE_CODE (expr) == STRING_CST)
- {
- tree stmt;
+ 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
@@ -6855,12 +6844,6 @@ build_asm_stmt (cv_qualifier, string, ou
tree 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])