diff options
author | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-05-01 21:25:15 +0000 |
---|---|---|
committer | ian <ian@138bc75d-0d04-0410-961f-82ee72b054a4> | 2012-05-01 21:25:15 +0000 |
commit | 73242672e877fad79873cf3e764dc4e8771870bb (patch) | |
tree | ed944aa62023941006f92af1582be1c26ecce946 /gcc/gimplify.c | |
parent | 970b2c22a884383459d455b8614222caa320c7d6 (diff) | |
download | gcc-73242672e877fad79873cf3e764dc4e8771870bb.tar.gz |
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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@187027 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/gimplify.c')
-rw-r--r-- | gcc/gimplify.c | 11 |
1 files changed, 9 insertions, 2 deletions
diff --git a/gcc/gimplify.c b/gcc/gimplify.c index cef61180c38..9c58a38b927 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: |