ipa.c (cgraph_build_static_cdtor_1): Support contructors with "chkp ctor" and "bnd_le...
authorIlya Enkovich <ilya.enkovich@intel.com>
Wed, 30 Oct 2013 09:08:14 +0000 (09:08 +0000)
committerKirill Yukhin <kyukhin@gcc.gnu.org>
Wed, 30 Oct 2013 09:08:14 +0000 (09:08 +0000)
        * 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.

From-SVN: r204198

gcc/ChangeLog
gcc/gimplify.c
gcc/ipa.c

index dc9bbf85d98e69c1804eb90acaf12babc5e63c3c..e391718c74878985ef5da0473cfb9eb29802ac2e 100644 (file)
@@ -1,3 +1,10 @@
+2013-10-30  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.
+
 2013-10-30  Ilya Enkovich  <ilya.enkovich@intel.com>
 
        * c-family/c-common.c (handle_bnd_variable_size_attribute): New.
index 5edc6e8c33d9e484809df4fe09ba92420d65a6f2..1f18466fa8786ced2ca8f7fbac737471551fb381 100644 (file)
@@ -4080,10 +4080,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;
index 868a9d2ae1dce22fecc528f40afb4577702924e9..9600b48c67484cc60d01abc7b868fdd7926172a8 100644 (file)
--- a/gcc/ipa.c
+++ b/gcc/ipa.c
@@ -1260,9 +1260,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. */
@@ -1321,6 +1323,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);
@@ -1338,9 +1354,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)