[PATCH] abstract away from the 'build-toolchain'-dependent sizeof(...) operator
Simon Marlow
marlowsd at gmail.com
Fri Jan 6 11:22:43 CET 2012
On 05/01/2012 18:41, Gabor Greif wrote:
> The sizes obtained this way do not work on a target system in general.
> So in a future cross-compilable setup we need another way of obtaining
> expansions for the macros OFFSET, FIELD_SIZE and TYPE_SIZE.
>
> Guarded against accidental use of 'sizeof' by poisoning.
>
> Verified that the generated *Constants.h/hs files are unchanged.
Ok, I'll push this one.
Cheers,
Simon
> ---
> includes/mkDerivedConstants.c | 24 ++++++++++++++----------
> 1 files changed, 14 insertions(+), 10 deletions(-)
>
> diff --git a/includes/mkDerivedConstants.c b/includes/mkDerivedConstants.c
> index 6688330..8d2e789 100644
> --- a/includes/mkDerivedConstants.c
> +++ b/includes/mkDerivedConstants.c
> @@ -1,6 +1,6 @@
> /* --------------------------------------------------------------------------
> *
> - * (c) The GHC Team, 1992-2004
> + * (c) The GHC Team, 1992-2012
> *
> * mkDerivedConstants.c
> *
> @@ -17,11 +17,11 @@
> * We need offsets of profiled things... better be careful that this
> * doesn't affect the offsets of anything else.
> */
> +
> #define PROFILING
> #define THREADED_RTS
>
> #include "Rts.h"
> -
> #include "Stable.h"
> #include "Capability.h"
>
> @@ -30,6 +30,10 @@
> #define str(a,b) #a "_" #b
>
> #define OFFSET(s_type, field) ((size_t)&(((s_type*)0)->field))
> +#define FIELD_SIZE(s_type, field) ((unsigned long)sizeof(((s_type*)0)->field))
> +#define TYPE_SIZE(type) (sizeof(type))
> +
> +#pragma GCC poison sizeof
>
> #if defined(GEN_HASKELL)
> #define def_offset(str, offset) \
> @@ -44,7 +48,7 @@
> #define ctype(type) /* nothing */
> #else
> #define ctype(type) \
> - printf("#define SIZEOF_" #type " %lu\n", (unsigned long)sizeof(type));
> + printf("#define SIZEOF_" #type " %lu\n", (unsigned long)TYPE_SIZE(type));
> #endif
>
> #if defined(GEN_HASKELL)
> @@ -59,7 +63,7 @@
> */
> #define field_type_(str, s_type, field) \
> printf("#define REP_" str " b"); \
> - printf("%lu\n", (unsigned long)sizeof (__typeof__(((((s_type*)0)->field)))) * 8);
> + printf("%lu\n", FIELD_SIZE(s_type, field) * 8);
> #define field_type_gcptr_(str, s_type, field) \
> printf("#define REP_" str " gcptr\n");
> #endif
> @@ -105,18 +109,18 @@
> #endif
>
> #define struct_size(s_type) \
> - def_size(#s_type, sizeof(s_type));
> + def_size(#s_type, TYPE_SIZE(s_type));
>
> /*
> * Size of a closure type, minus the header, named SIZEOF_<type>_NoHdr
> * Also, we #define SIZEOF_<type> to be the size of the whole closure for .cmm.
> */
> #define closure_size(s_type) \
> - def_size(#s_type "_NoHdr", sizeof(s_type) - sizeof(StgHeader)); \
> - def_closure_size(#s_type, sizeof(s_type) - sizeof(StgHeader));
> + def_size(#s_type "_NoHdr", TYPE_SIZE(s_type) - TYPE_SIZE(StgHeader)); \
> + def_closure_size(#s_type, TYPE_SIZE(s_type) - TYPE_SIZE(StgHeader));
>
> #define thunk_size(s_type) \
> - def_size(#s_type "_NoThunkHdr", sizeof(s_type) - sizeof(StgThunkHeader)); \
> + def_size(#s_type "_NoThunkHdr", TYPE_SIZE(s_type) - TYPE_SIZE(StgThunkHeader)); \
> closure_size(s_type)
>
> /* An access macro for use in C-- sources. */
> @@ -124,7 +128,7 @@
> printf("#define " str "(__ptr__) REP_" str "[__ptr__+SIZEOF_StgHeader+OFFSET_" str "]\n");
>
> #define closure_field_offset_(str, s_type,field) \
> - def_offset(str, OFFSET(s_type,field) - sizeof(StgHeader));
> + def_offset(str, OFFSET(s_type,field) - TYPE_SIZE(StgHeader));
>
> #define closure_field_offset(s_type,field) \
> closure_field_offset_(str(s_type,field),s_type,field)
> @@ -156,7 +160,7 @@
>
> /* Byte offset for a TSO field, minus the header and variable prof bit. */
> #define tso_payload_offset(s_type, field) \
> - def_offset(str(s_type,field), OFFSET(s_type,field) - sizeof(StgHeader) - sizeof(StgTSOProfInfo));
> + def_offset(str(s_type,field), OFFSET(s_type,field) - TYPE_SIZE(StgHeader) - TYPE_SIZE(StgTSOProfInfo));
>
> /* Full byte offset for a TSO field, for use from Cmm */
> #define tso_field_offset_macro(str) \
More information about the Cvs-ghc
mailing list