X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FMachDeps.h;h=39ce7579173b4f7da4d14f2bdc4e29cbda777a00;hb=0d52a0a134871d317b5f8b53a952c882ce5ae5b6;hp=48c54e8ac1cf8e085824e61ff31941308f93ff70;hpb=4266041d7f0119f77693812da10ed933fb1d8807;p=ghc-hetmet.git diff --git a/ghc/includes/MachDeps.h b/ghc/includes/MachDeps.h index 48c54e8..39ce757 100644 --- a/ghc/includes/MachDeps.h +++ b/ghc/includes/MachDeps.h @@ -1,52 +1,86 @@ /* ----------------------------------------------------------------------------- - * $Id: MachDeps.h,v 1.4 2000/01/25 14:39:14 panne Exp $ * - * (c) The GRASP/AQUA Project, Glasgow University, 1998 - * (c) The GHC Team, 1998-1999 + * (c) The University of Glasgow 2002 * * Definitions that characterise machine specific properties of basic - * Stg types provided as unboxed types (mirrors the typedefs in - * StgTypes.) + * types (C & Haskell). * + * NB: Keep in sync with HsFFI.h and StgTypes.h. * NB: THIS FILE IS INCLUDED IN HASKELL SOURCE! * ---------------------------------------------------------------------------*/ #ifndef MACHDEPS_H #define MACHDEPS_H -#include "config.h" +/* Sizes of C types come from here... */ +#include "ghcconfig.h" -#define CHAR_SIZE_IN_BYTES 1 -#define ADDR_SIZE_IN_BYTES SIZEOF_VOID_P -#define INT_SIZE_IN_BYTES SIZEOF_LONG -#define WORD_SIZE_IN_BYTES SIZEOF_LONG +/* Sizes of Haskell types follow. These sizes correspond to: + * - the number of bytes in the primitive type (eg. Int#) + * - the number of bytes in the external representation (eg. HsInt) + * - the scale offset used by writeFooOffAddr# + * + * In the heap, the type may take up more space: eg. SIZEOF_INT8 == 1, + * but it takes up SIZEOF_HSWORD (4 or 8) bytes in the heap. + */ -#if SIZEOF_DOUBLE == SIZEOF_VOID_P -#define FLOAT_SIZE_IN_BYTES SIZEOF_DOUBLE -#define DOUBLE_SIZE_IN_BYTES SIZEOF_DOUBLE -#else -#define FLOAT_SIZE_IN_BYTES SIZEOF_FLOAT -#define DOUBLE_SIZE_IN_BYTES SIZEOF_DOUBLE +/* First, check some assumptions.. */ +#if SIZEOF_CHAR != 1 +#error GHC untested on this architecture: sizeof(char) != 1 +#endif + +#if SIZEOF_SHORT != 2 +#error GHC untested on this architecture: sizeof(short) != 2 +#endif + +#if SIZEOF_UNSIGNED_INT != 4 +#error GHC untested on this architecture: sizeof(unsigned int) != 4 #endif +#define SIZEOF_HSCHAR SIZEOF_WORD32 +#define ALIGNMENT_HSCHAR ALIGNMENT_WORD32 + +#define SIZEOF_HSINT SIZEOF_VOID_P +#define ALIGNMENT_HSINT ALIGNMENT_VOID_P + +#define SIZEOF_HSWORD SIZEOF_VOID_P +#define ALIGNMENT_HSWORD ALIGNMENT_VOID_P + +#define SIZEOF_HSDOUBLE SIZEOF_DOUBLE +#define ALIGNMENT_HSDOUBLE ALIGNMENT_DOUBLE + +#define SIZEOF_HSFLOAT SIZEOF_FLOAT +#define ALIGNMENT_HSFLOAT ALIGNMENT_FLOAT + +#define SIZEOF_HSPTR SIZEOF_VOID_P +#define ALIGNMENT_HSPTR ALIGNMENT_VOID_P + +#define SIZEOF_HSFUNPTR SIZEOF_VOID_P +#define ALIGNMENT_HSFUNPTR ALIGNMENT_VOID_P + +#define SIZEOF_HSFOREIGNPTR SIZEOF_VOID_P +#define ALIGNMENT_HSFOREIGNPTR ALIGNMENT_VOID_P + +#define SIZEOF_HSSTABLEPTR SIZEOF_VOID_P +#define ALIGNMENT_HSSTABLEPTR ALIGNMENT_VOID_P + #define SIZEOF_INT8 SIZEOF_CHAR #define ALIGNMENT_INT8 ALIGNMENT_CHAR + #define SIZEOF_WORD8 SIZEOF_UNSIGNED_CHAR #define ALIGNMENT_WORD8 ALIGNMENT_UNSIGNED_CHAR #define SIZEOF_INT16 SIZEOF_SHORT #define ALIGNMENT_INT16 ALIGNMENT_SHORT + #define SIZEOF_WORD16 SIZEOF_UNSIGNED_SHORT #define ALIGNMENT_WORD16 ALIGNMENT_UNSIGNED_SHORT -#if SIZEOF_UNSIGNED_INT == 4 -#define SIZEOF_INT32 ALIGNMENT_INT -#define ALIGNMENT_INT32 SIZEOF_INT -#define SIZEOF_WORD32 ALIGNMENT_UNSIGNED_INT -#define ALIGNMENT_WORD32 SIZEOF_UNSIGNED_INT -#else -#error GHC untested on this architecture: sizeof(unsigned int) != 4 -#endif +#define SIZEOF_INT32 SIZEOF_INT +#define ALIGNMENT_INT32 ALIGNMENT_INT + +#define SIZEOF_WORD32 SIZEOF_UNSIGNED_INT +#define ALIGNMENT_WORD32 ALIGNMENT_UNSIGNED_INT #if HAVE_LONG_LONG && SIZEOF_VOID_P < 8 /* assume long long is 64 bits */ @@ -63,4 +97,12 @@ #error GHC untested on this architecture: sizeof(void *) < 8 and no long longs. #endif +#ifndef WORD_SIZE_IN_BITS +#if SIZEOF_HSWORD == 4 +#define WORD_SIZE_IN_BITS 32 +#else +#define WORD_SIZE_IN_BITS 64 +#endif #endif + +#endif /* MACHDEPS_H */