aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeil Booth <neil@daikokuya.demon.co.uk>2001-12-08 19:13:04 +0000
committerNeil Booth <neil@gcc.gnu.org>2001-12-08 19:13:04 +0000
commit78e7853794e3f161805694034afb628de9345461 (patch)
tree9dd5e947d351d17759c2d2a3ed6897d33603a496
parent46af705afa95d7876d1048e8425b1180acd238a6 (diff)
downloadgcc-78e7853794e3f161805694034afb628de9345461.zip
gcc-78e7853794e3f161805694034afb628de9345461.tar.gz
gcc-78e7853794e3f161805694034afb628de9345461.tar.bz2
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
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/c-parse.in20
-rw-r--r--gcc/c-typeck.c33
3 files changed, 22 insertions, 38 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 6d7d6b6..d66fb52 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,12 @@
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,
using combine_strings to do the concatenation.
* c-parse.in: Replace uses of the string non-terminal with STRING.
diff --git a/gcc/c-parse.in b/gcc/c-parse.in
index fadef4e..324300d 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 df7606e..a2a06ba 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])
{