Ping
2014-06-05 15:03 GMT+04:00 Ilya Enkovich <enkovich....@gmail.com>: > 2014-06-04 17:35 GMT+04:00 Richard Biener <richard.guent...@gmail.com>: >> On Wed, Jun 4, 2014 at 3:13 PM, Ilya Enkovich <enkovich....@gmail.com> wrote: >>> 2014-06-04 13:58 GMT+04:00 Richard Biener <richard.guent...@gmail.com>: >>>> On Wed, Apr 16, 2014 at 2:33 PM, Ilya Enkovich <enkovich....@gmail.com> >>>> wrote: >>>>> 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)))) >>>> >>>> Simply make the type TREE_ADDRESSABLE? >>> >>> Wouldn't it be a hack to mark it addressable just to not hit this >>> condition? It would also require to have an unshared copy of the type >>> to not affect other statements with that type. >>> >>>> >>>>> { >>>>> 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); >>>> >>>> Ick. Please try to avoid using attributes for this. Rather adjust the >>>> caller of this function to set a flag in the cgraph node. >>> >>> It is too late because all early local passes are executed by that >>> time and I need this attribute to be set before them. >> >> Ok, so where do you call this from? It should be possible to create >> the function in GIMPLE form directly, avoiding the need to go through >> gimplification. > > I create constructors at the end of unit compilation in > chkp_finish_file. Constructor body in this case is MODIFY_EXPRs for > all statically initialized pointers. "chkp ctor" attribute is used to > instrument this constructor properly - all pointer modifications > should be replaced with corresponding bounds initialization. Thus > gimplification is not the only place where this attribute is used. > > Ilya > >> >> Richard. >> >>> Ilya >>> >>>> >>>> So I don't like this patch at all. >>>> >>>> Richard. >>>> >>>>> + 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)