Commit a845a7f5 by Ian Lance Taylor Committed by Ian Lance Taylor

re PR c/37303 (const compound initializers in structs are written to .data instead of .rodata)

gcc/:
	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:
	PR c/37303
	* gcc.dg/pr37303.c: New test.

From-SVN: r187027
parent b7a9facb
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.
2012-05-01 Bernd Schmidt <bernds@codesourcery.com>
* ira.c (allocated_reg_info_size): New static variable.
......
......@@ -4622,7 +4622,9 @@ build_compound_literal (location_t loc, tree type, tree init, bool non_const)
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))
......
......@@ -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 *expr_p, gimple_seq *pre_p)
&& !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 *pre_p, gimple_seq *post_p,
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:
......
2012-05-01 Ian Lance Taylor <iant@google.com>
PR c/37303
* gcc.dg/pr37303.c: New test.
2012-05-01 Richard Henderson <rth@redhat.com>
* lib/target-supports.exp
......
/* { 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} };
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment