This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [ubsan] Use pointer map instead of hash table.
- From: Marek Polacek <polacek at redhat dot com>
- To: Richard Biener <richard dot guenther at gmail dot com>
- Cc: GCC Patches <gcc-patches at gcc dot gnu dot org>, Jakub Jelinek <jakub at redhat dot com>
- Date: Wed, 28 Aug 2013 14:15:43 +0200
- Subject: Re: [ubsan] Use pointer map instead of hash table.
- Authentication-results: sourceware.org; auth=none
- References: <20130827123338 dot GA574 at redhat dot com> <CAFiYyc1VL-yEAjuhbrPMthnak6u48yN+Rm1LnLRVV18RpXx0PA at mail dot gmail dot com>
On Wed, Aug 28, 2013 at 12:40:50PM +0200, Richard Biener wrote:
> On Tue, Aug 27, 2013 at 2:33 PM, Marek Polacek <polacek@redhat.com> wrote:
> > It turned out that for tree -> tree mapping we don't need the hash
> > table at all; pointer map is much more convenient. So this patch
> > weeds out the hash table out of ubsan and introduces pointer map
> > instead. Quite a lot of code could go away--no need to set the
> > alloc pools up etc.
> >
> > Regtested, ran bootstrap-ubsan on x86_64-linux. Applying to the
> > ubsan branch.
>
> You can use the type-safe pointer_map <tree> now (ok, only the data type
> is type safe, the pointer is still void).
Thanks, done with the following. Please let me know if you see
something wrong in this; otherwise I'll commit it if the
bootstrap-ubsan passes.
2013-08-28 Marek Polacek <polacek@redhat.com>
* ubsan.c: Use pointer_map<tree> instead of pointer_map_t.
(insert_decl_for_type): Adjust.
(lookup_decl_for_type): Likewise.
--- gcc/ubsan.c.mp 2013-08-28 12:54:17.778383224 +0200
+++ gcc/ubsan.c 2013-08-28 14:09:42.400105470 +0200
@@ -31,16 +31,14 @@ along with GCC; see the file COPYING3.
#include "c-family/c-common.h"
/* Map a TYPE to an ubsan type descriptor VAR_DECL for that type. */
-static pointer_map_t *typedesc_map;
+static pointer_map<tree> *typedesc_map;
/* Insert DECL as the VAR_DECL for TYPE in the TYPEDESC_MAP. */
static void
insert_decl_for_type (tree decl, tree type)
{
- void **slot = pointer_map_insert (typedesc_map, type);
- gcc_assert (*slot == NULL);
- *slot = decl;
+ *typedesc_map->insert (type) = decl;
}
/* Find the VAR_DECL for TYPE in TYPEDESC_MAP. If TYPE does not
@@ -52,9 +50,13 @@ lookup_decl_for_type (tree type)
{
/* If the pointer map is not initialized yet, create it now. */
if (typedesc_map == NULL)
- typedesc_map = pointer_map_create ();
- void **slot = pointer_map_contains (typedesc_map, type);
- return slot ? (tree) *slot : NULL_TREE;
+ {
+ typedesc_map = new pointer_map<tree>;
+ /* That also means we don't have to bother with the lookup. */
+ return NULL_TREE;
+ }
+ tree *t = typedesc_map->contains (type);
+ return t ? *t : NULL_TREE;
}
/* Helper routine, which encodes a value in the pointer_sized_int_node.
Marek