X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FMachDeps.h;h=39ce7579173b4f7da4d14f2bdc4e29cbda777a00;hb=423d477bfecd490de1449c59325c8776f91d7aac;hp=1b52fd043a6f1bbd39b4147a892d6abaf0970c2d;hpb=438596897ebbe25a07e1c82085cfbc5bdb00f09e;p=ghc-hetmet.git diff --git a/ghc/includes/MachDeps.h b/ghc/includes/MachDeps.h index 1b52fd0..39ce757 100644 --- a/ghc/includes/MachDeps.h +++ b/ghc/includes/MachDeps.h @@ -1,31 +1,108 @@ /* ----------------------------------------------------------------------------- - * $Id: MachDeps.h,v 1.2 1998/12/02 13:21:12 simonm Exp $ * - * (c) The GRASP/AQUA Project, Glasgow University, 1998 + * (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. + */ + +/* 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 -#if SIZEOF_DOUBLE == SIZEOF_VOID_P -#define FLOAT_SIZE_IN_BYTES SIZEOF_DOUBLE -#define DOUBLE_SIZE_IN_BYTES SIZEOF_DOUBLE +#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 + +#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 */ +#define SIZEOF_INT64 SIZEOF_LONG_LONG +#define ALIGNMENT_INT64 ALIGNMENT_LONG_LONG +#define SIZEOF_WORD64 SIZEOF_UNSIGNED_LONG_LONG +#define ALIGNMENT_WORD64 ALIGNMENT_UNSIGNED_LONG_LONG +#elif SIZEOF_LONG == 8 +#define SIZEOF_INT64 SIZEOF_LONG +#define ALIGNMENT_INT64 ALIGNMENT_LONG +#define SIZEOF_WORD64 SIZEOF_UNSIGNED_LONG +#define ALIGNMENT_WORD64 ALIGNMENT_UNSIGNED_LONG #else -#define FLOAT_SIZE_IN_BYTES SIZEOF_FLOAT -#define DOUBLE_SIZE_IN_BYTES SIZEOF_DOUBLE +#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 */