[ubsan] Use pointer map instead of hash table.
Richard Biener
richard.guenther@gmail.com
Wed Aug 28 12:53:00 GMT 2013
On Wed, Aug 28, 2013 at 2:15 PM, Marek Polacek <polacek@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 <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.
Probably misses freeing of the pointer-map using 'delete' somewhere.
Richard.
> 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
More information about the Gcc-patches
mailing list