c-parse.in: Take string literals in assembler constructs, not expressions.
authorNeil Booth <neil@daikokuya.demon.co.uk>
Sat, 8 Dec 2001 19:13:04 +0000 (19:13 +0000)
committerNeil Booth <neil@gcc.gnu.org>
Sat, 8 Dec 2001 19:13:04 +0000 (19:13 +0000)
* 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

gcc/ChangeLog
gcc/c-parse.in
gcc/c-typeck.c

index 6d7d6b62016f176d84cbf06073f0d2eff74d6a1d..d66fb52f7ef825d1ca3585dac2ccc70728606fe0 100644 (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,
index fadef4e23ee48ce06c5045a5b64f70494638aee1..324300d00e88ce15732083ae33494319ca454d14 100644 (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); }
index df7606ef8b5269345b55b9c2a2510335e0cdb542..a2a06bac7bf3a6f0a47f3921510f8788b4021b2b 100644 (file)
@@ -6820,27 +6820,16 @@ process_init_element (value)
 \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
@@ -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])
     {