[project @ 2004-08-13 13:04:50 by simonmar]
[ghc-hetmet.git] / ghc / includes / HsFFI.h
1 /* -----------------------------------------------------------------------------
2  * $Id: HsFFI.h,v 1.20 2004/08/13 13:09:13 simonmar Exp $
3  *
4  * (c) The GHC Team, 2000
5  *
6  * A mapping for Haskell types to C types, including the corresponding bounds.
7  * Intended to be used in conjuction with the FFI.
8  *
9  * WARNING: Keep this file and StgTypes.h in synch!
10  *
11  * ---------------------------------------------------------------------------*/
12
13 #ifndef HSFFI_H
14 #define HSFFI_H
15
16 #ifdef __cplusplus
17 extern "C" {
18 #endif
19
20 /* get types from GHC's runtime system */
21 #include "ghcconfig.h"
22 #include "RtsConfig.h"
23 #include "StgTypes.h"
24
25 /* get limits for integral types */
26 #ifdef HAVE_STDINT_H
27 /* ISO C 99 says:
28  * "C++ implementations should define these macros only when
29  * __STDC_LIMIT_MACROS is defined before <stdint.h> is included."
30  */
31 #define __STDC_LIMIT_MACROS
32 #include <stdint.h>
33 #elif defined(HAVE_INTTYPES_H)
34 #include <inttypes.h>
35 #else
36 /* second best guess (e.g. on Solaris) */
37 #include <limits.h>
38 #endif
39
40 #ifdef INT8_MIN
41 #define __INT8_MIN              INT8_MIN
42 #define __INT16_MIN             INT16_MIN
43 #define __INT32_MIN             INT32_MIN
44 #define __INT64_MIN             INT64_MIN
45 #define __INT8_MAX              INT8_MAX
46 #define __INT16_MAX             INT16_MAX
47 #define __INT32_MAX             INT32_MAX
48 #define __INT64_MAX             INT64_MAX
49 #define __UINT8_MAX             UINT8_MAX
50 #define __UINT16_MAX            UINT16_MAX
51 #define __UINT32_MAX            UINT32_MAX
52 #define __UINT64_MAX            UINT64_MAX
53 #else
54 /* if we had no luck, let's do it for ourselves (assuming 64bit long longs) */
55 #define __INT8_MIN              (-128)
56 #define __INT16_MIN             (-32767-1)
57 #define __INT32_MIN             (-2147483647-1)
58 #define __INT64_MIN             (-9223372036854775807LL-1)
59 #define __INT8_MAX              (127)
60 #define __INT16_MAX             (32767)
61 #define __INT32_MAX             (2147483647)
62 #define __INT64_MAX             (9223372036854775807LL)
63 #define __UINT8_MAX             (255U)
64 #define __UINT16_MAX            (65535U)
65 #define __UINT32_MAX            (4294967295U)
66 #define __UINT64_MAX            (18446744073709551615ULL)
67 #endif
68
69 /* get limits for floating point types */
70 #include <float.h>
71
72 typedef StgChar                 HsChar;
73 typedef StgInt                  HsInt;
74 typedef StgInt8                 HsInt8;
75 typedef StgInt16                HsInt16;
76 typedef StgInt32                HsInt32;
77 typedef StgInt64                HsInt64;
78 typedef StgWord                 HsWord;
79 typedef StgWord8                HsWord8;
80 typedef StgWord16               HsWord16;
81 typedef StgWord32               HsWord32;
82 typedef StgWord64               HsWord64;
83 typedef StgFloat                HsFloat;
84 typedef StgDouble               HsDouble;
85 typedef StgBool                 HsBool;
86 typedef void*                   HsPtr;          /* this should better match StgAddr */
87 typedef void                    (*HsFunPtr)(void); /* this should better match StgAddr */
88 typedef void*                   HsForeignPtr;   /* ... and this StgForeignPtr       */
89 typedef void*                   HsStablePtr;
90 typedef void*                   HsAddr;         /* DEPRECATED */
91 typedef void*                   HsForeignObj;   /* DEPRECATED */
92
93 /* this should correspond to the type of StgChar in StgTypes.h */
94 #define HS_CHAR_MIN             0
95 #define HS_CHAR_MAX             0x10FFFF
96
97 /* is it true or not?  */
98 #define HS_BOOL_FALSE           0
99 #define HS_BOOL_TRUE            1
100
101 #define HS_BOOL_MIN             HS_BOOL_FALSE
102 #define HS_BOOL_MAX             HS_BOOL_TRUE
103
104 /* this mirrors the distinction of cases in StgTypes.h */
105 #if   SIZEOF_VOID_P == 8
106 #define HS_INT_MIN              __INT64_MIN
107 #define HS_INT_MAX              __INT64_MAX
108 #elif SIZEOF_VOID_P == 4
109 #define HS_INT_MIN              __INT32_MIN
110 #define HS_INT_MAX              __INT32_MAX
111 #else
112 #error GHC untested on this architecture: sizeof(void *) != 4 or 8
113 #endif
114
115 #define HS_INT8_MIN             __INT8_MIN
116 #define HS_INT8_MAX             __INT8_MAX
117 #define HS_INT16_MIN            __INT16_MIN
118 #define HS_INT16_MAX            __INT16_MAX
119 #define HS_INT32_MIN            __INT32_MIN
120 #define HS_INT32_MAX            __INT32_MAX
121 #define HS_INT64_MIN            __INT64_MIN
122 #define HS_INT64_MAX            __INT64_MAX
123 #define HS_WORD8_MAX            __UINT8_MAX
124 #define HS_WORD16_MAX           __UINT16_MAX
125 #define HS_WORD32_MAX           __UINT32_MAX
126 #define HS_WORD64_MAX           __UINT64_MAX
127
128 #define HS_FLOAT_RADIX          FLT_RADIX
129 #define HS_FLOAT_ROUNDS         FLT_ROUNDS
130 #define HS_FLOAT_EPSILON        FLT_EPSILON
131 #define HS_FLOAT_DIG            FLT_DIG
132 #define HS_FLOAT_MANT_DIG       FLT_MANT_DIG
133 #define HS_FLOAT_MIN            FLT_MIN
134 #define HS_FLOAT_MIN_EXP        FLT_MIN_EXP
135 #define HS_FLOAT_MIN_10_EXP     FLT_MIN_10_EXP
136 #define HS_FLOAT_MAX            FLT_MAX
137 #define HS_FLOAT_MAX_EXP        FLT_MAX_EXP
138 #define HS_FLOAT_MAX_10_EXP     FLT_MAX_10_EXP
139
140 #define HS_DOUBLE_RADIX         DBL_RADIX
141 #define HS_DOUBLE_ROUNDS        DBL_ROUNDS
142 #define HS_DOUBLE_EPSILON       DBL_EPSILON
143 #define HS_DOUBLE_DIG           DBL_DIG
144 #define HS_DOUBLE_MANT_DIG      DBL_MANT_DIG
145 #define HS_DOUBLE_MIN           DBL_MIN
146 #define HS_DOUBLE_MIN_EXP       DBL_MIN_EXP
147 #define HS_DOUBLE_MIN_10_EXP    DBL_MIN_10_EXP
148 #define HS_DOUBLE_MAX           DBL_MAX
149 #define HS_DOUBLE_MAX_EXP       DBL_MAX_EXP
150 #define HS_DOUBLE_MAX_10_EXP    DBL_MAX_10_EXP
151
152 extern void hs_init     (int *argc, char **argv[]);
153 extern void hs_exit     (void);
154 extern void hs_set_argv (int argc, char *argv[]);
155 extern void hs_add_root (void (*init_root)(void));
156
157 extern void hs_perform_gc (void);
158
159 extern void hs_free_stable_ptr (HsStablePtr sp);
160 extern void hs_free_fun_ptr    (HsFunPtr fp);
161
162 /* -------------------------------------------------------------------------- */
163
164 #ifdef __cplusplus
165 }
166 #endif
167
168 #endif /* HSFFI_H */