2014-04-16 16:33 GMT+04:00 Ilya Enkovich <enkovich....@gmail.com>: > Hi, > > This patch add new static constructor types used by Pointer Bounds Checker. > It was approved earlier for 4.9 and I'll assume patch is OK for trunk if no > objections arise. > > Patch was bootstrapped and tested for linux-x86_64. > > Thanks, > Ilya > -- > gcc/ > > 2014-04-16 Ilya Enkovich <ilya.enkov...@intel.com> > > * ipa.c (cgraph_build_static_cdtor_1): Support contructors > with "chkp ctor" and "bnd_legacy" attributes. > * gimplify.c (gimplify_init_constructor): Avoid infinite > loop during gimplification of bounds initializer. > > > diff --git a/gcc/gimplify.c b/gcc/gimplify.c > index 7441784..67ab515 100644 > --- a/gcc/gimplify.c > +++ b/gcc/gimplify.c > @@ -3803,10 +3803,19 @@ gimplify_init_constructor (tree *expr_p, gimple_seq > *pre_p, gimple_seq *post_p, > individual element initialization. Also don't do this for small > all-zero initializers (which aren't big enough to merit > clearing), and don't try to make bitwise copies of > - TREE_ADDRESSABLE types. */ > + TREE_ADDRESSABLE types. > + > + We cannot apply such transformation when compiling chkp static > + initializer because creation of initializer image in the memory > + will require static initialization of bounds for it. It should > + result in another gimplification of similar initializer and we > + may fall into infinite loop. */ > if (valid_const_initializer > && !(cleared || num_nonzero_elements == 0) > - && !TREE_ADDRESSABLE (type)) > + && !TREE_ADDRESSABLE (type) > + && (!current_function_decl > + || !lookup_attribute ("chkp ctor", > + DECL_ATTRIBUTES > (current_function_decl)))) > { > HOST_WIDE_INT size = int_size_in_bytes (type); > unsigned int align; > diff --git a/gcc/ipa.c b/gcc/ipa.c > index 26e9b03..5ab3aed 100644 > --- a/gcc/ipa.c > +++ b/gcc/ipa.c > @@ -1345,9 +1345,11 @@ make_pass_ipa_whole_program_visibility (gcc::context > *ctxt) > } > > /* Generate and emit a static constructor or destructor. WHICH must > - be one of 'I' (for a constructor) or 'D' (for a destructor). BODY > - is a STATEMENT_LIST containing GENERIC statements. PRIORITY is the > - initialization priority for this constructor or destructor. > + be one of 'I' (for a constructor), 'D' (for a destructor), 'P' > + (for chp static vars constructor) or 'B' (for chkp static bounds > + constructor). BODY is a STATEMENT_LIST containing GENERIC > + statements. PRIORITY is the initialization priority for this > + constructor or destructor. > > FINAL specify whether the externally visible name for collect2 should > be produced. */ > @@ -1406,6 +1408,20 @@ cgraph_build_static_cdtor_1 (char which, tree body, > int priority, bool final) > DECL_STATIC_CONSTRUCTOR (decl) = 1; > decl_init_priority_insert (decl, priority); > break; > + case 'P': > + DECL_STATIC_CONSTRUCTOR (decl) = 1; > + DECL_ATTRIBUTES (decl) = tree_cons (get_identifier ("chkp ctor"), > + NULL, > + NULL_TREE); > + decl_init_priority_insert (decl, priority); > + break; > + case 'B': > + DECL_STATIC_CONSTRUCTOR (decl) = 1; > + DECL_ATTRIBUTES (decl) = tree_cons (get_identifier ("bnd_legacy"), > + NULL, > + NULL_TREE); > + decl_init_priority_insert (decl, priority); > + break; > case 'D': > DECL_STATIC_DESTRUCTOR (decl) = 1; > decl_fini_priority_insert (decl, priority); > @@ -1423,9 +1439,11 @@ cgraph_build_static_cdtor_1 (char which, tree body, > int priority, bool final) > } > > /* Generate and emit a static constructor or destructor. WHICH must > - be one of 'I' (for a constructor) or 'D' (for a destructor). BODY > - is a STATEMENT_LIST containing GENERIC statements. PRIORITY is the > - initialization priority for this constructor or destructor. */ > + be one of 'I' (for a constructor), 'D' (for a destructor), 'P' > + (for chkp static vars constructor) or 'B' (for chkp static bounds > + constructor). BODY is a STATEMENT_LIST containing GENERIC > + statements. PRIORITY is the initialization priority for this > + constructor or destructor. */ > > void > cgraph_build_static_cdtor (char which, tree body, int priority)
Will install it in a couple of days. Ilya