[project @ 1998-12-02 13:17:09 by simonm]
[ghc-hetmet.git] / ghc / includes / StgTypes.lh
diff --git a/ghc/includes/StgTypes.lh b/ghc/includes/StgTypes.lh
deleted file mode 100644 (file)
index 824f56d..0000000
+++ /dev/null
@@ -1,278 +0,0 @@
-%
-% (c) The GRASP/AQUA Project, Glasgow University, 1992-1994
-%
-%************************************************************************
-%*                                                                     *
-\section{How data is handled, especially floats and doubles}
-%*                                                                     *
-%************************************************************************
-
-\begin{code}
-#ifndef STGTYPES_H
-#define STGTYPES_H
-\end{code}
-
-Some variables (eg the A stack, the stack pointers, floating point
-registers) can only contain data of a particular (machine type).
-
-%partain:\begin{center}
-\begin{tabular}{|l|l|} 
-\hline
-What we call it        &       The C type which represents it  \\ \hline
-               &                                       \\
-StgInt         &       long                            \\
-StgFloat       &       float                           \\
-StgDouble      &       double                          \\
-StgChar                &       unsigned char                   \\\hline
-StgStablePtr   &       long                            \\
-StgForeignObj  &       (long *)                        \\
-\end{tabular}
-%partain:\end{center}
-
-Others, notably the heap itself and the B stack, can contain various
-kinds of data; pointers, floats, doubles, chars and so on.  These
-structures are given C type @StgWord@, meaning ``I don't know''.
-
-%partain:\begin{center}
-\begin{tabular}{|l|l|}
-\hline
-StgWord                &       long                            \\\hline
-\end{tabular}
-%partain:\end{center}
-
-% @StgWord@s only live in {\em memory locations}; there are no registers
-% of type @StgWord@.
-
-When we load/store things in the heap, or on the B stack, we therefore
-have to coerce data in and out of the @StgWord@ type.  For @StgInt@
-and @StgChar@ that's no problem; we just use a C cast.
-
-Now here's the rub: we can't cast a @StgFloat@ to @StgWord@ because C
-performs numeric conversions if you do!  Worse, we obviously can't
-cast a @StgDouble@ to @StgWord@, because it's the wrong size.  The
-solution we adopt is to provide functions/macros with the following
-prototypes
-
-\begin{pseudocode}
-       StgFloat     PK_FLT( StgWord * )
-       void     ASSIGN_FLT( StgWord [], StgFloat )
-
-       StgDouble    PK_DBL( StgWord * )
-       void     ASSIGN_DBL( StgWord [], StgDouble )
-\end{pseudocode}
-
-The @PK@ functions create a suitable float/double given a pointer to
-some @StgWord@ memory locations; the @ASSIGN@ functions do the
-reverse.  Notice that it is a private matter between @PK_DBL@ and
-@ASSIGN_DBL@ how the words are acutally used to store the double (the
-high word could go in the upper or lower memory location).
-
-We implement these operations as inlined C functions; much
-better than macros because they need a local variable which
-macros don't give you.  There is probably more than one way
-to implement them; we have cheated the type system using a
-union type.
-
-\begin{code}
-typedef unsigned long  StgWord;        /* used for heap- and Bstk- words,
-                                          which can be of various types */
-
-/* macro to round a number-of-bytes up to a sufficient number of words: */
-#define BYTES_TO_STGWORDS(no_bytes) (((no_bytes)+sizeof(W_)-1)/sizeof(W_))
-
-typedef unsigned long  *StgPtr;                /* StgPtr is a ptr to a heap object
-                                          or into the B stack */
-typedef StgPtr        *StgPtrPtr;      /* used for A stack pointer */
-typedef long           StgInt;
-
-#if HAVE_LONG_LONG
-/* These types are only used to allow the passing of
-   64-bit ints from Haskell to ccalls and to ease
-   the implementation of the Int64 and Word64 libraries.
-*/
-typedef unsigned long long int StgWord64;
-typedef long long int          StgInt64;
-typedef StgInt64              LI_;
-typedef StgWord64             LW_;
-#endif
-
-typedef unsigned char  StgChar;
-typedef void          *StgAddr;
-
-#if alpha_TARGET_ARCH
-typedef double         StgFloat;
-typedef double         StgDouble;
-#else
-typedef float          StgFloat;
-typedef double         StgDouble;
-#endif
-
-/* seven shorthand forms: 
-     StgChar, StgWord, StgPtr, StgPtrPtr, StgInt, StgAddr, const StgPtr */
-
-typedef StgChar                C_;
-typedef StgWord                W_;
-typedef StgPtr          P_;
-typedef P_            *PP_;
-typedef StgInt         I_;
-typedef void          *A_;
-typedef const unsigned long *D_;
-
-/* Typedefs for the various sized ints
-   (ToDo: better.)
-*/
-
-typedef unsigned char  StgWord8;
-typedef signed char    StgInt8;
-typedef unsigned short StgWord16;
-typedef short         StgInt16;
-typedef unsigned int   StgWord32;
-typedef signed int     StgInt32;
-       
-
-typedef StgPtr         StgArray;
-typedef StgChar                *StgByteArray;
-typedef StgByteArray   B_;
-
-typedef I_             StgStablePtr;   /* Index into Stable Pointer Table */
-typedef P_             StgForeignObj;  /* (Probably) Pointer to object in C Heap */
-/* On any architecture, StgForeignObj should be big enough to hold
-   the largest possible pointer. */
-
-/* These are used to pass the do_full_collection flag to RealPerformGC
-   and collectHeap.  (Is there a standard name for them?)
-   [ADR]
-
-   Why longs?  --JSM
-   No good reason (bad reason: same as StgInt) -- ADR
-   An abomination!  Death to StgBool!  --JSM
-*/
-#define StgFalse 0
-#define StgTrue  1
-typedef long            StgBool;
-
-typedef long           StgTag;
-
-typedef StgWord                StgInfoEntry;
-typedef StgWord               *StgInfoPtr;
-
-\end{code}
-
-Types for the generated C functions
-       take no arguments
-       return a pointer to the next function to be called
-   use: Ptr to Fun that returns a Ptr to Fun which returns Ptr to void
-
-\begin{code}
-typedef void  *(*(*StgFunPtr)(STG_NO_ARGS))(STG_NO_ARGS);
-
-typedef StgFunPtr (StgFun)(STG_NO_ARGS);
-typedef StgFunPtr sfp; /* shorthand, for less typing while debugging */
-
-typedef StgFunPtr (*StgFunPtrFunPtr)(STG_NO_ARGS);
-
-typedef StgFunPtr F_;
-typedef StgFunPtrFunPtr *FP_;
-
-typedef D_     StgRetAddr; /* for now ... */
-#if 0
-typedef union {
-    StgFunPtr d;               /* direct return */
-    D_ v;                      /* vectored return */
-} StgRetAddr;
-#endif
-
-/* new union type, to eventually replace StgWord */
-typedef union word {
-    B_ b;              /* pointer to byte array */
-    W_ c;              /* (unsigned) character; *not* StgChar type */
-    D_ d;              /* read-only data pointer */
-    StgFloat f;                /* single-precision float */
-    StgFunPtr fp;      /* function (code) pointer */
-    I_ i;              /* integer */
-    P_ p;              /* basic pointer */
-    StgRetAddr r;      /* return address or vector */
-    W_ w;              /* arbitrary word (needed?) */
-    void *v;           /* ??? (AddrKind) */
-} StgUnion;
-
-
-/* 
-   If a BitWord is anything other than an StgWord, you may have some problems.
-   In particular, be sure that the dynamic allocation of a BitWord array from the
-   heap is done properly.
- */
-typedef StgWord                BitWord;        /* Bit marking words */
-
-/* Stuff for hashing */
-typedef StgWord                hash_t;
-
-#define UNHASHED (~0L)
-
-/* ullong (64|128-bit) type: only include if needed (not ANSI) */
-#if defined(__GNUC__) 
-typedef unsigned long long ullong;   /* need prototypes */
-#define LL(x) CAT2(x,LL)
-#else
-typedef unsigned long     ullong;
-#define LL(x) CAT2(x,L)
-#endif
-\end{code}
-
-Stuff for packed shorts; used in @StgMacros.h@.
-
-\begin{code}
-typedef struct __uw
-  { unsigned short s1;
-    unsigned short s2;
-  } unpacked_word;
-
-typedef union __ps
-  { unsigned int u;
-    unpacked_word wu;
-  } packed_shorts;
-\end{code}
-
-Stuff for floats/doubles; used in @StgMacros.h@.
-ToDo: looks pretty 64-bit unfriendly to me! [WDP]
-
-\begin{code}
-typedef struct __ud
-  { StgWord dhi;
-    StgWord dlo;
-  } unpacked_double;
-
-typedef union __dt
-  { StgDouble d;
-    unpacked_double du;
-  } double_thing;
-
-typedef StgWord unpacked_float;
-
-typedef union __ft
-  { StgFloat f;
-    unpacked_float fu;
-  } float_thing;
-
-#if HAVE_LONG_LONG
-typedef union __it
-  { StgInt64 i;
-    unpacked_double iu;
-  } int64_thing;
-
-typedef union __wt
-  { StgWord64 w;
-    unpacked_double wu;
-  } word64_thing;
-#endif
-
-\end{code}
-
-Also include the RTS types for the runtime system modules.
-
-\begin{code}
-
-#include "RtsTypes.h"
-
-#endif /* ! STGTYPES_H */
-\end{code}