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