re PR sanitizer/66343 ("Error: .Lubsan_type3 already defined" with UBSan and precompi...
authorJakub Jelinek <jakub@redhat.com>
Wed, 5 Oct 2016 19:03:28 +0000 (21:03 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Wed, 5 Oct 2016 19:03:28 +0000 (21:03 +0200)
PR sanitizer/66343
* ubsan.c (ubsan_ids): New GTY(()) array.
(ubsan_type_descriptor, ubsan_create_data): Use ubsan_ids
instead of static local counters.

* gcc.dg/pch/pr66343-1.c: New test.
* gcc.dg/pch/pr66343-1.hs: New file.
* gcc.dg/pch/pr66343-2.c: New test.
* gcc.dg/pch/pr66343-2.hs: New file.

From-SVN: r240803

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pch/pr66343-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pch/pr66343-1.hs [new file with mode: 0644]
gcc/testsuite/gcc.dg/pch/pr66343-2.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pch/pr66343-2.hs [new file with mode: 0644]
gcc/ubsan.c

index 2b568782c338618c957dae0e0f0710908872cc91..8f7eb38f21e346beb653385e134bce56445245b9 100644 (file)
@@ -1,3 +1,10 @@
+2016-10-05  Jakub Jelinek  <jakub@redhat.com>
+
+       PR sanitizer/66343
+       * ubsan.c (ubsan_ids): New GTY(()) array.
+       (ubsan_type_descriptor, ubsan_create_data): Use ubsan_ids
+       instead of static local counters.
+
 2016-10-05  Martin Sebor  <msebor@redhat.com>
 
        PR bootstrap/77819
index fa8cce764c6a35aab3fea97f278c315607aadab5..fabe4c8db820ab0323b030f88cf015585daa0b5a 100644 (file)
@@ -1,3 +1,11 @@
+2016-10-05  Jakub Jelinek  <jakub@redhat.com>
+
+       PR sanitizer/66343
+       * gcc.dg/pch/pr66343-1.c: New test.
+       * gcc.dg/pch/pr66343-1.hs: New file.
+       * gcc.dg/pch/pr66343-2.c: New test.
+       * gcc.dg/pch/pr66343-2.hs: New file.
+
 2016-10-05  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        * c-c++-common/Wint-in-bool-context.c: Update test.
diff --git a/gcc/testsuite/gcc.dg/pch/pr66343-1.c b/gcc/testsuite/gcc.dg/pch/pr66343-1.c
new file mode 100644 (file)
index 0000000..851f6d9
--- /dev/null
@@ -0,0 +1,15 @@
+/* PR sanitizer/66343 */
+/* { dg-do assemble } */
+/* { dg-options "-fsanitize=undefined" } */
+
+#include "pr66343-1.h"
+
+void
+bar (int a, int b)
+{
+  a / b;
+}
+
+/* Hack to turn off PCH assembly comparison, as it is incompatible
+   with dg-do assemble.  The target condition will be always false.  */
+/* { dg-error "" "" { target { lp64 && { ! lp64 } } } } */
diff --git a/gcc/testsuite/gcc.dg/pch/pr66343-1.hs b/gcc/testsuite/gcc.dg/pch/pr66343-1.hs
new file mode 100644 (file)
index 0000000..643a821
--- /dev/null
@@ -0,0 +1,8 @@
+/* PR sanitizer/66343 */
+/* { dg-options "-fsanitize=undefined" } */
+
+void
+foo (int a, int b)
+{
+  a / b;
+}
diff --git a/gcc/testsuite/gcc.dg/pch/pr66343-2.c b/gcc/testsuite/gcc.dg/pch/pr66343-2.c
new file mode 100644 (file)
index 0000000..a86e61d
--- /dev/null
@@ -0,0 +1,10 @@
+/* PR sanitizer/66343 */
+/* { dg-options "-fsanitize=undefined" } */
+
+#include "pr66343-2.h"
+
+void
+bar (int a, int b)
+{
+  a / b;
+}
diff --git a/gcc/testsuite/gcc.dg/pch/pr66343-2.hs b/gcc/testsuite/gcc.dg/pch/pr66343-2.hs
new file mode 100644 (file)
index 0000000..643a821
--- /dev/null
@@ -0,0 +1,8 @@
+/* PR sanitizer/66343 */
+/* { dg-options "-fsanitize=undefined" } */
+
+void
+foo (int a, int b)
+{
+  a / b;
+}
index d3bd8e3393d1b9ba01c5fdccbac059d277d0883f..059c6aa4a93cffab1c3446f16afa26ebe10464a1 100644 (file)
@@ -314,6 +314,10 @@ get_ubsan_type_info_for_type (tree type)
     return 0;
 }
 
+/* Counters for internal labels.  ubsan_ids[0] for Lubsan_type,
+   ubsan_ids[1] for Lubsan_data labels.  */
+static GTY(()) unsigned int ubsan_ids[2];
+
 /* Helper routine that returns ADDR_EXPR of a VAR_DECL of a type
    descriptor.  It first looks into the hash table; if not found,
    create the VAR_DECL, put it into the hash table and return the
@@ -461,10 +465,9 @@ ubsan_type_descriptor (tree type, enum ubsan_print_style pstyle)
   TREE_STATIC (str) = 1;
 
   char tmp_name[32];
-  static unsigned int type_var_id_num;
-  ASM_GENERATE_INTERNAL_LABEL (tmp_name, "Lubsan_type", type_var_id_num++);
+  ASM_GENERATE_INTERNAL_LABEL (tmp_name, "Lubsan_type", ubsan_ids[0]++);
   decl = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier (tmp_name),
-                         dtype);
+                    dtype);
   TREE_STATIC (decl) = 1;
   TREE_PUBLIC (decl) = 0;
   DECL_ARTIFICIAL (decl) = 1;
@@ -564,8 +567,7 @@ ubsan_create_data (const char *name, int loccnt, const location_t *ploc, ...)
 
   /* Now, fill in the type.  */
   char tmp_name[32];
-  static unsigned int ubsan_var_id_num;
-  ASM_GENERATE_INTERNAL_LABEL (tmp_name, "Lubsan_data", ubsan_var_id_num++);
+  ASM_GENERATE_INTERNAL_LABEL (tmp_name, "Lubsan_data", ubsan_ids[1]++);
   tree var = build_decl (UNKNOWN_LOCATION, VAR_DECL, get_identifier (tmp_name),
                         ret);
   TREE_STATIC (var) = 1;