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: 2000/03/10 20:03:36 $
14 * ------------------------------------------------------------------------*/
20 #include "Assembler.h" /* for asmPrimOps and AsmReps */
24 Type typeArrow; /* Function spaces */
32 Type typePrimByteArray;
34 Type typePrimMutableArray;
35 Type typePrimMutableByteArray;
44 #ifdef PROVIDE_FOREIGN
56 Class classEq; /* `standard' classes */
64 Class classReal; /* `numeric' classes */
68 Class classFractional;
71 Class classMonad; /* Monads and monads with a zero */
73 List stdDefaults; /* standard default values */
76 Name nameFalse; /* primitive boolean constructors */
78 Name nameCons; /* primitive list constructors */
79 Name nameUnit; /* primitive Unit type constructor */
83 Name nameFromDouble; /* coercion of numerics */
86 Name nameBind; /* for translating monad comps */
87 Name nameZero; /* for monads with a zero */
92 Name nameRunIO_toplevel;
96 Name nameUndefined; /* generic undefined value */
105 Name namePmFromInteger;
107 Name nameUnpackString;
110 Name nameCreateAdjThunk;
127 Name namePrimTakeMVar;
135 /* these names are required before we've had a chance to do the right thing */
137 Name nameUnsafeUnpackCString;
139 /* constructors used during translation and codegen */
140 Name nameMkC; /* Char# -> Char */
141 Name nameMkI; /* Int# -> Int */
142 Name nameMkInteger; /* Integer# -> Integer */
143 Name nameMkW; /* Word# -> Word */
144 Name nameMkA; /* Addr# -> Addr */
145 Name nameMkF; /* Float# -> Float */
146 Name nameMkD; /* Double# -> Double */
147 Name nameMkPrimArray;
148 Name nameMkPrimByteArray;
150 Name nameMkPrimMutableArray;
151 Name nameMkPrimMutableByteArray;
152 Name nameMkStable; /* StablePtr# a -> StablePtr a */
153 Name nameMkThreadId; /* ThreadId# -> ThreadId */
154 Name nameMkPrimMVar; /* MVar# a -> MVar a */
156 Name nameMkWeak; /* Weak# a -> Weak a */
158 #ifdef PROVIDE_FOREIGN
159 Name nameMkForeign; /* ForeignObj# -> ForeignObj */
179 Module modulePrelude;
184 /* --------------------------------------------------------------------------
185 * Frequently used type skeletons:
186 * ------------------------------------------------------------------------*/
188 Type arrow; /* mkOffset(0) -> mkOffset(1) */
189 Type boundPair; /* (mkOffset(0),mkOffset(0)) */
190 Type listof; /* [ mkOffset(0) ] */
191 Type typeVarToVar; /* mkOffset(0) -> mkOffset(0) */
193 Cell predNum; /* Num (mkOffset(0)) */
194 Cell predFractional; /* Fractional (mkOffset(0)) */
195 Cell predIntegral; /* Integral (mkOffset(0)) */
196 Kind starToStar; /* Type -> Type */
197 Cell predMonad; /* Monad (mkOffset(0)) */
198 Type typeProgIO; /* IO a */
201 /* --------------------------------------------------------------------------
203 * ------------------------------------------------------------------------*/
205 static Tycon linkTycon ( String s );
206 static Tycon linkClass ( String s );
207 static Name linkName ( String s );
208 static Name predefinePrim ( String s );
211 static Tycon linkTycon( String s )
213 Tycon tc = findTycon(findText(s));
214 if (nonNull(tc)) return tc;
216 tc = findTyconInAnyModule(findText(s));
217 if (nonNull(tc)) return tc;
219 fprintf(stderr, "frambozenvla! unknown tycon %s\n", s );
221 ERRMSG(0) "Prelude does not define standard type \"%s\"", s
225 static Class linkClass( String s )
227 Class cc = findClass(findText(s));
228 if (nonNull(cc)) return cc;
230 cc = findClassInAnyModule(findText(s));
231 if (nonNull(cc)) return cc;
233 fprintf(stderr, "frambozenvla! unknown class %s\n", s );
235 ERRMSG(0) "Prelude does not define standard class \"%s\"", s
239 static Name linkName( String s )
241 Name n = findName(findText(s));
242 if (nonNull(n)) return n;
244 n = findNameInAnyModule(findText(s));
245 if (nonNull(n)) return n;
247 fprintf(stderr, "frambozenvla! unknown name %s\n", s );
249 ERRMSG(0) "Prelude does not define standard name \"%s\"", s
253 static Name predefinePrim ( String s )
256 Text t = findText(s);
259 //fprintf(stderr, "predefinePrim: %s already exists\n", s );
262 name(nm).defn=PREDEFINED;
268 /* --------------------------------------------------------------------------
270 * ------------------------------------------------------------------------*/
272 /* In standalone mode, linkPreludeTC, linkPreludeCM and linkPrimitiveNames
273 are called, in that order, during static analysis of Prelude.hs.
274 In combined mode such an analysis does not happen. Instead these
275 calls will be made as a result of a call link(POSTPREL).
277 linkPreludeTC, linkPreludeCM and linkPreludeNames are needed in both
278 standalone and combined modes.
282 Void linkPreludeTC(void) { /* Hook to tycons and classes in */
283 static Bool initialised = FALSE; /* prelude when first loaded */
287 setCurrModule(modulePrelude);
289 typeChar = linkTycon("Char");
290 typeInt = linkTycon("Int");
291 typeInteger = linkTycon("Integer");
292 typeWord = linkTycon("Word");
293 typeAddr = linkTycon("Addr");
294 typePrimArray = linkTycon("PrimArray");
295 typePrimByteArray = linkTycon("PrimByteArray");
296 typeRef = linkTycon("STRef");
297 typePrimMutableArray = linkTycon("PrimMutableArray");
298 typePrimMutableByteArray = linkTycon("PrimMutableByteArray");
299 typeFloat = linkTycon("Float");
300 typeDouble = linkTycon("Double");
301 typeStable = linkTycon("StablePtr");
303 typeWeak = linkTycon("Weak");
305 # ifdef PROVIDE_FOREIGN
306 typeForeign = linkTycon("ForeignObj");
308 typeThreadId = linkTycon("ThreadId");
309 typeMVar = linkTycon("MVar");
310 typeBool = linkTycon("Bool");
311 typeST = linkTycon("ST");
312 typeIO = linkTycon("IO");
313 typeException = linkTycon("Exception");
314 typeString = linkTycon("String");
315 typeOrdering = linkTycon("Ordering");
317 classEq = linkClass("Eq");
318 classOrd = linkClass("Ord");
319 classIx = linkClass("Ix");
320 classEnum = linkClass("Enum");
321 classShow = linkClass("Show");
322 classRead = linkClass("Read");
323 classBounded = linkClass("Bounded");
324 classReal = linkClass("Real");
325 classIntegral = linkClass("Integral");
326 classRealFrac = linkClass("RealFrac");
327 classRealFloat = linkClass("RealFloat");
328 classFractional = linkClass("Fractional");
329 classFloating = linkClass("Floating");
330 classNum = linkClass("Num");
331 classMonad = linkClass("Monad");
334 stdDefaults = cons(typeDouble,stdDefaults);
335 stdDefaults = cons(typeInteger,stdDefaults);
337 predNum = ap(classNum,aVar);
338 predFractional = ap(classFractional,aVar);
339 predIntegral = ap(classIntegral,aVar);
340 predMonad = ap(classMonad,aVar);
341 typeProgIO = ap(typeIO,aVar);
343 nameMkC = addPrimCfunREP(findText("C#"),1,0,CHAR_REP);
344 nameMkI = addPrimCfunREP(findText("I#"),1,0,INT_REP);
345 nameMkW = addPrimCfunREP(findText("W#"),1,0,WORD_REP);
346 nameMkA = addPrimCfunREP(findText("A#"),1,0,ADDR_REP);
347 nameMkF = addPrimCfunREP(findText("F#"),1,0,FLOAT_REP);
348 nameMkD = addPrimCfunREP(findText("D#"),1,0,DOUBLE_REP);
349 nameMkStable = addPrimCfunREP(findText("Stable#"),1,0,STABLE_REP);
350 nameMkThreadId = addPrimCfunREP(findText("ThreadId#"),1,0,THREADID_REP);
352 # ifdef PROVIDE_FOREIGN
353 nameMkForeign = addPrimCfunREP(findText("Foreign#"),1,0,0);
356 nameMkWeak = addPrimCfunREP(findText("Weak#"),1,0,0);
358 nameMkPrimArray = addPrimCfunREP(findText("PrimArray#"),1,0,0);
359 nameMkPrimByteArray = addPrimCfunREP(findText("PrimByteArray#"),1,0,0);
360 nameMkRef = addPrimCfunREP(findText("STRef#"),1,0,0);
361 nameMkPrimMutableArray = addPrimCfunREP(findText("PrimMutableArray#"),1,0,0);
362 nameMkPrimMutableByteArray = addPrimCfunREP(findText("PrimMutableByteArray#"),1,0,0);
363 nameMkPrimMVar = addPrimCfunREP(findText("MVar#"),1,0,0);
364 nameMkInteger = addPrimCfunREP(findText("Integer#"),1,0,0);
366 name(namePrimSeq).type = primType(MONAD_Id, "ab", "b");
367 name(namePrimCatch).type = primType(MONAD_Id, "aH", "a");
368 name(namePrimRaise).type = primType(MONAD_Id, "E", "a");
370 /* This is a lie. For a more accurate type of primTakeMVar
371 see ghc/interpreter/lib/Prelude.hs.
373 name(namePrimTakeMVar).type = primType(MONAD_Id, "rbc", "d");
376 for (i=2; i<=NUM_DTUPLES; i++) {/* Add derived instances of tuples */
377 addTupInst(classEq,i);
378 addTupInst(classOrd,i);
379 addTupInst(classIx,i);
380 addTupInst(classShow,i);
381 addTupInst(classRead,i);
382 addTupInst(classBounded,i);
388 Void linkPreludeCM(void) { /* Hook to cfuns and mfuns in */
389 static Bool initialised = FALSE; /* prelude when first loaded */
394 setCurrModule(modulePrelude);
397 nameFalse = linkName("False");
398 nameTrue = linkName("True");
401 nameEq = linkName("==");
402 nameFromInt = linkName("fromInt");
403 nameFromInteger = linkName("fromInteger");
404 nameReturn = linkName("return");
405 nameBind = linkName(">>=");
406 nameMFail = linkName("fail");
407 nameLe = linkName("<=");
408 nameGt = linkName(">");
409 nameShowsPrec = linkName("showsPrec");
410 nameReadsPrec = linkName("readsPrec");
411 nameEQ = linkName("EQ");
412 nameCompare = linkName("compare");
413 nameMinBnd = linkName("minBound");
414 nameMaxBnd = linkName("maxBound");
415 nameRange = linkName("range");
416 nameIndex = linkName("index");
417 namePlus = linkName("+");
418 nameMult = linkName("*");
419 nameRangeSize = linkName("rangeSize");
420 nameInRange = linkName("inRange");
421 nameMinus = linkName("-");
422 /* These come before calls to implementPrim */
424 for(i=0; i<NUM_TUPLES; ++i) {
425 if (i != 1) implementTuple(i);
431 Void linkPrimitiveNames(void) { /* Hook to names defined in Prelude */
432 static Bool initialised = FALSE;
437 setCurrModule(modulePrelude);
440 nameMkIO = linkName("hugsprimMkIO");
444 for (i=0; asmPrimOps[i].name; ++i) {
445 Text t = findText(asmPrimOps[i].name);
446 Name n = findName(t);
451 name(n).type = primType(asmPrimOps[i].monad,
453 asmPrimOps[i].results);
454 name(n).arity = strlen(asmPrimOps[i].args);
455 name(n).primop = &(asmPrimOps[i]);
458 ERRMSG(0) "Link Error in Prelude, surplus definition of \"%s\"",
461 // Name already defined!
466 /* static(tidyInfix) */
467 nameNegate = linkName("negate");
469 nameRunIO_toplevel = linkName("hugsprimRunIO_toplevel");
470 nameShow = linkName("show");
471 namePutStr = linkName("putStr");
472 namePrint = linkName("print");
474 nameOtherwise = linkName("otherwise");
475 nameUndefined = linkName("undefined");
477 namePmSub = linkName("hugsprimPmSub");
479 nameEqChar = linkName("hugsprimEqChar");
480 nameCreateAdjThunk = linkName("hugsprimCreateAdjThunk");
481 namePmInt = linkName("hugsprimPmInt");
482 namePmInteger = linkName("hugsprimPmInteger");
483 namePmDouble = linkName("hugsprimPmDouble");
485 nameFromDouble = linkName("fromDouble");
486 namePmFromInteger = linkName("hugsprimPmFromInteger");
488 namePmSubtract = linkName("hugsprimPmSubtract");
489 namePmLe = linkName("hugsprimPmLe");
492 implementCfun ( nameCons, NIL );
493 implementCfun ( nameNil, NIL );
494 implementCfun ( nameUnit, NIL );
500 /* --------------------------------------------------------------------------
502 * ------------------------------------------------------------------------*/
504 /* ToDo: fix pFun (or eliminate its use) */
505 #define pFun(n,s) n = predefinePrim(s)
507 Void linkControl(what)
511 //case EXIT : fooble();break;
518 Module modulePrelBase = findModule(findText("PrelBase"));
519 assert(nonNull(modulePrelBase));
520 fprintf(stderr, "linkControl(POSTPREL)\n");
521 setCurrModule(modulePrelude);
524 linkPrimitiveNames();
526 nameUnpackString = linkName("hugsprimUnpackString");
527 namePMFail = linkName("hugsprimPmFail");
528 assert(nonNull(namePMFail));
529 #define xyzzy(aaa,bbb) aaa = linkName(bbb)
533 pFun(nameSel, "_SEL");
535 /* strict constructors */
536 xyzzy(nameFlip, "flip" );
539 xyzzy(nameFromTo, "enumFromTo");
540 xyzzy(nameFromThenTo, "enumFromThenTo");
541 xyzzy(nameFrom, "enumFrom");
542 xyzzy(nameFromThen, "enumFromThen");
545 xyzzy(nameApp, "++");
546 xyzzy(nameReadField, "hugsprimReadField");
547 xyzzy(nameReadParen, "readParen");
548 xyzzy(nameShowField, "hugsprimShowField");
549 xyzzy(nameShowParen, "showParen");
550 xyzzy(nameLex, "lex");
551 xyzzy(nameComp, ".");
552 xyzzy(nameAnd, "&&");
553 xyzzy(nameCompAux, "hugsprimCompAux");
554 xyzzy(nameMap, "map");
556 /* implementTagToCon */
557 xyzzy(nameError, "hugsprimError");
559 typeStable = linkTycon("Stable");
560 typeRef = linkTycon("IORef");
561 // {Prim,PrimByte,PrimMutable,PrimMutableByte}Array ?
563 ifLinkConstrItbl ( nameFalse );
564 ifLinkConstrItbl ( nameTrue );
565 ifLinkConstrItbl ( nameNil );
566 ifLinkConstrItbl ( nameCons );
568 /* PrelErr.hi doesn't give a type for error, alas.
569 So error never appears in any symbol table.
570 So we fake it by copying the table entry for
571 hugsprimError -- which is just a call to error.
572 Although we put it on the Prelude export list, we
573 have to claim internally that it lives in PrelErr,
574 so that the correct symbol (PrelErr_error_closure)
578 nm = newName ( findText("error"), NIL );
579 name(nm) = name(nameError);
580 name(nm).mod = findModule(findText("PrelErr"));
581 name(nm).text = findText("error");
582 setCurrModule(modulePrelude);
583 module(modulePrelude).exports
584 = cons ( nm, module(modulePrelude).exports );
586 /* The GHC prelude doesn't seem to export Addr. Add it to the
587 export list for the sake of compatibility with standalone mode.
589 module(modulePrelude).exports
590 = cons ( pair(typeAddr,DOTDOT),
591 module(modulePrelude).exports );
594 /* Make nameListMonad be the builder fn for instance Monad [].
595 Standalone hugs does this with a disgusting hack in
596 checkInstDefn() in static.c. We have a slightly different
597 disgusting hack for the combined case.
600 Class cm; /* :: Class */
601 List is; /* :: [Inst] */
602 cm = findClassInAnyModule(findText("Monad"));
604 is = cclass(cm).instances;
606 while (nonNull(is) && snd(inst(hd(is)).head) != typeList)
609 nameListMonad = inst(hd(is)).builder;
610 assert(nonNull(nameListMonad));
618 Module modulePrelBase;
620 modulePrelude = findFakeModule(textPrelude);
621 module(modulePrelude).objectExtraNames
622 = singleton(findText("libHS_cbits"));
624 nameMkC = addWiredInBoxingTycon("PrelBase", "Char", "C#",CHAR_REP, STAR );
625 nameMkI = addWiredInBoxingTycon("PrelBase", "Int", "I#",INT_REP, STAR );
626 nameMkW = addWiredInBoxingTycon("PrelAddr", "Word", "W#",WORD_REP, STAR );
627 nameMkA = addWiredInBoxingTycon("PrelAddr", "Addr", "A#",ADDR_REP, STAR );
628 nameMkF = addWiredInBoxingTycon("PrelFloat","Float", "F#",FLOAT_REP, STAR );
629 nameMkD = addWiredInBoxingTycon("PrelFloat","Double","D#",DOUBLE_REP, STAR );
631 = addWiredInBoxingTycon("PrelNum","Integer","Integer#",0 ,STAR );
633 = addWiredInBoxingTycon("PrelGHC","ByteArray","PrimByteArray#",0 ,STAR );
635 for (i=0; i<NUM_TUPLES; ++i) {
636 if (i != 1) addTupleTycon(i);
638 addWiredInEnumTycon("PrelBase","Bool",
639 doubleton(findText("False"),findText("True")));
642 // = addWiredInBoxingTycon("PrelConc","ThreadId","ThreadId#"
643 // ,1,0,THREADID_REP);
645 setCurrModule(modulePrelude);
647 typeArrow = addPrimTycon(findText("(->)"),
648 pair(STAR,pair(STAR,STAR)),
652 pFun(nameInd, "_indirect");
653 name(nameInd).number = DFUNNAME;
655 /* newtype and USE_NEWTYPE_FOR_DICTS */
656 /* make a name entry for PrelBase.id _before_ loading Prelude
657 since ifSetClassDefaultsAndDCon() may need to refer to
660 modulePrelBase = findModule(findText("PrelBase"));
661 setCurrModule(modulePrelBase);
663 setCurrModule(modulePrelude);
667 modulePrelude = newModule(textPrelude);
668 setCurrModule(modulePrelude);
670 for (i=0; i<NUM_TUPLES; ++i) {
671 if (i != 1) addTupleTycon(i);
673 setCurrModule(modulePrelude);
675 typeArrow = addPrimTycon(findText("(->)"),
676 pair(STAR,pair(STAR,STAR)),
679 /* newtype and USE_NEWTYPE_FOR_DICTS */
683 pFun(nameInd, "_indirect");
684 name(nameInd).number = DFUNNAME;
687 pFun(nameSel, "_SEL");
689 /* strict constructors */
690 pFun(nameFlip, "flip" );
693 pFun(nameFromTo, "enumFromTo");
694 pFun(nameFromThenTo, "enumFromThenTo");
695 pFun(nameFrom, "enumFrom");
696 pFun(nameFromThen, "enumFromThen");
700 pFun(nameReadField, "hugsprimReadField");
701 pFun(nameReadParen, "readParen");
702 pFun(nameShowField, "hugsprimShowField");
703 pFun(nameShowParen, "showParen");
704 pFun(nameLex, "lex");
707 pFun(nameCompAux, "hugsprimCompAux");
708 pFun(nameMap, "map");
710 /* implementTagToCon */
711 pFun(namePMFail, "hugsprimPmFail");
712 pFun(nameError, "error");
713 pFun(nameUnpackString, "hugsprimUnpackString");
715 /* hooks for handwritten bytecode */
716 pFun(namePrimSeq, "primSeq");
717 pFun(namePrimCatch, "primCatch");
718 pFun(namePrimRaise, "primRaise");
719 pFun(namePrimTakeMVar, "primTakeMVar");
721 StgVar vv = mkStgVar(NIL,NIL);
722 Name n = namePrimSeq;
726 vv = mkStgVar(NIL,NIL);
727 stgVarInfo(vv) = mkPtr ( asm_BCO_seq() );
729 stgGlobals=cons(pair(n,vv),stgGlobals);
733 StgVar vv = mkStgVar(NIL,NIL);
734 Name n = namePrimCatch;
738 stgVarInfo(vv) = mkPtr ( asm_BCO_catch() );
740 stgGlobals=cons(pair(n,vv),stgGlobals);
743 StgVar vv = mkStgVar(NIL,NIL);
744 Name n = namePrimRaise;
748 stgVarInfo(vv) = mkPtr ( asm_BCO_raise() );
750 stgGlobals=cons(pair(n,vv),stgGlobals);
753 StgVar vv = mkStgVar(NIL,NIL);
754 Name n = namePrimTakeMVar;
758 stgVarInfo(vv) = mkPtr ( asm_BCO_takeMVar() );
760 stgGlobals=cons(pair(n,vv),stgGlobals);
768 //#include "fooble.c"
769 /*-------------------------------------------------------------------------*/