From 36f371de3956f3eaff659757e715b07192c2dbe8 Mon Sep 17 00:00:00 2001 From: Ilya Enkovich Date: Wed, 8 Apr 2015 19:34:41 +0000 Subject: [PATCH] tree-chkp.c (chkp_find_const_bounds_var): Remove. 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 | 9 ++ gcc/testsuite/ChangeLog | 4 + .../gcc.dg/lto/chkp-static-bounds_0.c | 26 ++++++ gcc/tree-chkp.c | 83 +++++-------------- 4 files changed, 62 insertions(+), 60 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/lto/chkp-static-bounds_0.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 56c7ae985d6..14e57c3c93c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2015-04-08 Ilya Enkovich + + * 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 * doc/extend.texi (Attribute Syntax): Add a trailing semicolon diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f3b61e56040..ba6f84142d8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2015-04-08 Ilya Enkovich + + * gcc.dg/lto/chkp-static-bounds_0.c: New. + 2015-04-08 Ilya Enkovich * 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 index 00000000000..596e5510664 --- /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 541af29a48a..8c5a628a9ad 100644 --- a/gcc/tree-chkp.c +++ b/gcc/tree-chkp.c @@ -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 ((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))); - if (var) - return var; + return snode->decl; + } - var = build_decl (UNKNOWN_LOCATION, VAR_DECL, - get_identifier (name), pointer_bounds_type_node); - - 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,