On 04/30/14 21:07, David Malcolm wrote:
Currently, gengtype does not support template arguments that are
explicitly pointers, such as:
static GTY(()) vec<gimple_statement_base *> test_gimple; giving this
error:
../../src/gcc/gimple-expr.c:902: parse error: expected a string constant or
',', have '*' instead
requiring them to be typedefs.
This patch removes this restriction, supporting up to a single pointer
in each template argument.
It also adds support for inheritance, allowing:
static GTY(()) vec<gimple_statement_phi *, va_gc> *test_phis;
where the generated gt-FOO.c file contains:
void
gt_ggc_mx (struct gimple_statement_phi *& x)
{
if (x)
gt_ggc_mx_gimple_statement_base ((void *) x);
}
i.e. handling the subclass by calling the marking function for the base
class.
Doing so uncovered an issue within write_user_func_for_structure_ptr,
which would unconditionally write out a func. This would lead to
gt-FOO.c containing duplicate functions e.g.:
gtype-desc.c:280: multiple definition of `gt_ggc_mx(gimple_statement_base*&)'
if more than one GTY template type referenced such a type; for example like
this:
static GTY(()) vec<gimple, va_gc> *test_old_style_gimple;
static GTY(()) vec<gimple_statement_base *, va_gc> *test_new_style_gimple;
where "gimple" is just an alias for "gimple_statement_base *". This
could be worked around by ensuring that the source tree consistently
uses vec<> of just one kind, but for robustness the patch also makes
write_user_func_for_structure_ptr idempotent, so it only writes out the
func once for each (struct, which-of-ggc/pch) combination.
Motivation:
In the "Compile-time gimple-checking" discussion, Richi asked me to look
at eliminating the const_gimple typedef in favor of having "gimple" be
the struct, thus making the pointer to a gimple be explicit in the type:
http://gcc.gnu.org/ml/gcc-patches/2014-04/msg01520.html
as in:
http://gcc.gnu.org/ml/gcc-patches/2014-04/msg01632.html
[...] And I never liked the
const_ typedef variants that were introduced. The main reason for
them was probably to avoid all the churn of replacing the tree pointer
typedef with a tree (non-pointer) typedef. The mistake was to
repeat that for 'gimple' ...
I'm attempting a patch for that, but in the meantime, this patch adds
the needed support to gengtype.
Successfully bootstrapped®tested on x86_64-unknown-linux-gnu (Fedora
20).
OK for trunk?
Basically OK. Per the wide-int folks request, please hold off until the
wide-int merge is done.
If after wide-int, the only changes are trivial, then consider the patch
pre-approved (post the final version here so that its archived).
If after wide-int merges the changes to this patch are non-trivial, then
repost the RFA.
Obviously, you get to exercise some judgement as to what constitutes
trivial vs non-trivial.
Jeff