This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [PATCH] Fix up emitting VAR_DECLs in ubsan
- From: Marek Polacek <polacek at redhat dot com>
- To: Jakub Jelinek <jakub at redhat dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Wed, 27 Nov 2013 00:42:52 +0100
- Subject: Re: [PATCH] Fix up emitting VAR_DECLs in ubsan
- Authentication-results: sourceware.org; auth=none
- References: <20131126232608 dot GA31608 at redhat dot com> <20131126233118 dot GS892 at tucnak dot redhat dot com>
On Wed, Nov 27, 2013 at 12:31:18AM +0100, Jakub Jelinek wrote:
> Please use here:
> int z = 2;
> if (z & 1)
> or similar instead, to make sure it is only early
> GIMPLE optimization passes that optimize it away, if already the
> front end knows it isn't needed, perhaps in the future it could
> just avoid instrumenting it.
Ok. I've put in const int z = 2;, without const the original problem
disappeared. Thanks for quick review.
2013-11-27 Marek Polacek <polacek@redhat.com>
* ubsan.c (ubsan_type_descriptor): If varpool_get_node returns NULL
for a decl, recreate that decl. Save into the hash table VAR_DECLs
rather than ADDR_EXPRs.
testsuite/
* c-c++-common/ubsan/undefined-1.c: New test.
--- gcc/ubsan.c.mp3 2013-11-26 18:07:46.225509763 +0100
+++ gcc/ubsan.c 2013-11-27 00:34:37.617849999 +0100
@@ -269,8 +269,12 @@ ubsan_type_descriptor (tree type, bool w
type = TYPE_MAIN_VARIANT (type);
tree decl = decl_for_type_lookup (type);
- if (decl != NULL_TREE)
- return decl;
+ /* It is possible that some of the earlier created DECLs were found
+ unused, in that case they weren't emitted and varpool_get_node
+ returns NULL node on them. But now we really need them. Thus,
+ renew them here. */
+ if (decl != NULL_TREE && varpool_get_node (decl))
+ return build_fold_addr_expr (decl);
tree dtype = ubsan_type_descriptor_type ();
tree type2 = type;
@@ -369,11 +373,10 @@ ubsan_type_descriptor (tree type, bool w
DECL_INITIAL (decl) = ctor;
rest_of_decl_compilation (decl, 1, 0);
- /* Save the address of the VAR_DECL into the hash table. */
- decl = build_fold_addr_expr (decl);
+ /* Save the VAR_DECL into the hash table. */
decl_for_type_insert (type, decl);
- return decl;
+ return build_fold_addr_expr (decl);
}
/* Create a structure for the ubsan library. NAME is a name of the new
--- gcc/testsuite/c-c++-common/ubsan/undefined-1.c.mp3 2013-11-26 23:56:42.151624262 +0100
+++ gcc/testsuite/c-c++-common/ubsan/undefined-1.c 2013-11-27 00:34:21.436784807 +0100
@@ -0,0 +1,26 @@
+/* { dg-do run } */
+/* { dg-options "-fsanitize=undefined" } */
+/* { dg-skip-if "" { *-*-* } { "-flto" } { "" } } */
+
+int
+foo (int x, int y)
+{
+ const int z = 2;
+ if (z & 1)
+ return x << y;
+ return 0;
+}
+
+int
+bar (int x, int y)
+{
+ return x + y;
+}
+
+int
+main (void)
+{
+ foo (3, 2);
+ bar (12, 42);
+ return 0;
+}
Marek