aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2011-09-11 18:56:40 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2011-09-11 18:56:40 +0000
commit819a653eee396dc4db95ddc3c87805acab08c2de (patch)
tree516e2c4887e847582eb84e0f887fc435be474f8f /gcc
parentc946adde12fa27f4572f3b23917b143e1767e475 (diff)
downloadgcc-819a653eee396dc4db95ddc3c87805acab08c2de.zip
gcc-819a653eee396dc4db95ddc3c87805acab08c2de.tar.gz
gcc-819a653eee396dc4db95ddc3c87805acab08c2de.tar.bz2
decl.c (maybe_pad_type): Do not try to change the form of an addressable type.
* gcc-interface/decl.c (maybe_pad_type): Do not try to change the form of an addressable type. * gcc-interface/trans.c (gnat_gimplify_expr) <VIEW_CONVERT_EXPR>: New. Deal with those cases for which creating a temporary is mandatory. From-SVN: r178764
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog7
-rw-r--r--gcc/ada/gcc-interface/decl.c1
-rw-r--r--gcc/ada/gcc-interface/trans.c22
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/atomic5.adb20
-rw-r--r--gcc/testsuite/gnat.dg/atomic5.ads25
6 files changed, 79 insertions, 0 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 781f4b4..d909529 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,12 @@
2011-09-11 Eric Botcazou <ebotcazou@adacore.com>
+ * gcc-interface/decl.c (maybe_pad_type): Do not try to change the form
+ of an addressable type.
+ * gcc-interface/trans.c (gnat_gimplify_expr) <VIEW_CONVERT_EXPR>: New.
+ Deal with those cases for which creating a temporary is mandatory.
+
+2011-09-11 Eric Botcazou <ebotcazou@adacore.com>
+
* gcc-interface/trans.c (call_to_gnu): Use local variable. Make sure
this is a real formal parameter before testing whether it is by ref.
diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c
index 539c262..0854d5d 100644
--- a/gcc/ada/gcc-interface/decl.c
+++ b/gcc/ada/gcc-interface/decl.c
@@ -6521,6 +6521,7 @@ maybe_pad_type (tree type, tree size, unsigned int align,
if (align != 0
&& TREE_CODE (type) == RECORD_TYPE
&& TYPE_MODE (type) == BLKmode
+ && !TREE_ADDRESSABLE (type)
&& TREE_CODE (orig_size) == INTEGER_CST
&& !TREE_OVERFLOW (orig_size)
&& compare_tree_int (orig_size, MAX_FIXED_MODE_SIZE) <= 0
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c
index fdc8acb..27e2402 100644
--- a/gcc/ada/gcc-interface/trans.c
+++ b/gcc/ada/gcc-interface/trans.c
@@ -6446,6 +6446,28 @@ gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p,
return GS_UNHANDLED;
+ case VIEW_CONVERT_EXPR:
+ op = TREE_OPERAND (expr, 0);
+
+ /* If we are view-converting a CONSTRUCTOR or a call from an aggregate
+ type to a scalar one, explicitly create the local temporary. That's
+ required if the type is passed by reference. */
+ if ((TREE_CODE (op) == CONSTRUCTOR || TREE_CODE (op) == CALL_EXPR)
+ && AGGREGATE_TYPE_P (TREE_TYPE (op))
+ && !AGGREGATE_TYPE_P (TREE_TYPE (expr)))
+ {
+ tree mod, new_var = create_tmp_var_raw (TREE_TYPE (op), "C");
+ gimple_add_tmp_var (new_var);
+
+ mod = build2 (INIT_EXPR, TREE_TYPE (new_var), new_var, op);
+ gimplify_and_add (mod, pre_p);
+
+ TREE_OPERAND (expr, 0) = new_var;
+ return GS_OK;
+ }
+
+ return GS_UNHANDLED;
+
case DECL_EXPR:
op = DECL_EXPR_DECL (expr);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0329dd0..1a298b1 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2011-09-11 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/atomic5.ad[sb]: New test.
+
2011-09-10 H.J. Lu <hongjiu.lu@intel.com>
* gcc.dg/sibcall-6.c: Check ia32 instead of ilp32.
diff --git a/gcc/testsuite/gnat.dg/atomic5.adb b/gcc/testsuite/gnat.dg/atomic5.adb
new file mode 100644
index 0000000..efbed4e
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/atomic5.adb
@@ -0,0 +1,20 @@
+package body Atomic5 is
+
+ function Create return R is
+ begin
+ return (A => 0, B => 1, C => 2, D => 4);
+ end;
+
+ procedure Proc1 is
+ I : Unsigned_32;
+ begin
+ I := Conv(Create);
+ end;
+
+ procedure Proc2 is
+ I : Unsigned_32;
+ begin
+ I := Conv(R'(A => 0, B => 1, C => 2, D => 4));
+ end;
+
+end Atomic5;
diff --git a/gcc/testsuite/gnat.dg/atomic5.ads b/gcc/testsuite/gnat.dg/atomic5.ads
new file mode 100644
index 0000000..3f653fa
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/atomic5.ads
@@ -0,0 +1,25 @@
+-- { dg-do compile }
+
+with Unchecked_Conversion;
+
+package Atomic5 is
+
+ type Byte is mod 2 ** 8;
+ for Byte'Size use 8;
+
+ type Unsigned_32 is mod 2 ** 32;
+ for Unsigned_32'Size use 32;
+
+ type R is record
+ A,B,C,D : Byte;
+ end record;
+ for R'Alignment use 4;
+ pragma Atomic (R);
+
+ function Conv is new Unchecked_Conversion (R, Unsigned_32);
+
+ procedure Proc1;
+
+ procedure Proc2;
+
+end Atomic5;