re PR bootstrap/63995 (Bootstrap error with -mmpx -fcheck-pointer-bounds)
authorIlya Enkovich <ilya.enkovich@intel.com>
Tue, 9 Dec 2014 07:53:17 +0000 (07:53 +0000)
committerIlya Enkovich <ienkovich@gcc.gnu.org>
Tue, 9 Dec 2014 07:53:17 +0000 (07:53 +0000)
gcc/

PR bootstrap/63995
* tree-chkp.c (chkp_make_static_bounds): Share bounds var
between nodes sharing assembler name.

gcc/testsuite/

PR bootstrap/63995
* g++.dg/dg.exp: Add mpx-dg.exp.
* g++.dg/pr63995-1.C: New.

From-SVN: r218506

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/g++.dg/dg.exp
gcc/testsuite/g++.dg/pr63995-1.C [new file with mode: 0644]
gcc/tree-chkp.c

index 5217b8d57a68aa8b1bd5bf4022108a83dbc9dd4e..dbd6272a0ed1a2466c81af84dbe7b6009378bd60 100644 (file)
@@ -1,3 +1,9 @@
+2014-12-09  Ilya Enkovich  <ilya.enkovich@intel.com>
+
+       PR bootstrap/63995
+       * tree-chkp.c (chkp_make_static_bounds): Share bounds var
+       between nodes sharing assembler name.
+
 2014-12-08  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        PR target/64204
index b5ddcca56797e9d9b641be7169b6589cb1fe46e9..1b1e7d5e95901a5db1d40f1a538aca1e2c46628f 100644 (file)
@@ -1,3 +1,9 @@
+2014-12-09  Ilya Enkovich  <ilya.enkovich@intel.com>
+
+       PR bootstrap/63995
+       * g++.dg/dg.exp: Add mpx-dg.exp.
+       * g++.dg/pr63995-1.C: New.
+
 2014-12-08  Sandra Loosemore  <sandra@codesourcery.com>
 
        * gcc.target/aarch64/bics_4.c: New.
index 14beae1c257f80de2792ec313fa953b6898cdd16..44eab0c0c383c805d85b2bfdeb640971920f5276 100644 (file)
@@ -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 (file)
index 0000000..82e7606
--- /dev/null
@@ -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];
+}
index c24aa35dbc7f623ca3ed4aa5e96daa7cf3d3d93a..e7b9bbf602ec457e7dd0a7f73fa108476d1899cd 100644 (file)
@@ -2760,9 +2760,23 @@ 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;
+      /* For vars we use assembler name as a key in
+        chkp_static_var_bounds map.  It allows to
+        avoid duplicating bound vars for decls
+        sharing assembler name.  */
+      if (TREE_CODE (obj) == VAR_DECL)
+       {
+         tree name = DECL_ASSEMBLER_NAME (obj);
+         slot = chkp_static_var_bounds->get (name);
+         if (slot)
+           return *slot;
+       }
+      else
+       {
+         slot = chkp_static_var_bounds->get (obj);
+         if (slot)
+           return *slot;
+       }
     }
 
   /* Build decl for bounds var.  */
@@ -2826,7 +2840,13 @@ chkp_make_static_bounds (tree obj)
   if (!chkp_static_var_bounds)
     chkp_static_var_bounds = new hash_map<tree, tree>;
 
-  chkp_static_var_bounds->put (obj, bnd_var);
+  if (TREE_CODE (obj) == VAR_DECL)
+    {
+      tree name = DECL_ASSEMBLER_NAME (obj);
+      chkp_static_var_bounds->put (name, bnd_var);
+    }
+  else
+    chkp_static_var_bounds->put (obj, bnd_var);
 
   return bnd_var;
 }