Commit 1448093c by Tristan Gingold Committed by Eric Botcazou

tree.h (CONSTRUCTOR_NO_CLEARING): Define.

	* tree.h (CONSTRUCTOR_NO_CLEARING): Define.
	* tree-core.h (CONSTRUCTOR_NO_CLEARING): Document it.
	* tree.def (CONSTRUCTOR): Likewise.
	* doc/generic.texi (CONSTRUCTOR): Likewise.  Update description.
	* 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.

From-SVN: r204677
parent 7008512d
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.
* doc/generic.texi (CONSTRUCTOR): Likewise. Update description.
* gimplify.c (gimplify_init_constructor): Do not clear the object when
the constructor is incomplete and CONSTRUCTOR_NO_CLEARING is set.
2013-11-11 Basile Starynkevitch <basile@starynkevitch.net> 2013-11-11 Basile Starynkevitch <basile@starynkevitch.net>
* toplev.c (toplev_main): Move PLUGIN_FINISH invocation before * toplev.c (toplev_main): Move PLUGIN_FINISH invocation before
diagnostic_finish. diagnostic_finish.
2013-11-11 Kyrylo Tkachov <kyrylo.tkachov@arm.com> 2013-11-11 Kyrylo Tkachov <kyrylo.tkachov@arm.com>
2013-11-11 Tristan Gingold <gingold@adacore.com>
Eric Botcazou <ebotcazou@adacore.com>
* gcc-interface/utils2.c (gnat_build_constructor): Also set the flag
CONSTRUCTOR_NO_CLEARING on the constructor.
2013-10-30 Sharad Singhai <singhai@google.com> 2013-10-30 Sharad Singhai <singhai@google.com>
* gnat_ugn.texi: Remove option description for PR middle-end/58134. * gnat_ugn.texi: Remove option description for PR middle-end/58134.
......
...@@ -1874,6 +1874,7 @@ gnat_build_constructor (tree type, vec<constructor_elt, va_gc> *v) ...@@ -1874,6 +1874,7 @@ gnat_build_constructor (tree type, vec<constructor_elt, va_gc> *v)
v->qsort (compare_elmt_bitpos); v->qsort (compare_elmt_bitpos);
result = build_constructor (type, v); result = build_constructor (type, v);
CONSTRUCTOR_NO_CLEARING (result) = 1;
TREE_CONSTANT (result) = TREE_STATIC (result) = allconstant; TREE_CONSTANT (result) = TREE_STATIC (result) = allconstant;
TREE_SIDE_EFFECTS (result) = side_effects; TREE_SIDE_EFFECTS (result) = side_effects;
TREE_READONLY (result) = TYPE_READONLY (type) || allconstant; TREE_READONLY (result) = TYPE_READONLY (type) || allconstant;
......
...@@ -1616,29 +1616,31 @@ of temporaries during the evaluation of that expression should be ...@@ -1616,29 +1616,31 @@ of temporaries during the evaluation of that expression should be
performed immediately after the expression is evaluated. performed immediately after the expression is evaluated.
@item CONSTRUCTOR @item CONSTRUCTOR
These nodes represent the brace-enclosed initializers for a structure or These nodes represent the brace-enclosed initializers for a structure or an
array. The first operand is reserved for use by the back end. The array. They contain a sequence of component values made out of a vector of
second operand is a @code{TREE_LIST}. If the @code{TREE_TYPE} of the constructor_elt, which is a (@code{INDEX}, @code{VALUE}) pair.
@code{CONSTRUCTOR} is a @code{RECORD_TYPE} or @code{UNION_TYPE}, then
the @code{TREE_PURPOSE} of each node in the @code{TREE_LIST} will be a If the @code{TREE_TYPE} of the @code{CONSTRUCTOR} is a @code{RECORD_TYPE},
@code{FIELD_DECL} and the @code{TREE_VALUE} of each node will be the @code{UNION_TYPE} or @code{QUAL_UNION_TYPE} then the @code{INDEX} of each
expression used to initialize that field. node in the sequence will be a @code{FIELD_DECL} and the @code{VALUE} will
be the expression used to initialize that field.
If the @code{TREE_TYPE} of the @code{CONSTRUCTOR} is an
@code{ARRAY_TYPE}, then the @code{TREE_PURPOSE} of each element in the If the @code{TREE_TYPE} of the @code{CONSTRUCTOR} is an @code{ARRAY_TYPE},
@code{TREE_LIST} will be an @code{INTEGER_CST} or a @code{RANGE_EXPR} of then the @code{INDEX} of each node in the sequence will be an
two @code{INTEGER_CST}s. A single @code{INTEGER_CST} indicates which @code{INTEGER_CST} or a @code{RANGE_EXPR} of two @code{INTEGER_CST}s.
element of the array (indexed from zero) is being assigned to. A A single @code{INTEGER_CST} indicates which element of the array is being
@code{RANGE_EXPR} indicates an inclusive range of elements to assigned to. A @code{RANGE_EXPR} indicates an inclusive range of elements
initialize. In both cases the @code{TREE_VALUE} is the corresponding to initialize. In both cases the @code{VALUE} is the corresponding
initializer. It is re-evaluated for each element of a initializer. It is re-evaluated for each element of a
@code{RANGE_EXPR}. If the @code{TREE_PURPOSE} is @code{NULL_TREE}, then @code{RANGE_EXPR}. If the @code{INDEX} is @code{NULL_TREE}, then
the initializer is for the next available array element. the initializer is for the next available array element.
In the front end, you should not depend on the fields appearing in any In the front end, you should not depend on the fields appearing in any
particular order. However, in the middle end, fields must appear in particular order. However, in the middle end, fields must appear in
declaration order. You should not assume that all fields will be declaration order. You should not assume that all fields will be
represented. Unrepresented fields will be set to zero. represented. Unrepresented fields will be cleared (zeroed), unless the
CONSTRUCTOR_NO_CLEARING flag is set, in which case their value becomes
undefined.
@item COMPOUND_LITERAL_EXPR @item COMPOUND_LITERAL_EXPR
@findex COMPOUND_LITERAL_EXPR_DECL_EXPR @findex COMPOUND_LITERAL_EXPR_DECL_EXPR
......
...@@ -831,6 +831,9 @@ struct GTY(()) tree_base { ...@@ -831,6 +831,9 @@ struct GTY(()) tree_base {
VAR_DECL, FUNCTION_DECL VAR_DECL, FUNCTION_DECL
IDENTIFIER_NODE IDENTIFIER_NODE
CONSTRUCTOR_NO_CLEARING in
CONSTRUCTOR
ASM_VOLATILE_P in ASM_VOLATILE_P in
ASM_EXPR ASM_EXPR
......
...@@ -445,10 +445,12 @@ DEFTREECODE (INDIRECT_REF, "indirect_ref", tcc_reference, 1) ...@@ -445,10 +445,12 @@ DEFTREECODE (INDIRECT_REF, "indirect_ref", tcc_reference, 1)
OBJ_TYPE_REF_TOKEN: An integer index to the virtual method table. */ OBJ_TYPE_REF_TOKEN: An integer index to the virtual method table. */
DEFTREECODE (OBJ_TYPE_REF, "obj_type_ref", tcc_expression, 3) DEFTREECODE (OBJ_TYPE_REF, "obj_type_ref", tcc_expression, 3)
/* Constructor: return an aggregate value made from specified components. /* Used to represent the brace-enclosed initializers for a structure or an
In C, this is used only for structure and array initializers. array. It contains a sequence of component values made out of a VEC of
The operand is a sequence of component values made out of a VEC of constructor_elt.
struct constructor_elt.
For RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE:
The field INDEX of each constructor_elt is a FIELD_DECL.
For ARRAY_TYPE: For ARRAY_TYPE:
The field INDEX of each constructor_elt is the corresponding index. The field INDEX of each constructor_elt is the corresponding index.
...@@ -457,8 +459,9 @@ DEFTREECODE (OBJ_TYPE_REF, "obj_type_ref", tcc_expression, 3) ...@@ -457,8 +459,9 @@ DEFTREECODE (OBJ_TYPE_REF, "obj_type_ref", tcc_expression, 3)
has side-effects, they are evaluated once for each element. Wrap the has side-effects, they are evaluated once for each element. Wrap the
value in a SAVE_EXPR if you want to evaluate side effects only once.) value in a SAVE_EXPR if you want to evaluate side effects only once.)
For RECORD_TYPE, UNION_TYPE, or QUAL_UNION_TYPE: Components that aren't present are cleared as per the C semantics,
The field INDEX of each node is a FIELD_DECL. */ unless the CONSTRUCTOR_NO_CLEARING flag is set, in which case their
value becomes undefined. */
DEFTREECODE (CONSTRUCTOR, "constructor", tcc_exceptional, 0) DEFTREECODE (CONSTRUCTOR, "constructor", tcc_exceptional, 0)
/* The expression types are mostly straightforward, with the fourth argument /* The expression types are mostly straightforward, with the fourth argument
......
...@@ -957,6 +957,8 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int, ...@@ -957,6 +957,8 @@ extern void omp_clause_range_check_failed (const_tree, const char *, int,
(&(*CONSTRUCTOR_ELTS (NODE))[IDX]) (&(*CONSTRUCTOR_ELTS (NODE))[IDX])
#define CONSTRUCTOR_NELTS(NODE) \ #define CONSTRUCTOR_NELTS(NODE) \
(vec_safe_length (CONSTRUCTOR_ELTS (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 /* Iterate through the vector V of CONSTRUCTOR_ELT elements, yielding the
value of each element (stored within VAL). IX must be a scratch variable value of each element (stored within VAL). IX must be a scratch variable
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment