tree-chkp.c (chkp_find_const_bounds_var): Remove.
authorIlya Enkovich <ilya.enkovich@intel.com>
Wed, 8 Apr 2015 19:34:41 +0000 (19:34 +0000)
committerIlya Enkovich <ienkovich@gcc.gnu.org>
Wed, 8 Apr 2015 19:34:41 +0000 (19:34 +0000)
gcc/

* tree-chkp.c (chkp_find_const_bounds_var): Remove.
(chkp_make_static_const_bounds): Search existing
symbol by assembler name.  Use make_decl_one_only.
(chkp_get_zero_bounds_var): Remove node search which
is now performed in chkp_make_static_const_bounds.
(chkp_get_none_bounds_var): Likewise.

gcc/testsuite/

* gcc.dg/lto/chkp-static-bounds_0.c: New.

From-SVN: r221932

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/lto/chkp-static-bounds_0.c [new file with mode: 0644]
gcc/tree-chkp.c

index 56c7ae985d6e41951b1c9a61eb1931cc8e032e16..14e57c3c93c4d6d83ce1d8fb485a85f99c3261b6 100644 (file)
@@ -1,3 +1,12 @@
+2015-04-08  Ilya Enkovich  <ilya.enkovich@intel.com>
+
+       * tree-chkp.c (chkp_find_const_bounds_var): Remove.
+       (chkp_make_static_const_bounds): Search existing
+       symbol by assembler name.  Use make_decl_one_only.
+       (chkp_get_zero_bounds_var): Remove node search which
+       is now performed in chkp_make_static_const_bounds.
+       (chkp_get_none_bounds_var): Likewise.
+
 2015-04-08  Michael Witten  <mfwitten@gmail.com>
 
        * doc/extend.texi (Attribute Syntax): Add a trailing semicolon
index f3b61e560403fed6306bc4851ed0467abf903334..ba6f84142d86da6d27bc31c82691b819d7db08f7 100644 (file)
@@ -1,3 +1,7 @@
+2015-04-08  Ilya Enkovich  <ilya.enkovich@intel.com>
+
+       * gcc.dg/lto/chkp-static-bounds_0.c: New.
+
 2015-04-08  Ilya Enkovich  <ilya.enkovich@intel.com>
 
        * gcc.target/i386/mpx/chkp-thunk-comdat-3.c: New.
diff --git a/gcc/testsuite/gcc.dg/lto/chkp-static-bounds_0.c b/gcc/testsuite/gcc.dg/lto/chkp-static-bounds_0.c
new file mode 100644 (file)
index 0000000..596e551
--- /dev/null
@@ -0,0 +1,26 @@
+/* { dg-lto-do link } */
+/* { dg-require-effective-target mpx } */
+/* { dg-lto-options { { -flto -flto-partition=max -fcheck-pointer-bounds -mmpx } } } */
+
+const char *cc;
+
+int test1 (const char *c)
+{
+  c = __builtin___bnd_init_ptr_bounds (c);
+  cc = c;
+  return c[0] * 2;
+}
+
+struct S
+{
+  int (*fnptr) (const char *);
+} S;
+
+struct S s1 = {test1};
+struct S s2 = {test1};
+struct S s3 = {test1};
+
+int main (int argc, const char **argv)
+{
+  return s1.fnptr (argv[0]) + s2.fnptr (argv[1]);
+}
index 541af29a48a0ac30bfe66604a63625ab81764163..8c5a628a9ad5bf6369ddab20720e1691ce055982 100644 (file)
@@ -1902,33 +1902,6 @@ chkp_add_bounds_to_call_stmt (gimple_stmt_iterator *gsi)
   gimple_call_set_with_bounds (new_call, true);
 }
 
-/* Return constant static bounds var with specified LB and UB
-   if such var exists in varpool.  Return NULL otherwise.  */
-static tree
-chkp_find_const_bounds_var (HOST_WIDE_INT lb,
-                           HOST_WIDE_INT ub)
-{
-  tree val = targetm.chkp_make_bounds_constant (lb, ub);
-  struct varpool_node *node;
-
-  /* We expect bounds constant is represented as a complex value
-     of two pointer sized integers.  */
-  gcc_assert (TREE_CODE (val) == COMPLEX_CST);
-
-  FOR_EACH_VARIABLE (node)
-    if (POINTER_BOUNDS_P (node->decl)
-       && TREE_READONLY (node->decl)
-       && DECL_INITIAL (node->decl)
-       && TREE_CODE (DECL_INITIAL (node->decl)) == COMPLEX_CST
-       && tree_int_cst_equal (TREE_REALPART (DECL_INITIAL (node->decl)),
-                              TREE_REALPART (val))
-       && tree_int_cst_equal (TREE_IMAGPART (DECL_INITIAL (node->decl)),
-                              TREE_IMAGPART (val)))
-      return node->decl;
-
-  return NULL;
-}
-
 /* Return constant static bounds var with specified bounds LB and UB.
    If such var does not exists then new var is created with specified NAME.  */
 static tree
@@ -1936,37 +1909,43 @@ chkp_make_static_const_bounds (HOST_WIDE_INT lb,
                               HOST_WIDE_INT ub,
                               const char *name)
 {
+  tree id = get_identifier (name);
   tree var;
+  varpool_node *node;
+  symtab_node *snode;
+
+  var  = build_decl (UNKNOWN_LOCATION, VAR_DECL, id,
+                    pointer_bounds_type_node);
+  TREE_STATIC (var) = 1;
+  TREE_PUBLIC (var) = 1;
 
   /* With LTO we may have constant bounds already in varpool.
      Try to find it.  */
-  var = chkp_find_const_bounds_var (lb, ub);
-
-  if (var)
-    return var;
-
-  var  = build_decl (UNKNOWN_LOCATION, VAR_DECL,
-                    get_identifier (name), pointer_bounds_type_node);
+  if ((snode = symtab_node::get_for_asmname (DECL_ASSEMBLER_NAME (var))))
+    {
+      /* We don't allow this symbol usage for non bounds.  */
+      if (snode->type != SYMTAB_VARIABLE
+         || !POINTER_BOUNDS_P (snode->decl))
+       sorry ("-fcheck-pointer-bounds requires '%s' "
+              "name for internal usage",
+              IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (var)));
+
+      return snode->decl;
+    }
 
-  TREE_PUBLIC (var) = 1;
   TREE_USED (var) = 1;
   TREE_READONLY (var) = 1;
-  TREE_STATIC (var) = 1;
   TREE_ADDRESSABLE (var) = 0;
   DECL_ARTIFICIAL (var) = 1;
   DECL_READ_P (var) = 1;
+  DECL_INITIAL (var) = targetm.chkp_make_bounds_constant (lb, ub);
+  make_decl_one_only (var, DECL_ASSEMBLER_NAME (var));
   /* We may use this symbol during ctors generation in chkp_finish_file
      when all symbols are emitted.  Force output to avoid undefined
      symbols in ctors.  */
-  if (!in_lto_p)
-    {
-      DECL_INITIAL (var) = targetm.chkp_make_bounds_constant (lb, ub);
-      DECL_COMDAT (var) = 1;
-      varpool_node::get_create (var)->set_comdat_group (DECL_ASSEMBLER_NAME (var));
-      varpool_node::get_create (var)->force_output = 1;
-    }
-  else
-    DECL_EXTERNAL (var) = 1;
+  node = varpool_node::get_create (var);
+  node->force_output = 1;
+
   varpool_node::finalize_decl (var);
 
   return var;
@@ -2029,14 +2008,6 @@ chkp_make_bounds (tree lb, tree size, gimple_stmt_iterator *iter, bool after)
 tree
 chkp_get_zero_bounds_var (void)
 {
-  if (!chkp_zero_bounds_var)
-    {
-      tree id = get_identifier (CHKP_ZERO_BOUNDS_VAR_NAME);
-      symtab_node *node = symtab_node::get_for_asmname (id);
-      if (node)
-       chkp_zero_bounds_var = node->decl;
-    }
-
   if (!chkp_zero_bounds_var)
     chkp_zero_bounds_var
       = chkp_make_static_const_bounds (0, -1,
@@ -2048,14 +2019,6 @@ chkp_get_zero_bounds_var (void)
 tree
 chkp_get_none_bounds_var (void)
 {
-  if (!chkp_none_bounds_var)
-    {
-      tree id = get_identifier (CHKP_NONE_BOUNDS_VAR_NAME);
-      symtab_node *node = symtab_node::get_for_asmname (id);
-      if (node)
-       chkp_none_bounds_var = node->decl;
-    }
-
   if (!chkp_none_bounds_var)
     chkp_none_bounds_var
       = chkp_make_static_const_bounds (-1, 0,