From: Ian Lance Taylor Date: Tue, 1 May 2012 21:25:15 +0000 (+0000) Subject: re PR c/37303 (const compound initializers in structs are written to .data instead... X-Git-Tag: upstream/12.2.0~76562 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a845a7f5aa73f695fd44fac430bf4ac684515173;p=platform%2Fupstream%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d86d30e..5cf6a8f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2012-05-01 Ian Lance Taylor + + 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 * ira.c (allocated_reg_info_size): New static variable. diff --git a/gcc/c-decl.c b/gcc/c-decl.c index 72fad86..158b3ad 100644 --- a/gcc/c-decl.c +++ b/gcc/c-decl.c @@ -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)) diff --git a/gcc/gimplify.c b/gcc/gimplify.c index cef6118..9c58a38 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -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: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 952f1d3..8f32793 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2012-05-01 Ian Lance Taylor + + PR c/37303 + * gcc.dg/pr37303.c: New test. + 2012-05-01 Richard Henderson * lib/target-supports.exp diff --git a/gcc/testsuite/gcc.dg/pr37303.c b/gcc/testsuite/gcc.dg/pr37303.c new file mode 100644 index 0000000..434fc9d --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr37303.c @@ -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} };