diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2010-05-05 17:48:01 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2010-05-05 17:48:01 +0000 |
commit | ca361dec8f52c32553ce31f58acb414869b0b7a8 (patch) | |
tree | 25b31da61091c6f507a936a90a2a40d3b14c9a1b | |
parent | fa6aeae1ad6baf1e8e201508c9db8b4df00024df (diff) | |
download | gcc-ca361dec8f52c32553ce31f58acb414869b0b7a8.zip gcc-ca361dec8f52c32553ce31f58acb414869b0b7a8.tar.gz gcc-ca361dec8f52c32553ce31f58acb414869b0b7a8.tar.bz2 |
gimplify.c (gimplify_return_expr): Gimplify the size expressions of a variable-sized RESULT_DECL.
* gimplify.c (gimplify_return_expr): Gimplify the size expressions of
a variable-sized RESULT_DECL.
From-SVN: r159074
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/gimplify.c | 19 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/lto2.adb | 28 |
4 files changed, 53 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e2c1081..9f656df 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2010-05-05 Eric Botcazou <ebotcazou@adacore.com> + + * gimplify.c (gimplify_return_expr): Gimplify the size expressions of + a variable-sized RESULT_DECL. + 2010-05-05 Maxim Kuvyrkov <maxim@codesourcery.com> * doc/invoke.texi (-mfix-cortex-m3-ldrd): Move from ARC section to ARM. diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 8f7ff89..8d2bc58 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -1228,9 +1228,22 @@ gimplify_return_expr (tree stmt, gimple_seq *pre_p) hard_function_value generates a PARALLEL, we'll die during normal expansion of structure assignments; there's special code in expand_return to handle this case that does not exist in expand_expr. */ - if (!result_decl - || aggregate_value_p (result_decl, TREE_TYPE (current_function_decl))) - result = result_decl; + if (!result_decl) + result = NULL_TREE; + else if (aggregate_value_p (result_decl, TREE_TYPE (current_function_decl))) + { + if (TREE_CODE (DECL_SIZE (result_decl)) != INTEGER_CST) + { + if (!TYPE_SIZES_GIMPLIFIED (TREE_TYPE (result_decl))) + gimplify_type_sizes (TREE_TYPE (result_decl), pre_p); + /* Note that we don't use gimplify_vla_decl because the RESULT_DECL + should be effectively allocated by the caller, i.e. all calls to + this function must be subject to the Return Slot Optimization. */ + gimplify_one_sizepos (&DECL_SIZE (result_decl), pre_p); + gimplify_one_sizepos (&DECL_SIZE_UNIT (result_decl), pre_p); + } + result = result_decl; + } else if (gimplify_ctxp->return_temp) result = gimplify_ctxp->return_temp; else diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index ebba773..9cee690 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2010-05-05 Eric Botcazou <ebotcazou@adacore.com> + + * gnat.dg/lto2.adb: New test. + 2010-05-05 Jason Merrill <jason@redhat.com> PR c++/43787 diff --git a/gcc/testsuite/gnat.dg/lto2.adb b/gcc/testsuite/gnat.dg/lto2.adb new file mode 100644 index 0000000..8738e23 --- /dev/null +++ b/gcc/testsuite/gnat.dg/lto2.adb @@ -0,0 +1,28 @@ +-- { dg-do compile } +-- { dg-options "-flto" } + +procedure Lto2 (Nbytes : Natural) is + + type Message_T (Length : Natural) is record + case Length is + when 0 => null; + when others => Id : Natural; + end case; + end record; + + type Local_Message_T is new Message_T (Nbytes); + + function One_message return Local_Message_T is + M : Local_Message_T; + begin + if M.Length > 0 then + M.Id := 1; + end if; + return M; + end; + + procedure Process (X : Local_Message_T) is begin null; end; + +begin + Process (One_Message); +end; |