This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

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])


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]