diff options
author | Eric Botcazou <ebotcazou@adacore.com> | 2014-07-20 20:33:51 +0000 |
---|---|---|
committer | Eric Botcazou <ebotcazou@adacore.com> | 2014-07-20 20:33:51 +0000 |
commit | 8398b4ce253b53cf1b83244ff138dbc482c46975 (patch) | |
tree | 6f1b82244cdf9a2aa5f62c2e7fbc9805038e9dc3 | |
parent | 0af9f65f17b9ebbf4a43c7ce1887cff093193a79 (diff) |
* expr.c (store_field): Handle VOIDmode for calls that return values
in multiple locations.
git-svn-id: https://gcc.gnu.org/svn/gcc/branches/gcc-4_9-branch@212878 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/expr.c | 2 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/pack20.adb | 9 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/pack20.ads | 15 | ||||
-rw-r--r-- | gcc/testsuite/gnat.dg/pack20_pkg.ads | 7 |
6 files changed, 42 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a7347b4b897..243c02ca2df 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2014-07-20 Eric Botcazou <ebotcazou@adacore.com> + + * expr.c (store_field): Handle VOIDmode for calls that return values + in multiple locations. + 2014-07-19 Eric Botcazou <ebotcazou@adacore.com> * toplev.c (output_stack_usage): Adjust the location of the warning. diff --git a/gcc/expr.c b/gcc/expr.c index 72e440119e4..59e5250e7bb 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -6605,7 +6605,7 @@ store_field (rtx target, HOST_WIDE_INT bitsize, HOST_WIDE_INT bitpos, { HOST_WIDE_INT size = int_size_in_bytes (TREE_TYPE (exp)); rtx temp_target; - if (mode == BLKmode) + if (mode == BLKmode || mode == VOIDmode) mode = smallest_mode_for_size (size * BITS_PER_UNIT, MODE_INT); temp_target = gen_reg_rtx (mode); emit_group_store (temp_target, temp, TREE_TYPE (exp), size); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9d9c8b3d607..83dd684a5a5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-07-20 Eric Botcazou <ebotcazou@adacore.com> + + * gnat.dg/pack20.ad[sb]: New test. + * gnat.dg/pack20_pkg.ads: New helper. + 2014-07-19 Eric Botcazou <ebotcazou@adacore.com> * gcc.dg/stack-usage-2.c: Adjust. diff --git a/gcc/testsuite/gnat.dg/pack20.adb b/gcc/testsuite/gnat.dg/pack20.adb new file mode 100644 index 00000000000..5ec3e93a688 --- /dev/null +++ b/gcc/testsuite/gnat.dg/pack20.adb @@ -0,0 +1,9 @@ +package body Pack20 is + + procedure Proc (A : Rec) is + Local : Rec := A; + begin + Modify (Local.Fixed); + end; + +end Pack20; diff --git a/gcc/testsuite/gnat.dg/pack20.ads b/gcc/testsuite/gnat.dg/pack20.ads new file mode 100644 index 00000000000..ddfb9d8a4db --- /dev/null +++ b/gcc/testsuite/gnat.dg/pack20.ads @@ -0,0 +1,15 @@ +-- { dg-do compile } + +with Pack20_Pkg; use Pack20_Pkg; + +package Pack20 is + + type Rec is record + Simple_Type : Integer; + Fixed : String_Ptr; + end record; + pragma Pack (Rec); + + procedure Proc (A : Rec); + +end Pack20; diff --git a/gcc/testsuite/gnat.dg/pack20_pkg.ads b/gcc/testsuite/gnat.dg/pack20_pkg.ads new file mode 100644 index 00000000000..8f3c554a308 --- /dev/null +++ b/gcc/testsuite/gnat.dg/pack20_pkg.ads @@ -0,0 +1,7 @@ +package Pack20_Pkg is + + type String_Ptr is access all String; + + procedure Modify (Fixed : in out String_Ptr); + +end Pack20_Pkg; |