b5f0415e1315c7ffe255b0c41a4919d52f71e168
[ghc-hetmet.git] / ghc / interpreter / link.h
1
2 extern Cell conCons;
3
4 extern Name nameForce;
5 extern Name nameRunIO;
6
7 /* The following data constructors are used to box unboxed
8  * arguments and are treated differently by the code generator.
9  * That is, they have primop `elem` {INT_REP,FLOAT_REP,...}.
10  */
11 #define boxingConRep(con) ((AsmRep)(name(con).primop))
12 #define isBoxingCon(con) (isName(con) && boxingConRep(con) != 0)
13
14 extern Name nameMkC;
15 extern Name nameMkI;
16 #ifdef PROVIDE_INT64
17 extern Name nameMkInt64;
18 #endif
19 #ifdef PROVIDE_WORD
20 extern Name nameMkW;
21 #endif
22 #ifdef PROVIDE_ADDR
23 extern Name nameMkA;
24 #endif
25 extern Name nameMkF;
26 extern Name nameMkD;
27 #ifdef PROVIDE_STABLE
28 extern Name nameMkStable;    
29 #endif
30
31 /* The following data constructors are used to make boxed but 
32  * unpointed values pointed and require no special treatment
33  * by the code generator.
34  */
35 #ifdef PROVIDE_INTEGER
36 extern Name nameMkInteger;
37 #endif
38 #ifdef PROVIDE_ARRAY
39 extern Name nameMkPrimArray;            
40 extern Name nameMkPrimByteArray;
41 extern Name nameMkRef;                  
42 extern Name nameMkPrimMutableArray;     
43 extern Name nameMkPrimMutableByteArray; 
44 #endif
45 #ifdef PROVIDE_FOREIGN
46 extern Name nameMkForeign;   
47 #endif
48 #ifdef PROVIDE_WEAK
49 extern Name nameMkWeak;
50 #endif
51 #ifdef PROVIDE_CONCURRENT
52 extern Name nameMkThreadId;  
53 extern Name nameMkMVar;  
54 #endif
55
56 /* For every primitive type provided by the runtime system,
57  * we construct a Haskell type using a declaration of the form:
58  *
59  *   data Int  -- no constructors given
60  */
61 extern Type typeChar;
62 extern Type typeInt;
63 #ifdef PROVIDE_INT64
64 extern Type typeInt64;
65 #endif
66 #ifdef PROVIDE_INTEGER
67 extern Type typeInteger;
68 #endif
69 #ifdef PROVIDE_WORD
70 extern Type typeWord;
71 #endif
72 #ifdef PROVIDE_ADDR
73 extern Type typeAddr;
74 #endif
75 #ifdef PROVIDE_ARRAY
76 extern Type typePrimArray;            
77 extern Type typePrimByteArray;
78 extern Type typeRef;                  
79 extern Type typePrimMutableArray;     
80 extern Type typePrimMutableByteArray; 
81 #endif
82 extern Type typeFloat;
83 extern Type typeDouble;
84 #ifdef PROVIDE_STABLE
85 extern Type typeStable;
86 #endif
87 #ifdef PROVIDE_WEAK
88 extern Type typeWeak;
89 #endif
90 #ifdef PROVIDE_FOREIGN
91 extern Type typeForeign;
92 #endif
93 #ifdef PROVIDE_CONCURRENT
94 extern Type typeThreadId;
95 extern Type typeMVar;
96 #endif
97
98 /* And a smaller number of types defined in plain Haskell */
99 extern Type typeList;
100 extern Type typeUnit;
101 extern Type typeString;
102 extern Type typeBool;
103 extern Type typeST;
104 extern Type typeIO;
105 extern Type typeException;
106
107 /* copied out of K&R2, Appendix A */
108 #define cat(x,y) x ## y
109 #define xcat(x,y) cat(x,y)
110
111 #ifdef BIGNUMTYPE
112 #define typeBignum   xcat(type,BIGNUMTYPE)
113 #define nameMkBignum xcat(nameMk,BIGNUMTYPE)
114 #else
115 #warning BIGNUMTYPE undefined
116 #endif
117
118 /* used while desugaring */
119 extern Name nameId;
120 extern Name nameOtherwise;
121 extern Name nameUndefined;              /* generic undefined value         */
122
123 /* used in pattern match */
124 #if NPLUSK
125 extern Name namePmSub; 
126 #endif
127 extern Name nameSel;
128
129 /* used in translation */
130 extern Name nameEq;     
131 extern Name namePMFail;
132 extern Name nameEqChar;
133 extern Name nameEqInt;
134 extern Name nameEqInteger;
135 extern Name nameEqDouble;
136 extern Name namePmInt;
137 extern Name namePmInteger;
138 extern Name namePmDouble;
139 extern Name namePmLe;
140 extern Name namePmSubtract;
141 extern Name namePmFromInteger;
142 extern Name nameMkIO;
143 extern Name nameUnpackString;
144
145 extern Type  arrow;                     /* mkOffset(0) -> mkOffset(1)      */
146 extern Type  listof;                    /* [ mkOffset(0) ]                 */
147 extern Cell  predNum;                   /* Num (mkOffset(0))               */
148 extern Cell  predFractional;            /* Fractional (mkOffset(0))        */
149 extern Cell  predIntegral;              /* Integral (mkOffset(0))          */
150 extern Cell  predMonad;                 /* Monad (mkOffset(0))             */
151
152
153 extern Type  arrow;                     /* mkOffset(0) -> mkOffset(1)      */
154 extern       Type  boundPair;;                 /* (mkOffset(0),mkOffset(0))       */
155 extern       Type  listof;;                    /* [ mkOffset(0) ]                 */
156 extern       Type  typeVarToVar;;              /* mkOffset(0) -> mkOffset(0)      */
157
158 extern       Cell  predNum;;                   /* Num (mkOffset(0))               */
159 extern       Cell  predFractional;;            /* Fractional (mkOffset(0))        */
160 extern       Cell  predIntegral;;              /* Integral (mkOffset(0))          */
161 extern       Kind  starToStar;;                /* Type -> Type                    */
162 extern       Cell  predMonad;;                 /* Monad (mkOffset(0))             */