On Wed, Aug 28, 2013 at 2:15 PM, Marek Polacek <pola...@redhat.com> wrote: > On Wed, Aug 28, 2013 at 12:40:50PM +0200, Richard Biener wrote: >> On Tue, Aug 27, 2013 at 2:33 PM, Marek Polacek <pola...@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.
Probably misses freeing of the pointer-map using 'delete' somewhere. Richard. > 2013-08-28 Marek Polacek <pola...@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