summaryrefslogtreecommitdiff
path: root/gcc/tree-chkp.c
diff options
context:
space:
mode:
authorIlya Enkovich <ilya.enkovich@intel.com>2015-04-08 19:34:41 +0000
committerIlya Enkovich <ienkovich@gcc.gnu.org>2015-04-08 19:34:41 +0000
commit36f371de3956f3eaff659757e715b07192c2dbe8 (patch)
treeff26ac1b3e4e11115401f9e54c69e4b7bc0d4f1f /gcc/tree-chkp.c
parent469f062eb94fa0edbabb53dc75d04d2e6ae75971 (diff)
downloadgcc-36f371de3956f3eaff659757e715b07192c2dbe8.tar.gz
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
Diffstat (limited to 'gcc/tree-chkp.c')
-rw-r--r--gcc/tree-chkp.c85
1 files changed, 24 insertions, 61 deletions
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 (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;
@@ -2030,14 +2009,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);
@@ -2049,14 +2020,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);