/* -----------------------------------------------------------------------------
- * $Id: StgTypes.h,v 1.4 1999/02/05 16:02:30 simonm Exp $
*
- * (c) The GHC Team, 1998-1999
+ * (c) The GHC Team, 1998-2004
+ *
+ * Various C datatypes used in the run-time system. This is the
+ * lowest-level include file, after ghcconfig.h and RtsConfig.h.
+ *
+ * This module should define types *only*, all beginning with "Stg".
*
- * Various C datatypes used in the run-time system.
-
* Specifically:
- StgInt8, 16, 32, 64
- StgNat8, 16, 32, 64
+ StgInt8, 16, 32, 64
+ StgWord8, 16, 32, 64
StgChar, StgFloat, StgDouble
- ***** All the same size: *****
+ ***** All the same size (i.e. sizeof(void *)): *****
StgPtr Basic pointer type
StgWord Unit of heap allocation
StgInt Signed version of StgWord
StgAddr Generic address type
+ StgBool, StgVoid, StgClosurePtr, StgPtr, StgOffset,
+ StgTSOPtr, StgForeignPtr, StgStackOffset, StgStackPtr,
+ StgCode, StgArray, StgByteArray, StgStablePtr, StgFunPtr,
+ StgUnion.
+ * WARNING: Keep this file, MachDeps.h, and HsFFI.h in synch!
+ *
+ * NOTE: assumes #include "ghcconfig.h"
+ *
+ * Works with or without _POSIX_SOURCE.
*
* ---------------------------------------------------------------------------*/
/*
* First, platform-dependent definitions of size-specific integers.
* Assume for now that the int type is 32 bits.
+ * NOTE: Synch the following definitions with MachDeps.h!
* ToDo: move these into a platform-dependent file.
*/
typedef signed char StgInt8;
-typedef unsigned char StgNat8;
+typedef unsigned char StgWord8;
typedef signed short StgInt16;
-typedef unsigned short StgNat16;
-
+typedef unsigned short StgWord16;
#if SIZEOF_UNSIGNED_INT == 4
typedef signed int StgInt32;
-typedef unsigned int StgNat32;
+typedef unsigned int StgWord32;
#else
-#error GHC untested on this architecture: sizeof(unisgned int) != 4
-#endif
-
-/* This #define controls whether we need to support long longs on a particular
- * platform.
- *
- * ToDo: find a proper home for (derived) configuration information like this.
- */
-#if HAVE_LONG_LONG && SIZEOF_VOID_P < 8
-#define SUPPORT_LONG_LONGS
+#error GHC untested on this architecture: sizeof(unsigned int) != 4
#endif
#ifdef SUPPORT_LONG_LONGS
/* assume long long is 64 bits */
-typedef unsigned long long int StgNat64;
+# ifndef _MSC_VER
typedef signed long long int StgInt64;
+typedef unsigned long long int StgWord64;
+# else
+typedef __int64 StgInt64;
+typedef unsigned __int64 StgWord64;
+# endif
#elif SIZEOF_LONG == 8
typedef signed long StgInt64;
-typedef unsigned long StgNat64;
+typedef unsigned long StgWord64;
+#elif defined(__MSVC__)
+typedef __int64 StgInt64;
+typedef unsigned __int64 StgWord64;
#else
#error GHC untested on this architecture: sizeof(void *) < 8 and no long longs.
#endif
-
/*
* Define the standard word size we'll use on this machine: make it
* big enough to hold a pointer.
#if SIZEOF_VOID_P == 8
typedef StgInt64 StgInt;
-typedef StgNat64 StgWord;
+typedef StgWord64 StgWord;
+typedef StgInt32 StgHalfInt;
+typedef StgWord32 StgHalfWord;
#else
#if SIZEOF_VOID_P == 4
typedef StgInt32 StgInt;
-typedef StgNat32 StgWord;
+typedef StgWord32 StgWord;
+typedef StgInt16 StgHalfInt;
+typedef StgWord16 StgHalfWord;
#else
#error GHC untested on this architecture: sizeof(void *) != 4 or 8
#endif
#endif
+#define W_MASK (sizeof(W_)-1)
+
typedef void* StgAddr;
/*
* Other commonly-used STG datatypes.
*/
-typedef StgNat8 StgChar;
-
-/*
- * If a double fits in an StgWord, don't bother using floats.
- */
+typedef StgWord32 StgChar;
+typedef int StgBool;
-#if SIZEOF_DOUBLE == SIZEOF_VOID_P
-typedef double StgFloat;
-typedef double StgDouble;
-#define FLOATS_AS_DOUBLES 1
-#else
typedef float StgFloat;
typedef double StgDouble;
-#endif
typedef void StgVoid;
-typedef struct StgClosure_* StgClosurePtr;
+typedef struct StgClosure_ StgClosure;
+typedef StgClosure* StgClosurePtr;
typedef StgWord* StgPtr; /* pointer into closure */
+typedef StgWord volatile* StgVolatilePtr; /* pointer to volatile word */
typedef StgWord StgOffset; /* byte offset within closure */
typedef struct StgTSO_* StgTSOPtr;
-typedef void * StgForeignPtr;
+typedef void* StgForeignPtr;
typedef StgInt StgStackOffset; /* offset in words! */
typedef StgWord* StgStackPtr;
-typedef StgNat8 StgCode; /* close enough */
-typedef StgCode* StgCodePtr;
+typedef StgWord8 StgCode; /* close enough */
typedef StgPtr* StgArray; /* the goods of an Array# */
typedef char* StgByteArray; /* the goods of a ByteArray# */
-typedef StgInt64 LI_;
-typedef StgNat64 LW_;
-
-/* Stable Pointers: A stable pointer is represented as an index into
- * the stable pointer table in the low 24 bits with a weight in the
- * upper 8 bits.
- */
-typedef StgWord StgStablePtr;
-
-#define STABLEPTR_WEIGHT_MASK (0xff << ((sizeof(StgWord)-1) * BITS_PER_BYTE))
-#define STABLEPTR_WEIGHT_SHIFT (BITS_IN(StgWord) - 8)
+typedef void* StgStablePtr;
/*
Types for the generated C functions
typedef void *(*(*StgFunPtr)(void))(void);
typedef StgFunPtr StgFun(void);
-typedef union {
- StgWord w;
- StgAddr a;
- StgChar c;
- StgFloat f;
- StgInt i;
- StgPtr p;
- StgClosurePtr cl;
- StgStackOffset offset; /* unused? */
- StgByteArray b;
- StgTSOPtr t;
-} StgUnion;
-
-/*
- * Shorthand forms
- */
-
-typedef StgChar C_;
-typedef StgWord W_;
-typedef StgWord* P_;
-typedef P_* PP_;
-typedef StgInt I_;
-typedef StgAddr A_;
-typedef const StgWord* D_;
-typedef StgFunPtr F_;
-typedef StgByteArray B_;
-typedef StgClosurePtr L_;
-
-/*
- * We often want to know the size of something in units of an
- * StgWord... (rounded up, of course!)
- */
-
-#define sizeofW(t) ((sizeof(t)+sizeof(W_)-1)/sizeof(W_))
-
-/*
- * It's nice to be able to grep for casts
- */
-
-#define stgCast(ty,e) ((ty)(e))
-
-#endif STGTYPES_H
-
+#endif /* STGTYPES_H */