This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH, PR63995, CHKP] Use single static bounds var for varpool nodes sharing asm name
- From: Ilya Enkovich <enkovich dot gnu at gmail dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 25 Nov 2014 11:45:43 +0300
- Subject: [PATCH, PR63995, CHKP] Use single static bounds var for varpool nodes sharing asm name
- Authentication-results: sourceware.org; auth=none
Hi,
This patch partly fixes PR bootstrap/63995 by avoiding duplicating static bounds vars. With this fix bootstrap still fails at stage 2 and 3 comparison.
Bootstrapped and checked on x86_64-unknown-linux-gnu. OK for trunk?
Thanks,
Ilya
--
gcc/
2014-11-25 Ilya Enkovich <ilya.enkovich@intel.com>
PR bootstrap/63995
* tree-chkp (chkp_make_static_bounds): Share bounds var
between nodes sharing assembler name.
gcc/testsuite
2014-11-25 Ilya Enkovich <ilya.enkovich@intel.com>
PR bootstrap/63995
* g++.dg/dg.exp: Add mpx-dg.exp.
* g++.dg/pr63995-1.C: New.
diff --git a/gcc/testsuite/g++.dg/dg.exp b/gcc/testsuite/g++.dg/dg.exp
index 14beae1..44eab0c 100644
--- a/gcc/testsuite/g++.dg/dg.exp
+++ b/gcc/testsuite/g++.dg/dg.exp
@@ -18,6 +18,7 @@
# Load support procs.
load_lib g++-dg.exp
+load_lib mpx-dg.exp
# If a testcase doesn't have special options, use these.
global DEFAULT_CXXFLAGS
diff --git a/gcc/testsuite/g++.dg/pr63995-1.C b/gcc/testsuite/g++.dg/pr63995-1.C
new file mode 100644
index 0000000..82e7606
--- /dev/null
+++ b/gcc/testsuite/g++.dg/pr63995-1.C
@@ -0,0 +1,16 @@
+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target mpx } */
+/* { dg-options "-O2 -g -fcheck-pointer-bounds -mmpx" } */
+
+int test1 (int i)
+{
+ extern const int arr[10];
+ return arr[i];
+}
+
+extern const int arr[10];
+
+int test2 (int i)
+{
+ return arr[i];
+}
diff --git a/gcc/tree-chkp.c b/gcc/tree-chkp.c
index 3e38691..d425084 100644
--- a/gcc/tree-chkp.c
+++ b/gcc/tree-chkp.c
@@ -2727,9 +2727,29 @@ chkp_make_static_bounds (tree obj)
/* First check if we already have required var. */
if (chkp_static_var_bounds)
{
- slot = chkp_static_var_bounds->get (obj);
- if (slot)
- return *slot;
+ /* If there is a symbol sharing assembler name with obj,
+ we may use its bounds. */
+ if (TREE_CODE (obj) == VAR_DECL)
+ {
+ varpool_node *node = varpool_node::get_create (obj);
+
+ while (node->previous_sharing_asm_name)
+ node = (varpool_node *)node->previous_sharing_asm_name;
+
+ while (node)
+ {
+ slot = chkp_static_var_bounds->get (node->decl);
+ if (slot)
+ return *slot;
+ node = (varpool_node *)node->next_sharing_asm_name;
+ }
+ }
+ else
+ {
+ slot = chkp_static_var_bounds->get (obj);
+ if (slot)
+ return *slot;
+ }
}
/* Build decl for bounds var. */