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 14:53:00 $
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 */
94 Name nameRunIO_toplevel;
98 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 */
203 /* --------------------------------------------------------------------------
205 * ------------------------------------------------------------------------*/
207 static Tycon linkTycon ( String s );
208 static Tycon linkClass ( String s );
209 static Name linkName ( String s );
210 static Name predefinePrim ( String s );
213 static Tycon linkTycon( String s )
215 Tycon tc = findTycon(findText(s));
216 if (nonNull(tc)) return tc;
218 tc = findTyconInAnyModule(findText(s));
219 if (nonNull(tc)) return tc;
221 fprintf(stderr, "frambozenvla! unknown tycon %s\n", s );
223 ERRMSG(0) "Prelude does not define standard type \"%s\"", s
227 static Class linkClass( String s )
229 Class cc = findClass(findText(s));
230 if (nonNull(cc)) return cc;
232 cc = findClassInAnyModule(findText(s));
233 if (nonNull(cc)) return cc;
235 fprintf(stderr, "frambozenvla! unknown class %s\n", s );
237 ERRMSG(0) "Prelude does not define standard class \"%s\"", s
241 static Name linkName( String s )
243 Name n = findName(findText(s));
244 if (nonNull(n)) return n;
246 n = findNameInAnyModule(findText(s));
247 if (nonNull(n)) return n;
249 fprintf(stderr, "frambozenvla! unknown name %s\n", s );
251 ERRMSG(0) "Prelude does not define standard name \"%s\"", s
255 static Name predefinePrim ( String s )
258 Text t = findText(s);
261 //fprintf(stderr, "predefinePrim: %s already exists\n", s );
264 name(nm).defn=PREDEFINED;
270 /* --------------------------------------------------------------------------
272 * ------------------------------------------------------------------------*/
274 /* In standalone mode, linkPreludeTC, linkPreludeCM and linkPrimitiveNames
275 are called, in that order, during static analysis of Prelude.hs.
276 In combined mode such an analysis does not happen. Instead these
277 calls will be made as a result of a call link(POSTPREL).
279 linkPreludeTC, linkPreludeCM and linkPreludeNames are needed in both
280 standalone and combined modes.
284 Void linkPreludeTC(void) { /* Hook to tycons and classes in */
285 static Bool initialised = FALSE; /* prelude when first loaded */
289 setCurrModule(modulePrelude);
291 typeChar = linkTycon("Char");
292 typeInt = linkTycon("Int");
293 typeInteger = linkTycon("Integer");
294 typeWord = linkTycon("Word");
295 typeAddr = linkTycon("Addr");
296 typePrimArray = linkTycon("PrimArray");
297 typePrimByteArray = linkTycon("PrimByteArray");
298 typeRef = linkTycon("STRef");
299 typePrimMutableArray = linkTycon("PrimMutableArray");
300 typePrimMutableByteArray = linkTycon("PrimMutableByteArray");
301 typeFloat = linkTycon("Float");
302 typeDouble = linkTycon("Double");
303 typeStable = linkTycon("StablePtr");
305 typeWeak = linkTycon("Weak");
307 # ifdef PROVIDE_FOREIGN
308 typeForeign = linkTycon("ForeignObj");
310 typeThreadId = linkTycon("ThreadId");
311 typeMVar = linkTycon("MVar");
312 typeBool = linkTycon("Bool");
313 typeST = linkTycon("ST");
314 typeIO = linkTycon("IO");
315 typeException = linkTycon("Exception");
316 typeString = linkTycon("String");
317 typeOrdering = linkTycon("Ordering");
319 classEq = linkClass("Eq");
320 classOrd = linkClass("Ord");
321 classIx = linkClass("Ix");
322 classEnum = linkClass("Enum");
323 classShow = linkClass("Show");
324 classRead = linkClass("Read");
325 classBounded = linkClass("Bounded");
326 classReal = linkClass("Real");
327 classIntegral = linkClass("Integral");
328 classRealFrac = linkClass("RealFrac");
329 classRealFloat = linkClass("RealFloat");
330 classFractional = linkClass("Fractional");
331 classFloating = linkClass("Floating");
332 classNum = linkClass("Num");
333 classMonad = linkClass("Monad");
336 stdDefaults = cons(typeDouble,stdDefaults);
338 stdDefaults = cons(typeInteger,stdDefaults);
340 stdDefaults = cons(typeInt,stdDefaults);
343 predNum = ap(classNum,aVar);
344 predFractional = ap(classFractional,aVar);
345 predIntegral = ap(classIntegral,aVar);
346 predMonad = ap(classMonad,aVar);
347 typeProgIO = ap(typeIO,aVar);
349 nameMkC = addPrimCfunREP(findText("C#"),1,0,CHAR_REP);
350 nameMkI = addPrimCfunREP(findText("I#"),1,0,INT_REP);
351 nameMkW = addPrimCfunREP(findText("W#"),1,0,WORD_REP);
352 nameMkA = addPrimCfunREP(findText("A#"),1,0,ADDR_REP);
353 nameMkF = addPrimCfunREP(findText("F#"),1,0,FLOAT_REP);
354 nameMkD = addPrimCfunREP(findText("D#"),1,0,DOUBLE_REP);
355 nameMkStable = addPrimCfunREP(findText("Stable#"),1,0,STABLE_REP);
356 nameMkThreadId = addPrimCfunREP(findText("ThreadId#"),1,0,THREADID_REP);
358 # ifdef PROVIDE_FOREIGN
359 nameMkForeign = addPrimCfunREP(findText("Foreign#"),1,0,0);
362 nameMkWeak = addPrimCfunREP(findText("Weak#"),1,0,0);
364 nameMkPrimArray = addPrimCfunREP(findText("PrimArray#"),1,0,0);
365 nameMkPrimByteArray = addPrimCfunREP(findText("PrimByteArray#"),1,0,0);
366 nameMkRef = addPrimCfunREP(findText("STRef#"),1,0,0);
367 nameMkPrimMutableArray = addPrimCfunREP(findText("PrimMutableArray#"),1,0,0);
368 nameMkPrimMutableByteArray = addPrimCfunREP(findText("PrimMutableByteArray#"),1,0,0);
369 nameMkPrimMVar = addPrimCfunREP(findText("MVar#"),1,0,0);
370 nameMkInteger = addPrimCfunREP(findText("Integer#"),1,0,0);
372 name(namePrimSeq).type = primType(MONAD_Id, "ab", "b");
373 name(namePrimCatch).type = primType(MONAD_Id, "aH", "a");
374 name(namePrimRaise).type = primType(MONAD_Id, "E", "a");
376 /* This is a lie. For a more accurate type of primTakeMVar
377 see ghc/interpreter/lib/Prelude.hs.
379 name(namePrimTakeMVar).type = primType(MONAD_Id, "rbc", "d");
382 for (i=2; i<=NUM_DTUPLES; i++) {/* Add derived instances of tuples */
383 addTupInst(classEq,i);
384 addTupInst(classOrd,i);
385 addTupInst(classIx,i);
386 addTupInst(classShow,i);
387 addTupInst(classRead,i);
388 addTupInst(classBounded,i);
394 Void linkPreludeCM(void) { /* Hook to cfuns and mfuns in */
395 static Bool initialised = FALSE; /* prelude when first loaded */
400 setCurrModule(modulePrelude);
403 nameFalse = linkName("False");
404 nameTrue = linkName("True");
407 nameEq = linkName("==");
408 nameFromInt = linkName("fromInt");
409 nameFromInteger = linkName("fromInteger");
410 nameReturn = linkName("return");
411 nameBind = linkName(">>=");
412 nameMFail = linkName("fail");
413 nameLe = linkName("<=");
414 nameGt = linkName(">");
415 nameShowsPrec = linkName("showsPrec");
416 nameReadsPrec = linkName("readsPrec");
417 nameEQ = linkName("EQ");
418 nameCompare = linkName("compare");
419 nameMinBnd = linkName("minBound");
420 nameMaxBnd = linkName("maxBound");
421 nameRange = linkName("range");
422 nameIndex = linkName("index");
423 namePlus = linkName("+");
424 nameMult = linkName("*");
425 nameRangeSize = linkName("rangeSize");
426 nameInRange = linkName("inRange");
427 nameMinus = linkName("-");
428 /* These come before calls to implementPrim */
430 for(i=0; i<NUM_TUPLES; ++i) {
431 if (i != 1) implementTuple(i);
437 Void linkPrimitiveNames(void) { /* Hook to names defined in Prelude */
438 static Bool initialised = FALSE;
443 setCurrModule(modulePrelude);
446 nameMkIO = linkName("hugsprimMkIO");
450 for (i=0; asmPrimOps[i].name; ++i) {
451 Text t = findText(asmPrimOps[i].name);
452 Name n = findName(t);
457 name(n).type = primType(asmPrimOps[i].monad,
459 asmPrimOps[i].results);
460 name(n).arity = strlen(asmPrimOps[i].args);
461 name(n).primop = &(asmPrimOps[i]);
464 ERRMSG(0) "Link Error in Prelude, surplus definition of \"%s\"",
467 // Name already defined!
472 /* static(tidyInfix) */
473 nameNegate = linkName("negate");
475 nameRunIO_toplevel = linkName("hugsprimRunIO_toplevel");
476 nameShow = linkName("show");
477 namePutStr = linkName("putStr");
478 namePrint = linkName("print");
480 nameOtherwise = linkName("otherwise");
481 nameUndefined = linkName("undefined");
483 namePmSub = linkName("hugsprimPmSub");
485 nameEqChar = linkName("hugsprimEqChar");
486 nameCreateAdjThunk = linkName("hugsprimCreateAdjThunk");
487 namePmInt = linkName("hugsprimPmInt");
488 namePmInteger = linkName("hugsprimPmInteger");
489 namePmDouble = linkName("hugsprimPmDouble");
491 nameFromDouble = linkName("fromDouble");
492 namePmFromInteger = linkName("hugsprimPmFromInteger");
494 namePmSubtract = linkName("hugsprimPmSubtract");
495 namePmLe = linkName("hugsprimPmLe");
498 implementCfun ( nameCons, NIL );
499 implementCfun ( nameNil, NIL );
500 implementCfun ( nameUnit, NIL );
506 /* --------------------------------------------------------------------------
508 * ------------------------------------------------------------------------*/
510 /* ToDo: fix pFun (or eliminate its use) */
511 #define pFun(n,s) n = predefinePrim(s)
513 Void linkControl(what)
517 //case EXIT : fooble();break;
524 Module modulePrelBase = findModule(findText("PrelBase"));
525 assert(nonNull(modulePrelBase));
526 fprintf(stderr, "linkControl(POSTPREL)\n");
527 setCurrModule(modulePrelude);
530 linkPrimitiveNames();
532 nameUnpackString = linkName("hugsprimUnpackString");
533 namePMFail = linkName("hugsprimPmFail");
534 assert(nonNull(namePMFail));
535 #define xyzzy(aaa,bbb) aaa = linkName(bbb)
539 pFun(nameSel, "_SEL");
541 /* strict constructors */
542 xyzzy(nameFlip, "flip" );
545 xyzzy(nameFromTo, "enumFromTo");
546 xyzzy(nameFromThenTo, "enumFromThenTo");
547 xyzzy(nameFrom, "enumFrom");
548 xyzzy(nameFromThen, "enumFromThen");
551 xyzzy(nameApp, "++");
552 xyzzy(nameReadField, "hugsprimReadField");
553 xyzzy(nameReadParen, "readParen");
554 xyzzy(nameShowField, "hugsprimShowField");
555 xyzzy(nameShowParen, "showParen");
556 xyzzy(nameLex, "lex");
557 xyzzy(nameComp, ".");
558 xyzzy(nameAnd, "&&");
559 xyzzy(nameCompAux, "hugsprimCompAux");
560 xyzzy(nameMap, "map");
562 /* implementTagToCon */
563 xyzzy(nameError, "hugsprimError");
565 typeStable = linkTycon("Stable");
566 typeRef = linkTycon("IORef");
567 // {Prim,PrimByte,PrimMutable,PrimMutableByte}Array ?
569 ifLinkConstrItbl ( nameFalse );
570 ifLinkConstrItbl ( nameTrue );
571 ifLinkConstrItbl ( nameNil );
572 ifLinkConstrItbl ( nameCons );
574 /* PrelErr.hi doesn't give a type for error, alas.
575 So error never appears in any symbol table.
576 So we fake it by copying the table entry for
577 hugsprimError -- which is just a call to error.
578 Although we put it on the Prelude export list, we
579 have to claim internally that it lives in PrelErr,
580 so that the correct symbol (PrelErr_error_closure)
584 nm = newName ( findText("error"), NIL );
585 name(nm) = name(nameError);
586 name(nm).mod = findModule(findText("PrelErr"));
587 name(nm).text = findText("error");
588 setCurrModule(modulePrelude);
589 module(modulePrelude).exports
590 = cons ( nm, module(modulePrelude).exports );
592 /* The GHC prelude doesn't seem to export Addr. Add it to the
593 export list for the sake of compatibility with standalone mode.
595 module(modulePrelude).exports
596 = cons ( pair(typeAddr,DOTDOT),
597 module(modulePrelude).exports );
600 /* Make nameListMonad be the builder fn for instance Monad [].
601 Standalone hugs does this with a disgusting hack in
602 checkInstDefn() in static.c. We have a slightly different
603 disgusting hack for the combined case.
606 Class cm; /* :: Class */
607 List is; /* :: [Inst] */
608 cm = findClassInAnyModule(findText("Monad"));
610 is = cclass(cm).instances;
612 while (nonNull(is) && snd(inst(hd(is)).head) != typeList)
615 nameListMonad = inst(hd(is)).builder;
616 assert(nonNull(nameListMonad));
624 Module modulePrelBase;
626 modulePrelude = findFakeModule(textPrelude);
627 module(modulePrelude).objectExtraNames
628 = singleton(findText("libHS_cbits"));
630 nameMkC = addWiredInBoxingTycon("PrelBase", "Char", "C#",CHAR_REP, STAR );
631 nameMkI = addWiredInBoxingTycon("PrelBase", "Int", "I#",INT_REP, STAR );
632 nameMkW = addWiredInBoxingTycon("PrelAddr", "Word", "W#",WORD_REP, STAR );
633 nameMkA = addWiredInBoxingTycon("PrelAddr", "Addr", "A#",ADDR_REP, STAR );
634 nameMkF = addWiredInBoxingTycon("PrelFloat","Float", "F#",FLOAT_REP, STAR );
635 nameMkD = addWiredInBoxingTycon("PrelFloat","Double","D#",DOUBLE_REP, STAR );
637 = addWiredInBoxingTycon("PrelNum","Integer","Integer#",0 ,STAR );
639 = addWiredInBoxingTycon("PrelGHC","ByteArray","PrimByteArray#",0 ,STAR );
641 for (i=0; i<NUM_TUPLES; ++i) {
642 if (i != 1) addTupleTycon(i);
644 addWiredInEnumTycon("PrelBase","Bool",
645 doubleton(findText("False"),findText("True")));
648 // = addWiredInBoxingTycon("PrelConc","ThreadId","ThreadId#"
649 // ,1,0,THREADID_REP);
651 setCurrModule(modulePrelude);
653 typeArrow = addPrimTycon(findText("(->)"),
654 pair(STAR,pair(STAR,STAR)),
658 pFun(nameInd, "_indirect");
659 name(nameInd).number = DFUNNAME;
661 /* newtype and USE_NEWTYPE_FOR_DICTS */
662 /* make a name entry for PrelBase.id _before_ loading Prelude
663 since ifSetClassDefaultsAndDCon() may need to refer to
666 modulePrelBase = findModule(findText("PrelBase"));
667 setCurrModule(modulePrelBase);
669 setCurrModule(modulePrelude);
673 modulePrelude = newModule(textPrelude);
674 setCurrModule(modulePrelude);
676 for (i=0; i<NUM_TUPLES; ++i) {
677 if (i != 1) addTupleTycon(i);
679 setCurrModule(modulePrelude);
681 typeArrow = addPrimTycon(findText("(->)"),
682 pair(STAR,pair(STAR,STAR)),
685 /* newtype and USE_NEWTYPE_FOR_DICTS */
689 pFun(nameInd, "_indirect");
690 name(nameInd).number = DFUNNAME;
693 pFun(nameSel, "_SEL");
695 /* strict constructors */
696 pFun(nameFlip, "flip" );
699 pFun(nameFromTo, "enumFromTo");
700 pFun(nameFromThenTo, "enumFromThenTo");
701 pFun(nameFrom, "enumFrom");
702 pFun(nameFromThen, "enumFromThen");
706 pFun(nameReadField, "hugsprimReadField");
707 pFun(nameReadParen, "readParen");
708 pFun(nameShowField, "hugsprimShowField");
709 pFun(nameShowParen, "showParen");
710 pFun(nameLex, "lex");
713 pFun(nameCompAux, "hugsprimCompAux");
714 pFun(nameMap, "map");
716 /* implementTagToCon */
717 pFun(namePMFail, "hugsprimPmFail");
718 pFun(nameError, "error");
719 pFun(nameUnpackString, "hugsprimUnpackString");
721 /* hooks for handwritten bytecode */
722 pFun(namePrimSeq, "primSeq");
723 pFun(namePrimCatch, "primCatch");
724 pFun(namePrimRaise, "primRaise");
725 pFun(namePrimTakeMVar, "primTakeMVar");
727 StgVar vv = mkStgVar(NIL,NIL);
728 Name n = namePrimSeq;
732 vv = mkStgVar(NIL,NIL);
733 stgVarInfo(vv) = mkPtr ( asm_BCO_seq() );
735 stgGlobals=cons(pair(n,vv),stgGlobals);
739 StgVar vv = mkStgVar(NIL,NIL);
740 Name n = namePrimCatch;
744 stgVarInfo(vv) = mkPtr ( asm_BCO_catch() );
746 stgGlobals=cons(pair(n,vv),stgGlobals);
749 StgVar vv = mkStgVar(NIL,NIL);
750 Name n = namePrimRaise;
754 stgVarInfo(vv) = mkPtr ( asm_BCO_raise() );
756 stgGlobals=cons(pair(n,vv),stgGlobals);
759 StgVar vv = mkStgVar(NIL,NIL);
760 Name n = namePrimTakeMVar;
764 stgVarInfo(vv) = mkPtr ( asm_BCO_takeMVar() );
766 stgGlobals=cons(pair(n,vv),stgGlobals);
774 //#include "fooble.c"
775 /*-------------------------------------------------------------------------*/