This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] Enable LTO support for Ada


> > Or if that's too early do that in free_lang_data?
>
> Let me try that.

This works fine.  I've modelled the handling on that of the gimplifier, i.e. 
free_lang_data_in_one_sizepos is applied to fields to which the counterpart 
gimplify_one_sizepos is applied.

This exposed an oversight in find_decls_types_r: DECL_VALUE_EXPR is streamed 
out by the streamer but it wasn't free_lang_data'ed.

Tested on i586-suse-linux, OK for mainline?


2010-05-03  Eric Botcazou  <ebotcazou@adacore.com>

        * tree.c (free_lang_data_in_one_sizepos): New inline function.
	(free_lang_data_in_type): Call it on TYPE_{MIN|MAX}_VALUE of numerical
	types.  Call it on TYPE_SIZE and TYPE_SIZE_UNIT of all types.
	(free_lang_data_in_decl): Call it on DECL_SIZE and DECL_SIZE_UNIT of
	all decls.  Call it on DECL_FIELD_OFFSET of fields.
	(find_decls_types_r): Follow DECL_VALUE_EXPR.
	(iterative_hash_expr) <PLACEHOLDER_EXPR>: New case.


-- 
Eric Botcazou
Index: tree.c
===================================================================
--- tree.c	(revision 158852)
+++ tree.c	(working copy)
@@ -4150,6 +4150,26 @@ build_type_attribute_variant (tree ttype
 }
 
 
+/* Reset the expression *EXPR_P, a size or position.
+
+   ??? We could reset all non-constant sizes or positions.  But it's cheap
+   enough to not do so and refrain from adding workarounds to dwarf2out.c.
+
+   We need to reset self-referential sizes or positions because they cannot
+   be gimplified and thus can contain a CALL_EXPR after the gimplification
+   is finished, which will run afoul of LTO streaming.  And they need to be
+   reset to something essentially dummy but not constant, so as to preserve
+   the properties of the object they are attached to.  */
+
+static inline void
+free_lang_data_in_one_sizepos (tree *expr_p)
+{
+  tree expr = *expr_p;
+  if (CONTAINS_PLACEHOLDER_P (expr))
+    *expr_p = build0 (PLACEHOLDER_EXPR, TREE_TYPE (expr));
+}
+
+
 /* Reset all the fields in a binfo node BINFO.  We only keep
    BINFO_VIRTUALS, which is used by gimple_fold_obj_type_ref.  */
 
@@ -4256,8 +4276,19 @@ free_lang_data_in_type (tree type)
       /* For non-aggregate types, clear out the language slot (which
 	 overloads TYPE_BINFO).  */
       TYPE_LANG_SLOT_1 (type) = NULL_TREE;
+
+      if (INTEGRAL_TYPE_P (type)
+	  || SCALAR_FLOAT_TYPE_P (type)
+	  || FIXED_POINT_TYPE_P (type))
+	{
+	  free_lang_data_in_one_sizepos (&TYPE_MIN_VALUE (type));
+	  free_lang_data_in_one_sizepos (&TYPE_MAX_VALUE (type));
+	}
     }
 
+  free_lang_data_in_one_sizepos (&TYPE_SIZE (type));
+  free_lang_data_in_one_sizepos (&TYPE_SIZE_UNIT (type));
+
   if (debug_info_level < DINFO_LEVEL_TERSE
       || (TYPE_CONTEXT (type)
 	  && TREE_CODE (TYPE_CONTEXT (type)) != FUNCTION_DECL
@@ -4393,9 +4424,10 @@ free_lang_data_in_decl (tree decl)
        }
    }
 
- /* ???  We could free non-constant DECL_SIZE, DECL_SIZE_UNIT
-    and DECL_FIELD_OFFSET.  But it's cheap enough to not do
-    that and refrain from adding workarounds to dwarf2out.c  */
+  free_lang_data_in_one_sizepos (&DECL_SIZE (decl));
+  free_lang_data_in_one_sizepos (&DECL_SIZE_UNIT (decl));
+  if (TREE_CODE (decl) == FIELD_DECL)
+    free_lang_data_in_one_sizepos (&DECL_FIELD_OFFSET (decl));
 
  /* DECL_FCONTEXT is only used for debug info generation.  */
  if (TREE_CODE (decl) == FIELD_DECL
@@ -4609,6 +4641,10 @@ find_decls_types_r (tree *tp, int *ws, v
 	  fld_worklist_push (DECL_COMDAT_GROUP (t), fld);
 	}
 
+      if ((TREE_CODE (t) == VAR_DECL || TREE_CODE (t) == PARM_DECL)
+	  && DECL_HAS_VALUE_EXPR_P (t))
+	fld_worklist_push (DECL_VALUE_EXPR (t), fld);
+
       if (TREE_CODE (t) != FIELD_DECL)
 	fld_worklist_push (TREE_CHAIN (t), fld);
       *ws = 0;
@@ -6567,11 +6603,12 @@ iterative_hash_expr (const_tree t, hashv
       return iterative_hash_expr (TREE_IMAGPART (t), val);
     case VECTOR_CST:
       return iterative_hash_expr (TREE_VECTOR_CST_ELTS (t), val);
-
     case SSA_NAME:
-      /* we can just compare by pointer.  */
+      /* We can just compare by pointer.  */
       return iterative_hash_host_wide_int (SSA_NAME_VERSION (t), val);
-
+    case PLACEHOLDER_EXPR:
+      /* The node itself doesn't matter.  */
+      return val;
     case TREE_LIST:
       /* A list of expressions, for a CALL_EXPR or as the elements of a
 	 VECTOR_CST.  */

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]