aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2010-07-09 20:23:14 +0000
committerEric Botcazou <ebotcazou@gcc.gnu.org>2010-07-09 20:23:14 +0000
commitbb02177133880626b88e89c2d8bd9e7dcc74e107 (patch)
tree0997159c88925803203fca27b84d47c8c3f2c8b8 /gcc
parent85e693aa55c220da35b8b205eded6c4ef42093bc (diff)
downloadgcc-bb02177133880626b88e89c2d8bd9e7dcc74e107.zip
gcc-bb02177133880626b88e89c2d8bd9e7dcc74e107.tar.gz
gcc-bb02177133880626b88e89c2d8bd9e7dcc74e107.tar.bz2
trans.c (gnat_gimplify_expr): Deal with CALL_EXPR.
* gcc-interface/trans.c (gnat_gimplify_expr) <ADDR_EXPR>: Deal with CALL_EXPR. From-SVN: r162014
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ada/ChangeLog5
-rw-r--r--gcc/ada/gcc-interface/trans.c44
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gnat.dg/atomic3.adb24
4 files changed, 54 insertions, 23 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index 7acf567..d913806 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,3 +1,8 @@
+2010-07-09 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gcc-interface/trans.c (gnat_gimplify_expr) <ADDR_EXPR>: Deal with
+ CALL_EXPR.
+
2010-07-08 Manuel López-Ibáñez <manu@gcc.gnu.org>
* gcc-interface/utils.c: Include diagnostic-core.h in every file
diff --git a/gcc/ada/gcc-interface/trans.c b/gcc/ada/gcc-interface/trans.c
index 46848f2..988bfa9 100644
--- a/gcc/ada/gcc-interface/trans.c
+++ b/gcc/ada/gcc-interface/trans.c
@@ -5988,33 +5988,31 @@ gnat_gimplify_expr (tree *expr_p, gimple_seq *pre_p,
case ADDR_EXPR:
op = TREE_OPERAND (expr, 0);
- if (TREE_CODE (op) == CONSTRUCTOR)
+ /* If we are taking the address of a constant CONSTRUCTOR, make sure it
+ is put into static memory. We know that it's going to be read-only
+ given the semantics we have and it must be in static memory when the
+ reference is in an elaboration procedure. */
+ if (TREE_CODE (op) == CONSTRUCTOR && TREE_CONSTANT (op))
{
- /* If we are taking the address of a constant CONSTRUCTOR, make sure
- it is put into static memory. We know it's going to be read-only
- given the semantics we have and it must be in static memory when
- the reference is in an elaboration procedure. */
- if (TREE_CONSTANT (op))
- {
- tree addr = build_fold_addr_expr (tree_output_constant_def (op));
- *expr_p = fold_convert (TREE_TYPE (expr), addr);
- }
-
- /* Otherwise explicitly create the local temporary. That's required
- if the type is passed by reference. */
- else
- {
- tree mod, new_var = create_tmp_var_raw (TREE_TYPE (op), "C");
- TREE_ADDRESSABLE (new_var) = 1;
- gimple_add_tmp_var (new_var);
+ tree addr = build_fold_addr_expr (tree_output_constant_def (op));
+ *expr_p = fold_convert (TREE_TYPE (expr), addr);
+ return GS_ALL_DONE;
+ }
- mod = build2 (INIT_EXPR, TREE_TYPE (new_var), new_var, op);
- gimplify_and_add (mod, pre_p);
+ /* Otherwise, if we are taking the address of a non-constant CONSTRUCTOR
+ or of a call, 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)
+ {
+ tree mod, new_var = create_tmp_var_raw (TREE_TYPE (op), "C");
+ TREE_ADDRESSABLE (new_var) = 1;
+ gimple_add_tmp_var (new_var);
- TREE_OPERAND (expr, 0) = new_var;
- recompute_tree_invariant_for_addr_expr (expr);
- }
+ mod = build2 (INIT_EXPR, TREE_TYPE (new_var), new_var, op);
+ gimplify_and_add (mod, pre_p);
+ TREE_OPERAND (expr, 0) = new_var;
+ recompute_tree_invariant_for_addr_expr (expr);
return GS_ALL_DONE;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 13363df..0f0c497 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,7 @@
+2010-07-09 Eric Botcazou <ebotcazou@adacore.com>
+
+ * gnat.dg/atomic3.adb: New test.
+
2010-07-09 Jakub Jelinek <jakub@redhat.com>
Denys Vlasenko <dvlasenk@redhat.com>
Bernhard Reutner-Fischer <aldot@gcc.gnu.org>
diff --git a/gcc/testsuite/gnat.dg/atomic3.adb b/gcc/testsuite/gnat.dg/atomic3.adb
new file mode 100644
index 0000000..592a856
--- /dev/null
+++ b/gcc/testsuite/gnat.dg/atomic3.adb
@@ -0,0 +1,24 @@
+-- { dg-do compile }
+
+procedure Atomic3 is
+
+ type Unsigned_32_T is mod 2 ** 32;
+ for Unsigned_32_T'Size use 32;
+
+ type Id_T is (One, Two, Three);
+
+ type Array_T is array (Id_T) of Unsigned_32_T;
+ pragma Atomic_Components (Array_T);
+
+ A : Array_T := (others => 0);
+
+ function Get_Array return Array_T is
+ begin
+ return A;
+ end;
+
+ X : Array_T;
+
+begin
+ X := Get_Array;
+end;