This is the mail archive of the
mailing list for the GCC project.
Re: [ubsan] Add libcall arguments
- From: Jakub Jelinek <jakub at redhat dot com>
- To: Jason Merrill <jason at redhat dot com>
- Cc: Marek Polacek <polacek at redhat dot com>, GCC Patches <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 19 Jul 2013 17:20:39 +0200
- Subject: Re: [ubsan] Add libcall arguments
- References: <20130705140431 dot GB21800 at redhat dot com> <51E84650 dot 5020708 at redhat dot com>
- Reply-to: Jakub Jelinek <jakub at redhat dot com>
On Thu, Jul 18, 2013 at 03:47:28PM -0400, Jason Merrill wrote:
> Please describe the hash table more up here. What are you tracking?
> >+ hashval_t h = iterative_hash_object (data->type, 0);
> >+ h = iterative_hash_object (data->decl, h);
> If you hash the decl as well as the type, the find_slot in
> ubsan_type_descriptor will almost never find an existing entry.
> >I have yet to handle
> >freeing the hash table, but I think I'll need the GTY machinery for
> >this (ubsan is not a pass, so I can't just call it at the end of the
> >pas). Or maybe just create a destructor and use append_to_statement_list.
> That won't work; append_to_statement_list is for things that happen
> at runtime, but freeing the hash table is something that needs to
> happen in the compiler.
Also, I wonder if we need to free the hash table ever, the only meaningful
place would be when we are done with compilation, if all uses of this (even
in the future) are from the FEs, perhaps freeing the hash table somewhere
after parsing of the whole CU finished would be fine, but if we need it even
from the middle-end, that might be too early.
> >+/* This routine returns a magic number for TYPE.
> >+ ??? This is probably too ugly. Tweak it. */
> >+static unsigned short
> >+get_tinfo_for_type (tree type)
> Why map from size to some magic number rather than use the size
> directly? Also, "tinfo" sounds to me like something to do with C++
Yeah, get_ubsan_type_info_for_type would be better, plus
The docs say that it should be log2 of the bit width, so I'd expect that
(exact_log2 (TYPE_PRECISION (type)) << 1) | !TYPE_UNSIGNED (type)
(perhaps with error if exact_log2 returns -1) and thus handle all possible
type bitsizes. Or if you prefer to use GET_MODE_BITSIZE, that.
Have you checked what clang does if you use typedefs? Does it use
the names appearing in the typedefs rather than their underlying types,
or is it TYPE_MAIN_VARIANT (type) actually?
ASM_FORMAT_PRIVATE_NAME (tmp_name, ".Lubsan_type", type_var_id_num++);
I don't think the . at the beginning is going to work everywhere
(on targets that don't support dots in labels),
I think you want ASM_GENERATE_INTERNAL_LABEL instead and just use
"Lubsan_type" as the second argument (note, this macro needs a buffer,
doesn't alloca it).