This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH, Pointer Bounds Checker 6/x] New static constructor types
- From: Ilya Enkovich <enkovich dot gnu at gmail dot com>
- To: gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Tue, 6 May 2014 16:12:15 +0400
- Subject: Re: [PATCH, Pointer Bounds Checker 6/x] New static constructor types
- Authentication-results: sourceware.org; auth=none
- References: <20140416123320 dot GE4040 at msticlxl57 dot ims dot intel dot com>
2014-04-16 16:33 GMT+04:00 Ilya Enkovich <enkovich.gnu@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.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))))
> {
> 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