re PR sanitizer/66343 ("Error: .Lubsan_type3 already defined" with UBSan and precompiled headers)

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
This commit is contained in:
Jakub Jelinek 2016-10-05 21:03:28 +02:00 committed by Jakub Jelinek
parent 8b7033e0e1
commit 875825211b
7 changed files with 63 additions and 5 deletions

View 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

View 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.

View File

@ -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 } } } } */

View File

@ -0,0 +1,8 @@
/* PR sanitizer/66343 */
/* { dg-options "-fsanitize=undefined" } */
void
foo (int a, int b)
{
a / b;
}

View File

@ -0,0 +1,10 @@
/* PR sanitizer/66343 */
/* { dg-options "-fsanitize=undefined" } */
#include "pr66343-2.h"
void
bar (int a, int b)
{
a / b;
}

View File

@ -0,0 +1,8 @@
/* PR sanitizer/66343 */
/* { dg-options "-fsanitize=undefined" } */
void
foo (int a, int b)
{
a / b;
}

View 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;