This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH, Pointer Bounds Checker 6/x] New static constructor types


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]