RFC: Defining and using target vectors

Joern Rennecke amylaar@spamcop.net
Thu Nov 18 20:53:00 GMT 2010


Quoting "Joseph S. Myers" <joseph@codesourcery.com>:

> You can perfectly well do type safety without using void *.
>
> struct cumulative_args;
> type hook(struct cumulative_args *arg);
>
>
> static inline struct x86_cumulative_args *
> x86_get_cumulative_args (struct cumulative_args *arg)
> {struct cumulative_args *
>   return (struct x86_cumulative_args *) arg;
> }

But then you run into implementation-defined behaviour for the casts from/to
struct cumulative_args * .  E.g. an implementation could decide to chop
off some bits at the bottom because struct cumulative_args is supposed to
have extra alignment because of the members it contains - or because of an
md5hash hash collision with the name of the developer's favourite pet.
(Properly documented, of course.)

how about:

typedef struct
{
   void *p;
} cumulative_args_t;

or maybe for more efficiency:

#ifdef __GNUC__
#define ATTRIBUTE_TRANSPARENT_UNION __attribute__((transparent_union))
#else
#define ATTRIBUTE_TRANSPARENT_UNION
#endif

typedef union ATTRIBUTE_TRANSPARENT_UNION { void *p; } cumulative_args_t;

static inline struct x86_cumulative_args *
x86_get_cumulative_args (cumulative_args_t arg)
{
   return (struct x86_cumulative_args *) arg.p;
}



More information about the Gcc mailing list