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]

Put constant compound initializers in .rodata


This patch to the C frontend and the middle-end puts constant compound
initializers in the readonly data section where possible.  This is for
PR 37303.  Bootstrapped and ran full testsuite on
x86_64-unknown-linux-gnu.

OK for mainline?

Ian


gcc/:

2012-05-01  Ian Lance Taylor  <iant@google.com>

	PR c/37303
	* c-decl.c (build_compound_literal): Make the decl readonly if it
	an array of a readonly type.
	* gimplify.c (gimplify_compound_literal_expr): Add fallback
	parameter.  Change all callers.  If the decl is not addressable
	and is not an l-value, make it readonly.

gcc/testsuite/:

2012-05-01  Ian Lance Taylor  <iant@google.com>

	PR c/37303
	* gcc.dg/pr37303.c: New test.


Index: gimplify.c
===================================================================
--- gimplify.c	(revision 187020)
+++ gimplify.c	(working copy)
@@ -3756,7 +3756,8 @@ rhs_predicate_for (tree lhs)
    decl instead.  */
 
 static enum gimplify_status
-gimplify_compound_literal_expr (tree *expr_p, gimple_seq *pre_p)
+gimplify_compound_literal_expr (tree *expr_p, gimple_seq *pre_p,
+				fallback_t fallback)
 {
   tree decl_s = COMPOUND_LITERAL_EXPR_DECL_EXPR (*expr_p);
   tree decl = DECL_EXPR_DECL (decl_s);
@@ -3775,6 +3776,12 @@ gimplify_compound_literal_expr (tree *ex
       && !needs_to_live_in_memory (decl))
     DECL_GIMPLE_REG_P (decl) = 1;
 
+  /* If the decl is not addressable, then it is being used in some
+     expression or on the right hand side of a statement, and it can
+     be put into a readonly data section.  */
+  if (!TREE_ADDRESSABLE (decl) && (fallback & fb_lvalue) == 0)
+    TREE_READONLY (decl) = 1;
+
   /* This decl isn't mentioned in the enclosing block, so add it to the
      list of temps.  FIXME it seems a bit of a kludge to say that
      anonymous artificial vars aren't pushed, but everything else is.  */
@@ -7071,7 +7078,7 @@ gimplify_expr (tree *expr_p, gimple_seq 
 	  break;
 
 	case COMPOUND_LITERAL_EXPR:
-	  ret = gimplify_compound_literal_expr (expr_p, pre_p);
+	  ret = gimplify_compound_literal_expr (expr_p, pre_p, fallback);
 	  break;
 
 	case MODIFY_EXPR:
Index: c-decl.c
===================================================================
--- c-decl.c	(revision 187020)
+++ c-decl.c	(working copy)
@@ -4622,7 +4622,9 @@ build_compound_literal (location_t loc, 
   TREE_USED (decl) = 1;
   DECL_READ_P (decl) = 1;
   TREE_TYPE (decl) = type;
-  TREE_READONLY (decl) = TYPE_READONLY (type);
+  TREE_READONLY (decl) = (TYPE_READONLY (type)
+			  || (TREE_CODE (type) == ARRAY_TYPE
+			      && TYPE_READONLY (TREE_TYPE (type))));
   store_init_value (loc, decl, init, NULL_TREE);
 
   if (TREE_CODE (type) == ARRAY_TYPE && !COMPLETE_TYPE_P (type))
Index: testsuite/gcc.dg/pr37303.c
===================================================================
--- testsuite/gcc.dg/pr37303.c	(revision 0)
+++ testsuite/gcc.dg/pr37303.c	(revision 0)
@@ -0,0 +1,5 @@
+/* { dg-do compile { target *-*-elf* *-*-linux-gnu* } } */
+/* { dg-options "-std=c99" }
+/* { dg-final { scan-assembler "rodata" } } */
+
+struct S { const int *x; } s = { (const int[]){1, 2, 3} };

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