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