[PATCH, Pointer Bounds Checker 6/x] New static constructor types
Ilya Enkovich
enkovich.gnu@gmail.com
Thu Jun 5 11:03:00 GMT 2014
2014-06-04 17:35 GMT+04:00 Richard Biener <richard.guenther@gmail.com>:
> On Wed, Jun 4, 2014 at 3:13 PM, Ilya Enkovich <enkovich.gnu@gmail.com> wrote:
>> 2014-06-04 13:58 GMT+04:00 Richard Biener <richard.guenther@gmail.com>:
>>> On Wed, Apr 16, 2014 at 2:33 PM, Ilya Enkovich <enkovich.gnu@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.enkovich@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)
More information about the Gcc-patches
mailing list