On Sun, Oct 18, 2020 at 10:31:55PM +0100, Ramsay Jones wrote: > On 17/10/2020 23:56, Luc Van Oostenryck wrote: > > Most __sync_* or __atomic_* builtin functions have one or > > more arguments having its real type determined by the first > > argument: either the same type (a pointer to an integral type) > > or the type of the object it points to. > > > > Currently, only __sync_{bool,val}_compare_and_swap() are handled > > but lots of very similar variants would be needed for the others. > > So, make it a generic function, able to handle all these builtins. > > > > Signed-off-by: Luc Van Oostenryck <luc.vanoostenryck@xxxxxxxxx> > > --- > > builtin.c | 47 +++++++++++++++++++++++++++++++---------------- > > 1 file changed, 31 insertions(+), 16 deletions(-) > > > > diff --git a/builtin.c b/builtin.c > > index 0d4cb12cca22..880dd54f647e 100644 > > --- a/builtin.c > > +++ b/builtin.c > > @@ -31,6 +31,14 @@ > > #include "compat/bswap.h" > > #include <stdarg.h> > > > > +#define dyntype incomplete_ctype > > +static bool is_dynamic_type(struct symbol *t) > > +{ > > + if (t->type == SYM_NODE) > > + t = t->ctype.base_type; > > + return t == &dyntype; > > +} > > + > > static int evaluate_to_int_const_expr(struct expression *expr) > > { > > expr->ctype = &int_ctype; > > @@ -362,29 +370,32 @@ static struct symbol_op overflow_p_op = { > > }; > > > > > > -static int eval_sync_compare_and_swap(struct expression *expr) > > +static int eval_atomic_common(struct expression *expr) > > { > > + struct symbol *fntype = expr->fn->ctype->ctype.base_type; > > struct symbol_list *types = NULL; > > struct symbol *ctype = NULL; > > + struct symbol *t; > > struct expression *arg; > > int n = 0; > > > > - /* the first arg is a pointer type; we'd already verified that */ > > + // The number of arguments have already be verified. > > + // The first arg must be a pointer type to an integral type. > > s/pointer type to/pointer to/ > (it just sounds odd, otherwise) > or maybe ... must be a 'pointer to an integral' type. ? Well, yes, it's a bit hard to express clearly. The real infos are: * it must be a 'struct symbol *', the are used for any type, pointer or not * the type represented by this 'struct symbol *' must indeed be a pointer : (first_args->type == SYM_PTR) to an integral type: (first_args->ctype.base_type = &int_ctype). So yes, "must be a 'pointer to an integral' type. " seems to do the job. Thanks -- Luc