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,...}.
10 #define boxingConRep(con) ((AsmRep)(name(con).primop))
11 #define isBoxingCon(con) (isName(con) && boxingConRep(con) != 0)
16 extern Name nameMkInt64;
27 extern Name nameMkStable;
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.
34 #ifdef PROVIDE_INTEGER
35 extern Name nameMkInteger;
38 extern Name nameMkPrimArray;
39 extern Name nameMkPrimByteArray;
40 extern Name nameMkRef;
41 extern Name nameMkPrimMutableArray;
42 extern Name nameMkPrimMutableByteArray;
44 #ifdef PROVIDE_FOREIGN
45 extern Name nameMkForeign;
48 extern Name nameMkWeak;
50 #ifdef PROVIDE_CONCURRENT
51 extern Name nameMkThreadId;
52 extern Name nameMkMVar;
55 /* For every primitive type provided by the runtime system,
56 * we construct a Haskell type using a declaration of the form:
58 * data Int -- no constructors given
63 extern Type typeInt64;
65 #ifdef PROVIDE_INTEGER
66 extern Type typeInteger;
75 extern Type typePrimArray;
76 extern Type typePrimByteArray;
78 extern Type typePrimMutableArray;
79 extern Type typePrimMutableByteArray;
81 extern Type typeFloat;
82 extern Type typeDouble;
84 extern Type typeStable;
89 #ifdef PROVIDE_FOREIGN
90 extern Type typeForeign;
92 #ifdef PROVIDE_CONCURRENT
93 extern Type typeThreadId;
97 /* And a smaller number of types defined in plain Haskell */
100 extern Type typeString;
101 extern Type typeBool;
104 extern Type typeException;
106 /* copied out of K&R2, Appendix A */
107 #define cat(x,y) x ## y
108 #define xcat(x,y) cat(x,y)
111 #define typeBignum xcat(type,BIGNUMTYPE)
112 #define nameMkBignum xcat(nameMk,BIGNUMTYPE)
114 #warning BIGNUMTYPE undefined
117 /* used while desugaring */
119 extern Name nameOtherwise;
120 extern Name nameUndefined; /* generic undefined value */
122 /* used in pattern match */
124 extern Name namePmSub;
128 /* used in translation */
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;
146 extern Name nameMinus;
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)) */
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) */
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)) */