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]

[patch] Add CONSTRUCTOR_NO_CLEARING flag


Hi,

in Ada 2012 it is allowed to omit components of aggregates (the equivalent of 
initializers/constructors); in this case, the contents of the corresponding 
fields in the record become undefined.  Now the gimplifier implements the C 
semantics of clearing the missing components, so this patch introduces a new 
flag on constructors to modify that.

Tested on x86_64-suse-linux, OK for the mainline?


2013-11-11  Tristan Gingold  <gingold@adacore.com>
            Eric Botcazou  <ebotcazou@adacore.com>

	* tree.h (CONSTRUCTOR_NO_CLEARING): Define.
	* tree-core.h (CONSTRUCTOR_NO_CLEARING): Document it.
	* tree.def (CONSTRUCTOR): Likewise.
	* gimplify.c (gimplify_init_constructor): Do not clear the object when
	the constructor is incomplete and CONSTRUCTOR_NO_CLEARING is set.
ada/
	* gcc-interface/utils2.c (gnat_build_constructor): Also set the flag
	CONSTRUCTOR_NO_CLEARING on the constructor.


-- 
Eric Botcazou
Index: tree-core.h
===================================================================
--- tree-core.h	(revision 204444)
+++ tree-core.h	(working copy)
@@ -823,6 +823,9 @@ struct GTY(()) tree_base {
            VAR_DECL, FUNCTION_DECL
            IDENTIFIER_NODE
 
+       CONSTRUCTOR_NO_CLEARING in
+           CONSTRUCTOR
+
        ASM_VOLATILE_P in
            ASM_EXPR
 
Index: tree.h
===================================================================
--- tree.h	(revision 204444)
+++ tree.h	(working copy)
@@ -957,6 +957,8 @@ extern void omp_clause_range_check_faile
   (&(*CONSTRUCTOR_ELTS (NODE))[IDX])
 #define CONSTRUCTOR_NELTS(NODE) \
   (vec_safe_length (CONSTRUCTOR_ELTS (NODE)))
+#define CONSTRUCTOR_NO_CLEARING(NODE) \
+  (CONSTRUCTOR_CHECK (NODE)->base.public_flag)
 
 /* Iterate through the vector V of CONSTRUCTOR_ELT elements, yielding the
    value of each element (stored within VAL). IX must be a scratch variable
Index: tree.def
===================================================================
--- tree.def	(revision 204444)
+++ tree.def	(working copy)
@@ -458,7 +458,10 @@ DEFTREECODE (OBJ_TYPE_REF, "obj_type_ref
    value in a SAVE_EXPR if you want to evaluate side effects only once.)
 
    For RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE:
-   The field INDEX of each node is a FIELD_DECL.  */
+   The field INDEX of each node is a FIELD_DECL.
+   Components that aren't present are cleared as per the C semantics,
+   unless the CONSTRUCTOR_NO_CLEARING flag is set, in which case they
+   become undefined.  */
 DEFTREECODE (CONSTRUCTOR, "constructor", tcc_exceptional, 0)
 
 /* The expression types are mostly straightforward, with the fourth argument
Index: gimplify.c
===================================================================
--- gimplify.c	(revision 204444)
+++ gimplify.c	(working copy)
@@ -4052,7 +4052,7 @@ gimplify_init_constructor (tree *expr_p,
 	     objects.  Initializers for such objects must explicitly set
 	     every field that needs to be set.  */
 	  cleared = false;
-	else if (!complete_p)
+	else if (!complete_p && !CONSTRUCTOR_NO_CLEARING (ctor))
 	  /* If the constructor isn't complete, clear the whole object
 	     beforehand.
 
Index: ada/gcc-interface/utils2.c
===================================================================
--- ada/gcc-interface/utils2.c	(revision 204444)
+++ ada/gcc-interface/utils2.c	(working copy)
@@ -1874,6 +1874,7 @@ gnat_build_constructor (tree type, vec<c
     v->qsort (compare_elmt_bitpos);
 
   result = build_constructor (type, v);
+  CONSTRUCTOR_NO_CLEARING (result) = 1;
   TREE_CONSTANT (result) = TREE_STATIC (result) = allconstant;
   TREE_SIDE_EFFECTS (result) = side_effects;
   TREE_READONLY (result) = TYPE_READONLY (type) || allconstant;

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