* [Ada] Remove call to unshare_expr from gigi
@ 2012-03-07 18:56 Eric Botcazou
0 siblings, 0 replies; only message in thread
From: Eric Botcazou @ 2012-03-07 18:56 UTC (permalink / raw)
To: gcc-patches
[-- Attachment #1: Type: text/plain, Size: 420 bytes --]
There is a single call to unshare_expr in gigi and it is actually superfluous
if you do things properly.
Tested on i586-suse-linux, applied on the mainline.
2012-03-07 Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/trans.c (Identifier_to_gnu): Don't unshare initializer.
(add_decl_expr): Mark external DECLs as used.
* gcc-interface/utils.c (convert) <CONSTRUCTOR>: Copy the vector.
--
Eric Botcazou
[-- Attachment #2: p.diff --]
[-- Type: text/x-diff, Size: 2375 bytes --]
Index: gcc-interface/utils.c
===================================================================
--- gcc-interface/utils.c (revision 184852)
+++ gcc-interface/utils.c (working copy)
@@ -3894,6 +3894,8 @@ convert (tree type, tree expr)
{
expr = copy_node (expr);
TREE_TYPE (expr) = type;
+ CONSTRUCTOR_ELTS (expr)
+ = VEC_copy (constructor_elt, gc, CONSTRUCTOR_ELTS (expr));
return expr;
}
Index: gcc-interface/trans.c
===================================================================
--- gcc-interface/trans.c (revision 184852)
+++ gcc-interface/trans.c (working copy)
@@ -1102,11 +1102,9 @@ Identifier_to_gnu (Node_Id gnat_node, tr
= lvalue_required_p (gnat_node, gnu_result_type, true,
address_of_constant, Is_Aliased (gnat_temp));
- /* ??? We need to unshare the initializer if the object is external
- as such objects are not marked for unsharing if we are not at the
- global level. This should be fixed in add_decl_expr. */
+ /* Finally retrieve the initializer if this is deemed valid. */
if ((constant_only && !address_of_constant) || !require_lvalue)
- gnu_result = unshare_expr (DECL_INITIAL (gnu_result));
+ gnu_result = DECL_INITIAL (gnu_result);
}
/* The GNAT tree has the type of a function set to its result type, so we
@@ -7113,10 +7111,10 @@ add_decl_expr (tree gnu_decl, Entity_Id
gnu_stmt = build1 (DECL_EXPR, void_type_node, gnu_decl);
- /* If we are global, we don't want to actually output the DECL_EXPR for
- this decl since we already have evaluated the expressions in the
+ /* If we are external or global, we don't want to output the DECL_EXPR for
+ this DECL node since we already have evaluated the expressions in the
sizes and positions as globals and doing it again would be wrong. */
- if (global_bindings_p ())
+ if (DECL_EXTERNAL (gnu_decl) || global_bindings_p ())
{
/* Mark everything as used to prevent node sharing with subprograms.
Note that walk_tree knows how to deal with TYPE_DECL, but neither
@@ -7135,7 +7133,7 @@ add_decl_expr (tree gnu_decl, Entity_Id
&& !TYPE_FAT_POINTER_P (type))
MARK_VISITED (TYPE_ADA_SIZE (type));
}
- else if (!DECL_EXTERNAL (gnu_decl))
+ else
add_stmt_with_node (gnu_stmt, gnat_entity);
/* If this is a variable and an initializer is attached to it, it must be
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2012-03-07 18:56 UTC | newest]
Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-03-07 18:56 [Ada] Remove call to unshare_expr from gigi Eric Botcazou
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).