This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH, CHKP] Fix static const bounds creation in LTO
- From: Ilya Enkovich <enkovich dot gnu at gmail dot com>
- To: Jan Hubicka <hubicka at ucw dot cz>
- Cc: gcc-patches at gcc dot gnu dot org
- Date: Wed, 8 Apr 2015 22:39:02 +0300
- Subject: Re: [PATCH, CHKP] Fix static const bounds creation in LTO
- Authentication-results: sourceware.org; auth=none
- References: <20150402152154 dot GC6244 at msticlxl57 dot ims dot intel dot com> <20150402204513 dot GI21276 at atrey dot karlin dot mff dot cuni dot cz> <20150403161131 dot GB61994 at msticlxl57 dot ims dot intel dot com> <20150403170110 dot GL21276 at atrey dot karlin dot mff dot cuni dot cz> <20150407081021 dot GA11622 at msticlxl57 dot ims dot intel dot com> <20150407204325 dot GD91010 at kam dot mff dot cuni dot cz>
On 07 Apr 22:43, Jan Hubicka wrote:
> >
> > 2015-04-07 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.
> >
> > gcc/testsuite/
> >
> > 2015-04-07 Ilya Enkovich <ilya.enkovich@intel.com>
> >
> > * gcc.dg/lto/chkp-static-bounds_0.c: New.
>
> OK, thanks!
> > + if ((snode = symtab_node::get_for_asmname (DECL_ASSEMBLER_NAME (var))))
> > + {
> > + /* We don't allow this symbol usage for non bounds. */
> > + gcc_assert (snode->type == SYMTAB_VARIABLE);
> > + gcc_assert (POINTER_BOUNDS_P (snode->decl));
> This probably allows users to trigger ICE by declaring function of conflicting
> name. What about sorry ("...") message instead?
Here is installed version.
Thanks,
Ilya
--
gcc/
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.
gcc/testsuite/
2015-04-08 Ilya Enkovich <ilya.enkovich@intel.com>
* gcc.dg/lto/chkp-static-bounds_0.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
index 0000000..596e551
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/lto/chkp-static-bounds_0.c
@@ -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]);
+}
diff --git a/gcc/tree-chkp.c b/gcc/tree-chkp.c
index 03f75b3..4c8379f 100644
--- a/gcc/tree-chkp.c
+++ b/gcc/tree-chkp.c
@@ -1873,33 +1873,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
@@ -1907,37 +1880,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;
@@ -2001,14 +1980,6 @@ 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,
CHKP_ZERO_BOUNDS_VAR_NAME);
@@ -2020,14 +1991,6 @@ 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,
CHKP_NONE_BOUNDS_VAR_NAME);