2 /* --------------------------------------------------------------------------
3 * Load symbols required from the Prelude
5 * The Hugs 98 system is Copyright (c) Mark P Jones, Alastair Reid, the
6 * Yale Haskell Group, and the Oregon Graduate Institute of Science and
7 * Technology, 1994-1999, All rights reserved. It is distributed as
8 * free software under the license in the file "License", which is
9 * included in the distribution.
11 * $RCSfile: link.c,v $
13 * $Date: 1999/12/06 16:25:25 $
14 * ------------------------------------------------------------------------*/
21 #include "Assembler.h" /* for asmPrimOps and AsmReps */
26 Type typeArrow; /* Function spaces */
34 Type typePrimByteArray;
36 Type typePrimMutableArray;
37 Type typePrimMutableByteArray;
46 #ifdef PROVIDE_FOREIGN
58 Class classEq; /* `standard' classes */
66 Class classReal; /* `numeric' classes */
70 Class classFractional;
73 Class classMonad; /* Monads and monads with a zero */
75 List stdDefaults; /* standard default values */
78 Name nameFalse; /* primitive boolean constructors */
80 Name nameCons; /* primitive list constructors */
81 Name nameUnit; /* primitive Unit type constructor */
85 Name nameFromDouble; /* coercion of numerics */
88 Name nameBind; /* for translating monad comps */
89 Name nameZero; /* for monads with a zero */
96 Name nameUndefined; /* generic undefined value */
107 Name namePmFromInteger;
109 Name nameUnpackString;
112 Name nameCreateAdjThunk;
129 Name namePrimTakeMVar;
137 /* these names are required before we've had a chance to do the right thing */
139 Name nameUnsafeUnpackCString;
141 /* constructors used during translation and codegen */
142 Name nameMkC; /* Char# -> Char */
143 Name nameMkI; /* Int# -> Int */
144 Name nameMkInteger; /* Integer# -> Integer */
145 Name nameMkW; /* Word# -> Word */
146 Name nameMkA; /* Addr# -> Addr */
147 Name nameMkF; /* Float# -> Float */
148 Name nameMkD; /* Double# -> Double */
149 Name nameMkPrimArray;
150 Name nameMkPrimByteArray;
152 Name nameMkPrimMutableArray;
153 Name nameMkPrimMutableByteArray;
154 Name nameMkStable; /* StablePtr# a -> StablePtr a */
155 Name nameMkThreadId; /* ThreadId# -> ThreadId */
156 Name nameMkPrimMVar; /* MVar# a -> MVar a */
158 Name nameMkWeak; /* Weak# a -> Weak a */
160 #ifdef PROVIDE_FOREIGN
161 Name nameMkForeign; /* ForeignObj# -> ForeignObj */
181 Module modulePrelude;
186 /* --------------------------------------------------------------------------
187 * Frequently used type skeletons:
188 * ------------------------------------------------------------------------*/
190 Type arrow; /* mkOffset(0) -> mkOffset(1) */
191 Type boundPair; /* (mkOffset(0),mkOffset(0)) */
192 Type listof; /* [ mkOffset(0) ] */
193 Type typeVarToVar; /* mkOffset(0) -> mkOffset(0) */
195 Cell predNum; /* Num (mkOffset(0)) */
196 Cell predFractional; /* Fractional (mkOffset(0)) */
197 Cell predIntegral; /* Integral (mkOffset(0)) */
198 Kind starToStar; /* Type -> Type */
199 Cell predMonad; /* Monad (mkOffset(0)) */
200 Type typeProgIO; /* IO a */
202 /* --------------------------------------------------------------------------
204 * ------------------------------------------------------------------------*/
206 static Tycon linkTycon ( String s );
207 static Tycon linkClass ( String s );
208 static Name linkName ( String s );
209 static Void mkTypes ( void );
210 static Name predefinePrim ( String s );
213 static Tycon linkTycon( String s )
215 Tycon tc = findTycon(findText(s));
219 ERRMSG(0) "Prelude does not define standard type \"%s\"", s
223 static Class linkClass( String s )
225 Class cc = findClass(findText(s));
229 ERRMSG(0) "Prelude does not define standard class \"%s\"", s
233 static Name linkName( String s )
235 Name n = findName(findText(s));
239 ERRMSG(0) "Prelude does not define standard name \"%s\"", s
243 static Name predefinePrim ( String s )
246 Text t = findText(s);
249 //fprintf(stderr, "predefinePrim: %s already exists\n", s );
252 name(nm).defn=PREDEFINED;
257 Void linkPreludeTC(void) { /* Hook to tycons and classes in */
258 static Bool initialised = FALSE; /* prelude when first loaded */
262 setCurrModule(modulePrelude);
264 typeChar = linkTycon("Char");
265 typeInt = linkTycon("Int");
266 typeInteger = linkTycon("Integer");
267 typeWord = linkTycon("Word");
268 typeAddr = linkTycon("Addr");
269 typePrimArray = linkTycon("PrimArray");
270 typePrimByteArray = linkTycon("PrimByteArray");
271 typeRef = linkTycon("STRef");
272 typePrimMutableArray = linkTycon("PrimMutableArray");
273 typePrimMutableByteArray = linkTycon("PrimMutableByteArray");
274 typeFloat = linkTycon("Float");
275 typeDouble = linkTycon("Double");
276 typeStable = linkTycon("StablePtr");
278 typeWeak = linkTycon("Weak");
280 #ifdef PROVIDE_FOREIGN
281 typeForeign = linkTycon("ForeignObj");
283 typeThreadId = linkTycon("ThreadId");
284 typeMVar = linkTycon("MVar");
285 typeBool = linkTycon("Bool");
286 typeST = linkTycon("ST");
287 typeIO = linkTycon("IO");
288 typeException = linkTycon("Exception");
289 typeString = linkTycon("String");
290 typeOrdering = linkTycon("Ordering");
292 classEq = linkClass("Eq");
293 classOrd = linkClass("Ord");
294 classIx = linkClass("Ix");
295 classEnum = linkClass("Enum");
296 classShow = linkClass("Show");
297 classRead = linkClass("Read");
298 classBounded = linkClass("Bounded");
299 classReal = linkClass("Real");
300 classIntegral = linkClass("Integral");
301 classRealFrac = linkClass("RealFrac");
302 classRealFloat = linkClass("RealFloat");
303 classFractional = linkClass("Fractional");
304 classFloating = linkClass("Floating");
305 classNum = linkClass("Num");
306 classMonad = linkClass("Monad");
309 stdDefaults = cons(typeDouble,stdDefaults);
311 stdDefaults = cons(typeInteger,stdDefaults);
313 stdDefaults = cons(typeInt,stdDefaults);
317 nameMkC = addPrimCfunREP(findText("C#"),1,0,CHAR_REP);
318 nameMkI = addPrimCfunREP(findText("I#"),1,0,INT_REP);
319 nameMkW = addPrimCfunREP(findText("W#"),1,0,WORD_REP);
320 nameMkA = addPrimCfunREP(findText("A#"),1,0,ADDR_REP);
321 nameMkF = addPrimCfunREP(findText("F#"),1,0,FLOAT_REP);
322 nameMkD = addPrimCfunREP(findText("D#"),1,0,DOUBLE_REP);
323 nameMkStable = addPrimCfunREP(findText("Stable#"),1,0,STABLE_REP);
324 nameMkThreadId = addPrimCfunREP(findText("ThreadId#"),1,0,THREADID_REP);
326 #ifdef PROVIDE_FOREIGN
327 nameMkForeign = addPrimCfunREP(findText("Foreign#"),1,0,0);
330 nameMkWeak = addPrimCfunREP(findText("Weak#"),1,0,0);
332 nameMkPrimArray = addPrimCfunREP(findText("PrimArray#"),1,0,0);
333 nameMkPrimByteArray = addPrimCfunREP(findText("PrimByteArray#"),1,0,0);
334 nameMkRef = addPrimCfunREP(findText("STRef#"),1,0,0);
335 nameMkPrimMutableArray = addPrimCfunREP(findText("PrimMutableArray#"),1,0,0);
336 nameMkPrimMutableByteArray = addPrimCfunREP(findText("PrimMutableByteArray#"),1,0,0);
337 nameMkPrimMVar = addPrimCfunREP(findText("MVar#"),1,0,0);
338 nameMkInteger = addPrimCfunREP(findText("Integer#"),1,0,0);
340 /* The following primitives are referred to in derived instances and
341 * hence require types; the following types are a little more general
342 * than we might like, but they are the closest we can get without a
343 * special datatype class.
346 name(namePrimSeq).type
347 = primType(MONAD_Id, "ab", "b");
348 name(namePrimCatch).type
349 = primType(MONAD_Id, "aH", "a");
350 name(namePrimRaise).type
351 = primType(MONAD_Id, "E", "a");
353 /* This is a lie. For a more accurate type of primTakeMVar
354 see ghc/interpreter/lib/Prelude.hs.
356 name(namePrimTakeMVar).type
357 = primType(MONAD_Id, "rbc", "d");
359 for (i=2; i<=NUM_DTUPLES; i++) {/* Add derived instances of tuples */
360 addTupInst(classEq,i);
361 addTupInst(classOrd,i);
362 addTupInst(classIx,i);
363 addTupInst(classShow,i);
364 addTupInst(classRead,i);
365 addTupInst(classBounded,i);
370 static Void mkTypes ( void )
372 predNum = ap(classNum,aVar);
373 predFractional = ap(classFractional,aVar);
374 predIntegral = ap(classIntegral,aVar);
375 predMonad = ap(classMonad,aVar);
376 typeProgIO = ap(typeIO,aVar);
379 Void linkPreludeCM(void) { /* Hook to cfuns and mfuns in */
380 static Bool initialised = FALSE; /* prelude when first loaded */
385 setCurrModule(modulePrelude);
388 nameFalse = linkName("False");
389 nameTrue = linkName("True");
392 nameEq = linkName("==");
393 nameFromInt = linkName("fromInt");
394 nameFromInteger = linkName("fromInteger");
395 nameFromDouble = linkName("fromDouble");
396 nameReturn = linkName("return");
397 nameBind = linkName(">>=");
398 nameLe = linkName("<=");
399 nameGt = linkName(">");
400 nameShowsPrec = linkName("showsPrec");
401 nameReadsPrec = linkName("readsPrec");
402 nameEQ = linkName("EQ");
403 nameCompare = linkName("compare");
404 nameMinBnd = linkName("minBound");
405 nameMaxBnd = linkName("maxBound");
406 nameRange = linkName("range");
407 nameIndex = linkName("index");
408 namePlus = linkName("+");
409 nameMult = linkName("*");
410 nameRangeSize = linkName("rangeSize");
411 nameInRange = linkName("inRange");
412 nameMinus = linkName("-");
413 /* These come before calls to implementPrim */
414 for(i=0; i<NUM_TUPLES; ++i) {
420 Void linkPreludeNames(void) { /* Hook to names defined in Prelude */
421 static Bool initialised = FALSE;
426 setCurrModule(modulePrelude);
429 nameMkIO = linkName("primMkIO");
430 for (i=0; asmPrimOps[i].name; ++i) {
431 Text t = findText(asmPrimOps[i].name);
432 Name n = findName(t);
438 name(n).type = primType(asmPrimOps[i].monad,
440 asmPrimOps[i].results);
441 name(n).arity = strlen(asmPrimOps[i].args);
442 name(n).primop = &(asmPrimOps[i]);
446 /* static(tidyInfix) */
447 nameNegate = linkName("negate");
449 nameRunIO = linkName("primRunIO_hugs_toplevel");
450 namePrint = linkName("print");
452 nameOtherwise = linkName("otherwise");
453 nameUndefined = linkName("undefined");
456 namePmSub = linkName("primPmSub");
459 nameEqChar = linkName("primEqChar");
460 nameCreateAdjThunk = linkName("primCreateAdjThunk");
461 namePmInt = linkName("primPmInt");
462 namePmInteger = linkName("primPmInteger");
463 namePmDouble = linkName("primPmDouble");
465 namePmFromInteger = linkName("primPmFromInteger");
466 namePmSubtract = linkName("primPmSubtract");
467 namePmLe = linkName("primPmLe");
472 /* ToDo: fix pFun (or eliminate its use) */
473 #define pFun(n,s) n = predefinePrim(s)
475 Void linkControl(what)
483 case INSTALL : linkControl(RESET);
485 modulePrelude = newModule(textPrelude);
486 setCurrModule(modulePrelude);
488 for(i=0; i<NUM_TUPLES; ++i) {
492 typeArrow = addPrimTycon(findText("(->)"),
493 pair(STAR,pair(STAR,STAR)),
496 /* newtype and USE_NEWTYPE_FOR_DICTS */
500 pFun(nameInd, "_indirect");
501 name(nameInd).number = DFUNNAME;
504 pFun(nameSel, "_SEL");
506 /* strict constructors */
507 pFun(nameFlip, "flip" );
510 pFun(nameFromTo, "enumFromTo");
511 pFun(nameFromThenTo, "enumFromThenTo");
512 pFun(nameFrom, "enumFrom");
513 pFun(nameFromThen, "enumFromThen");
517 pFun(nameReadField, "readField");
518 pFun(nameReadParen, "readParen");
519 pFun(nameShowField, "showField");
520 pFun(nameShowParen, "showParen");
521 pFun(nameLex, "lex");
524 pFun(nameCompAux, "primCompAux");
525 pFun(nameMap, "map");
527 /* implementTagToCon */
528 pFun(namePMFail, "primPmFail");
529 pFun(nameError, "error");
530 pFun(nameUnpackString, "primUnpackString");
532 /* hooks for handwritten bytecode */
533 pFun(namePrimSeq, "primSeq");
534 pFun(namePrimCatch, "primCatch");
535 pFun(namePrimRaise, "primRaise");
536 pFun(namePrimTakeMVar, "primTakeMVar");
538 StgVar vv = mkStgVar(NIL,NIL);
539 Name n = namePrimSeq;
543 vv = mkStgVar(NIL,NIL);
544 stgVarInfo(vv) = mkPtr ( asm_BCO_seq() );
546 stgGlobals=cons(pair(n,vv),stgGlobals);
550 StgVar vv = mkStgVar(NIL,NIL);
551 Name n = namePrimCatch;
555 stgVarInfo(vv) = mkPtr ( asm_BCO_catch() );
557 stgGlobals=cons(pair(n,vv),stgGlobals);
560 StgVar vv = mkStgVar(NIL,NIL);
561 Name n = namePrimRaise;
565 stgVarInfo(vv) = mkPtr ( asm_BCO_raise() );
567 stgGlobals=cons(pair(n,vv),stgGlobals);
570 StgVar vv = mkStgVar(NIL,NIL);
571 Name n = namePrimTakeMVar;
575 stgVarInfo(vv) = mkPtr ( asm_BCO_takeMVar() );
577 stgGlobals=cons(pair(n,vv),stgGlobals);
585 /*-------------------------------------------------------------------------*/