[project @ 2004-08-13 13:04:50 by simonmar]
[ghc-hetmet.git] / ghc / includes / StgTypes.h
index d0a8104..ae9eec5 100644 (file)
@@ -1,23 +1,34 @@
 /* -----------------------------------------------------------------------------
- * $Id: StgTypes.h,v 1.13 2000/08/07 23:37:23 qrczak 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
        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
        
- * WARNING: Keep this file and HsFFI.h in synch!
+       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.
  *
  * ---------------------------------------------------------------------------*/
 
@@ -45,27 +56,25 @@ typedef unsigned int             StgWord32;
 #error GHC untested on this architecture: sizeof(unsigned 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
-#endif
-
 #ifdef SUPPORT_LONG_LONGS
 /* assume long long is 64 bits */
-typedef unsigned long long int StgWord64;
+# 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          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.
@@ -74,15 +83,19 @@ typedef unsigned long          StgWord64;
 #if SIZEOF_VOID_P == 8
 typedef StgInt64           StgInt;
 typedef StgWord64          StgWord;
+typedef StgWord32          StgHalfWord;
 #else
 #if SIZEOF_VOID_P == 4
 typedef StgInt32           StgInt; 
 typedef StgWord32          StgWord;
+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;
 
 /*
@@ -91,22 +104,14 @@ typedef void*              StgAddr;
 
 typedef StgWord32          StgChar;
 typedef int                StgBool;
-/*
- * If a double fits in an StgWord, don't bother using floats.
- */
 
-#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            StgOffset;        /* byte offset within closure */
                            
@@ -119,27 +124,12 @@ typedef StgInt             StgStackOffset;   /* offset in words! */
 typedef StgWord*           StgStackPtr;
 
 typedef StgWord8          StgCode;         /* close enough */
-typedef StgCode*          StgCodePtr;  
 
 typedef StgPtr*            StgArray;        /* the goods of an Array# */
 typedef char*             StgByteArray;    /* the goods of a ByteArray# */
 
-typedef StgInt64              LI_;
-typedef StgWord64             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.
- * SUP: StgStablePtr used to be a synonym for StgWord, but stable pointers
- * are guaranteed to be void* on the C-side, so we have to do some occasional
- * casting. Size is not a matter, because StgWord is always the same size as
- * a void*.
- */
 typedef void*             StgStablePtr;
 
-#define STABLEPTR_WEIGHT_MASK   ((StgWord)0xff << ((sizeof(StgWord)-1) * BITS_PER_BYTE))
-#define STABLEPTR_WEIGHT_SHIFT  (BITS_IN(StgWord) - 8)
-
 /*
   Types for the generated C functions
   take no arguments
@@ -157,46 +147,4 @@ typedef void*                 StgStablePtr;
 typedef void  *(*(*StgFunPtr)(void))(void);
 typedef StgFunPtr StgFun(void);
 
-typedef union {
-    StgWord        w;
-    StgAddr        a;
-    StgChar        c;
-    StgInt8        i8;
-    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 */