[project @ 2000-02-29 12:27:35 by sewardj]
[ghc-hetmet.git] / ghc / interpreter / link.c
1
2 /* --------------------------------------------------------------------------
3  * Load symbols required from the Prelude
4  *
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.
10  *
11  * $RCSfile: link.c,v $
12  * $Revision: 1.45 $
13  * $Date: 2000/02/29 12:27:35 $
14  * ------------------------------------------------------------------------*/
15
16 #include "prelude.h"
17 #include "storage.h"
18 #include "backend.h"
19 #include "connect.h"
20 #include "errors.h"
21 #include "Assembler.h" /* for asmPrimOps and AsmReps */
22
23 #include "link.h"
24
25
26 Type typeArrow;                         /* Function spaces                 */
27
28 Type typeChar;
29 Type typeInt;
30 Type typeInteger;
31 Type typeWord;
32 Type typeAddr;
33 Type typePrimArray;            
34 Type typePrimByteArray;
35 Type typeRef;                  
36 Type typePrimMutableArray;     
37 Type typePrimMutableByteArray; 
38 Type typeFloat;
39 Type typeDouble;
40 Type typeStable;
41 Type typeThreadId;
42 Type typeMVar;
43 #ifdef PROVIDE_WEAK
44 Type typeWeak;
45 #endif
46 #ifdef PROVIDE_FOREIGN
47 Type typeForeign;
48 #endif
49
50 Type typeList;
51 Type typeUnit;
52 Type typeString;
53 Type typeBool;
54 Type typeST;
55 Type typeIO;
56 Type typeException;
57
58 Class classEq;                          /* `standard' classes              */
59 Class classOrd;
60 Class classShow;
61 Class classRead;
62 Class classIx;
63 Class classEnum;
64 Class classBounded;
65
66 Class classReal;                        /* `numeric' classes               */
67 Class classIntegral;
68 Class classRealFrac;
69 Class classRealFloat;
70 Class classFractional;
71 Class classFloating;
72 Class classNum;
73 Class classMonad;                       /* Monads and monads with a zero   */
74
75 List stdDefaults;                       /* standard default values         */
76
77 Name nameTrue;    
78 Name nameFalse;            /* primitive boolean constructors  */
79 Name nameNil;     
80 Name nameCons;             /* primitive list constructors     */
81 Name nameUnit;                          /* primitive Unit type constructor */
82
83 Name nameEq;    
84 Name nameFromInt;
85 Name nameFromDouble;       /* coercion of numerics            */
86 Name nameFromInteger;
87 Name nameReturn;  
88 Name nameBind;             /* for translating monad comps     */
89 Name nameZero;                          /* for monads with a zero          */
90
91 Name nameId;
92 Name nameShow;
93 Name namePutStr;
94 Name nameRunIO_toplevel;
95 Name namePrint;
96
97 Name nameOtherwise;
98 Name nameUndefined;                     /* generic undefined value         */
99 #if NPLUSK
100 Name namePmSub; 
101 #endif
102 Name namePMFail;
103 Name nameEqChar;
104 Name namePmInt;
105 Name namePmInteger;
106 Name namePmDouble;
107 Name namePmLe;
108 Name namePmSubtract;
109 Name namePmFromInteger;
110 Name nameMkIO;
111 Name nameUnpackString;
112 Name nameError;
113 Name nameInd;
114 Name nameCreateAdjThunk;
115
116 Name nameAnd;
117 Name nameCompAux;
118 Name nameRangeSize;
119 Name nameComp;
120 Name nameShowField;
121 Name nameApp;
122 Name nameShowParen;
123 Name nameReadParen;
124 Name nameLex;
125 Name nameReadField;
126 Name nameFlip;
127
128 Name namePrimSeq;
129 Name namePrimCatch;
130 Name namePrimRaise;
131 Name namePrimTakeMVar;
132
133 Name nameFromTo;
134 Name nameFromThen;
135 Name nameFrom;
136 Name nameFromThenTo;
137 Name nameNegate;
138
139 /* these names are required before we've had a chance to do the right thing */
140 Name nameSel;
141 Name nameUnsafeUnpackCString;
142
143 /* constructors used during translation and codegen */
144 Name nameMkC;                           /* Char#        -> Char           */
145 Name nameMkI;                           /* Int#         -> Int            */
146 Name nameMkInteger;                     /* Integer#     -> Integer        */
147 Name nameMkW;                           /* Word#        -> Word           */
148 Name nameMkA;                           /* Addr#        -> Addr            */
149 Name nameMkF;                           /* Float#       -> Float           */
150 Name nameMkD;                           /* Double#      -> Double          */
151 Name nameMkPrimArray;            
152 Name nameMkPrimByteArray;
153 Name nameMkRef;                  
154 Name nameMkPrimMutableArray;     
155 Name nameMkPrimMutableByteArray; 
156 Name nameMkStable;                      /* StablePtr# a -> StablePtr a     */
157 Name nameMkThreadId;                    /* ThreadId#    -> ThreadId        */
158 Name nameMkPrimMVar;                    /* MVar# a      -> MVar a          */
159 #ifdef PROVIDE_WEAK
160 Name nameMkWeak;                        /* Weak# a      -> Weak a          */
161 #endif
162 #ifdef PROVIDE_FOREIGN
163 Name nameMkForeign;                     /* ForeignObj#  -> ForeignObj      */
164 #endif
165
166
167
168 Name nameMinBnd;
169 Name nameMaxBnd;
170 Name nameCompare;
171 Name nameShowsPrec;
172 Name nameIndex;
173 Name nameReadsPrec; 
174 Name nameRange;
175 Name nameEQ;
176 Name nameInRange;
177 Name nameGt;
178 Name nameLe;
179 Name namePlus;
180 Name nameMult;
181 Name nameMFail;
182 Type typeOrdering;
183 Module modulePrelude;
184 Name nameMap;
185 Name nameMinus;
186
187
188 /* --------------------------------------------------------------------------
189  * Frequently used type skeletons:
190  * ------------------------------------------------------------------------*/
191
192 Type  arrow;                     /* mkOffset(0) -> mkOffset(1)      */
193 Type  boundPair;                 /* (mkOffset(0),mkOffset(0))       */
194 Type  listof;                    /* [ mkOffset(0) ]                 */
195 Type  typeVarToVar;              /* mkOffset(0) -> mkOffset(0)      */
196
197 Cell  predNum;                   /* Num (mkOffset(0))               */
198 Cell  predFractional;            /* Fractional (mkOffset(0))        */
199 Cell  predIntegral;              /* Integral (mkOffset(0))          */
200 Kind  starToStar;                /* Type -> Type                    */
201 Cell  predMonad;                 /* Monad (mkOffset(0))             */
202 Type  typeProgIO;                /* IO a                            */
203
204
205 /* --------------------------------------------------------------------------
206  * 
207  * ------------------------------------------------------------------------*/
208
209 static Tycon linkTycon ( String s );
210 static Tycon linkClass ( String s );
211 static Name  linkName  ( String s );
212 static Name  predefinePrim ( String s );
213
214
215 static Tycon linkTycon( String s )
216 {
217     Tycon tc = findTycon(findText(s));
218     if (nonNull(tc)) return tc;
219     if (combined) {
220        tc = findTyconInAnyModule(findText(s));
221        if (nonNull(tc)) return tc;
222     }
223 fprintf(stderr, "frambozenvla!  unknown tycon %s\n", s );
224 return NIL;
225     ERRMSG(0) "Prelude does not define standard type \"%s\"", s
226     EEND;
227 }
228
229 static Class linkClass( String s )
230 {
231     Class cc = findClass(findText(s));
232     if (nonNull(cc)) return cc;
233     if (combined) {
234        cc = findClassInAnyModule(findText(s));
235        if (nonNull(cc)) return cc;
236     }   
237 fprintf(stderr, "frambozenvla!  unknown class %s\n", s );
238 return NIL;
239     ERRMSG(0) "Prelude does not define standard class \"%s\"", s
240     EEND;
241 }
242
243 static Name linkName( String s )
244 {
245     Name n = findName(findText(s));
246     if (nonNull(n)) return n;
247     if (combined) {
248        n = findNameInAnyModule(findText(s));
249        if (nonNull(n)) return n;
250     }   
251 fprintf(stderr, "frambozenvla!  unknown  name %s\n", s );
252 return NIL;
253     ERRMSG(0) "Prelude does not define standard name \"%s\"", s
254     EEND;
255 }
256
257 static Name predefinePrim ( String s )
258 {
259     Name nm;
260     Text t = findText(s);
261     nm = findName(t);
262     if (nonNull(nm)) {
263        //fprintf(stderr, "predefinePrim: %s already exists\n", s );
264     } else {
265        nm = newName(t,NIL);
266        name(nm).defn=PREDEFINED;
267     }
268     return nm;
269 }
270
271
272 /* --------------------------------------------------------------------------
273  * 
274  * ------------------------------------------------------------------------*/
275
276 /* In standalone mode, linkPreludeTC, linkPreludeCM and linkPreludeNames
277    are called, in that order, during static analysis of Prelude.hs.
278    In combined mode such an analysis does not happen.  Instead these
279    calls will be made as a result of a call link(POSTPREL).
280
281    linkPreludeTC, linkPreludeCM and linkPreludeNames are needed in both
282    standalone and combined modes.
283 */
284
285
286 Void linkPreludeTC(void) {              /* Hook to tycons and classes in   */
287     static Bool initialised = FALSE;    /* prelude when first loaded       */
288     if (!initialised) {
289         Int i;
290         initialised = TRUE;
291         setCurrModule(modulePrelude);
292
293         typeChar                 = linkTycon("Char");
294         typeInt                  = linkTycon("Int");
295         typeInteger              = linkTycon("Integer");
296         typeWord                 = linkTycon("Word");
297         typeAddr                 = linkTycon("Addr");
298         typePrimArray            = linkTycon("PrimArray");
299         typePrimByteArray        = linkTycon("PrimByteArray");
300         typeRef                  = linkTycon("STRef");
301         typePrimMutableArray     = linkTycon("PrimMutableArray");
302         typePrimMutableByteArray = linkTycon("PrimMutableByteArray");
303         typeFloat                = linkTycon("Float");
304         typeDouble               = linkTycon("Double");
305         typeStable               = linkTycon("StablePtr");
306 #       ifdef PROVIDE_WEAK
307         typeWeak                 = linkTycon("Weak");
308 #       endif
309 #       ifdef PROVIDE_FOREIGN
310         typeForeign              = linkTycon("ForeignObj");
311 #       endif
312         typeThreadId             = linkTycon("ThreadId");
313         typeMVar                 = linkTycon("MVar");
314         typeBool                 = linkTycon("Bool");
315         typeST                   = linkTycon("ST");
316         typeIO                   = linkTycon("IO");
317         typeException            = linkTycon("Exception");
318         typeString               = linkTycon("String");
319         typeOrdering             = linkTycon("Ordering");
320
321         classEq                  = linkClass("Eq");
322         classOrd                 = linkClass("Ord");
323         classIx                  = linkClass("Ix");
324         classEnum                = linkClass("Enum");
325         classShow                = linkClass("Show");
326         classRead                = linkClass("Read");
327         classBounded             = linkClass("Bounded");
328         classReal                = linkClass("Real");
329         classIntegral            = linkClass("Integral");
330         classRealFrac            = linkClass("RealFrac");
331         classRealFloat           = linkClass("RealFloat");
332         classFractional          = linkClass("Fractional");
333         classFloating            = linkClass("Floating");
334         classNum                 = linkClass("Num");
335         classMonad               = linkClass("Monad");
336
337         stdDefaults              = NIL;
338         stdDefaults              = cons(typeDouble,stdDefaults);
339 #       if DEFAULT_BIGNUM
340         stdDefaults              = cons(typeInteger,stdDefaults);
341 #       else
342         stdDefaults              = cons(typeInt,stdDefaults);
343 #       endif
344
345         predNum                  = ap(classNum,aVar);
346         predFractional           = ap(classFractional,aVar);
347         predIntegral             = ap(classIntegral,aVar);
348         predMonad                = ap(classMonad,aVar);
349         typeProgIO               = ap(typeIO,aVar);
350
351         nameMkC                  = addPrimCfunREP(findText("C#"),1,0,CHAR_REP);
352         nameMkI                  = addPrimCfunREP(findText("I#"),1,0,INT_REP);
353         nameMkW                  = addPrimCfunREP(findText("W#"),1,0,WORD_REP);
354         nameMkA                  = addPrimCfunREP(findText("A#"),1,0,ADDR_REP);
355         nameMkF                  = addPrimCfunREP(findText("F#"),1,0,FLOAT_REP);
356         nameMkD                  = addPrimCfunREP(findText("D#"),1,0,DOUBLE_REP);
357         nameMkStable             = addPrimCfunREP(findText("Stable#"),1,0,STABLE_REP);
358         nameMkThreadId           = addPrimCfunREP(findText("ThreadId#"),1,0,THREADID_REP);
359
360 #       ifdef PROVIDE_FOREIGN
361         nameMkForeign            = addPrimCfunREP(findText("Foreign#"),1,0,0);
362 #       endif
363 #       ifdef PROVIDE_WEAK
364         nameMkWeak               = addPrimCfunREP(findText("Weak#"),1,0,0);
365 #       endif
366         nameMkPrimArray          = addPrimCfunREP(findText("PrimArray#"),1,0,0);
367         nameMkPrimByteArray      = addPrimCfunREP(findText("PrimByteArray#"),1,0,0);
368         nameMkRef                = addPrimCfunREP(findText("STRef#"),1,0,0);
369         nameMkPrimMutableArray   = addPrimCfunREP(findText("PrimMutableArray#"),1,0,0);
370         nameMkPrimMutableByteArray = addPrimCfunREP(findText("PrimMutableByteArray#"),1,0,0);
371         nameMkPrimMVar           = addPrimCfunREP(findText("MVar#"),1,0,0);
372         nameMkInteger            = addPrimCfunREP(findText("Integer#"),1,0,0);
373
374         name(namePrimSeq).type   = primType(MONAD_Id, "ab", "b");
375         name(namePrimCatch).type = primType(MONAD_Id, "aH", "a");
376         name(namePrimRaise).type = primType(MONAD_Id, "E", "a");
377
378         /* This is a lie.  For a more accurate type of primTakeMVar
379            see ghc/interpreter/lib/Prelude.hs.
380         */
381         name(namePrimTakeMVar).type = primType(MONAD_Id, "rbc", "d");
382
383         if (!combined) {
384            for (i=2; i<=NUM_DTUPLES; i++) {/* Add derived instances of tuples */
385                addTupInst(classEq,i);
386                addTupInst(classOrd,i);
387                addTupInst(classIx,i);
388                addTupInst(classShow,i);
389                addTupInst(classRead,i);
390                addTupInst(classBounded,i);
391            }
392         }
393     }
394 }
395
396 Void linkPreludeCM(void) {              /* Hook to cfuns and mfuns in      */
397     static Bool initialised = FALSE;    /* prelude when first loaded       */
398     if (!initialised) {
399         Int i;
400         initialised = TRUE;
401
402         setCurrModule(modulePrelude);
403
404         /* constructors */
405         nameFalse        = linkName("False");
406         nameTrue         = linkName("True");
407
408         /* members */
409         nameEq           = linkName("==");
410         nameFromInt      = linkName("fromInt");
411         nameFromInteger  = linkName("fromInteger");
412         nameReturn       = linkName("return");
413         nameBind         = linkName(">>=");
414         nameLe           = linkName("<=");
415         nameGt           = linkName(">");
416         nameShowsPrec    = linkName("showsPrec");
417         nameReadsPrec    = linkName("readsPrec");
418         nameEQ           = linkName("EQ");
419         nameCompare      = linkName("compare");
420         nameMinBnd       = linkName("minBound");
421         nameMaxBnd       = linkName("maxBound");
422         nameRange        = linkName("range");
423         nameIndex        = linkName("index");
424         namePlus         = linkName("+");
425         nameMult         = linkName("*");
426         nameRangeSize    = linkName("rangeSize");
427         nameInRange      = linkName("inRange");
428         nameMinus        = linkName("-");
429         /* These come before calls to implementPrim */
430         if (!combined) {
431            for(i=0; i<NUM_TUPLES; ++i) {
432                if (i != 1) implementTuple(i);
433            }
434         }
435     }
436 }
437
438 Void linkPreludeNames(void) {           /* Hook to names defined in Prelude */
439     static Bool initialised = FALSE;
440     if (!initialised) {
441         Int i;
442         initialised = TRUE;
443
444         setCurrModule(modulePrelude);
445
446         /* primops */
447         nameMkIO           = linkName("hugsprimMkIO");
448
449         if (!combined) {
450            for (i=0; asmPrimOps[i].name; ++i) {
451                Text t = findText(asmPrimOps[i].name);
452                Name n = findName(t);
453                if (isNull(n)) {
454                    n = newName(t,NIL);
455                }
456                name(n).line   = 0;
457                name(n).defn   = NIL;
458                name(n).type   = primType(asmPrimOps[i].monad,
459                                          asmPrimOps[i].args,
460                                          asmPrimOps[i].results);
461                name(n).arity  = strlen(asmPrimOps[i].args);
462                name(n).primop = &(asmPrimOps[i]);
463                implementPrim(n);
464            }
465         }
466         /* static(tidyInfix)                        */
467         nameNegate         = linkName("negate");
468         /* user interface                           */
469         nameRunIO_toplevel = linkName("hugsprimRunIO_toplevel");
470         nameShow           = linkName("show");
471         namePutStr         = linkName("putStr");
472         namePrint          = linkName("print");
473         /* desugar                                  */
474         nameOtherwise      = linkName("otherwise");
475         nameUndefined      = linkName("undefined");
476         /* pmc                                      */
477 #       if NPLUSK                      
478         namePmSub          = linkName("hugsprimPmSub");
479 #       endif                          
480         /* translator                               */
481         nameEqChar         = linkName("hugsprimEqChar");
482         nameCreateAdjThunk = linkName("hugsprimCreateAdjThunk");
483         namePmInt          = linkName("hugsprimPmInt");
484         namePmInteger      = linkName("hugsprimPmInteger");
485         namePmDouble       = linkName("hugsprimPmDouble");
486
487         nameFromDouble     = linkName("fromDouble");
488         namePmFromInteger = linkName("hugsprimPmFromInteger");
489
490         namePmSubtract    = linkName("hugsprimPmSubtract");
491         namePmLe          = linkName("hugsprimPmLe");
492
493         if (!combined) {
494            implementCfun ( nameCons, NIL );
495            implementCfun ( nameNil, NIL );
496            implementCfun ( nameUnit, NIL );
497         }
498     }
499 }
500
501
502 /* --------------------------------------------------------------------------
503  * 
504  * ------------------------------------------------------------------------*/
505
506 /* ToDo: fix pFun (or eliminate its use) */
507 #define pFun(n,s) n = predefinePrim(s)
508
509 Void linkControl(what)
510 Int what; {
511     Int i;
512     switch (what) {
513       //case EXIT : fooble();break;
514         case RESET   :
515         case MARK    : 
516                        break;
517
518         case POSTPREL: {
519            Name nm;
520            Module modulePrelBase = findModule(findText("PrelBase"));
521            assert(nonNull(modulePrelBase));
522            fprintf(stderr, "linkControl(POSTPREL)\n");
523            setCurrModule(modulePrelude);
524            linkPreludeTC();
525            linkPreludeCM();
526            linkPreludeNames();
527
528            nameUnpackString = linkName("hugsprimUnpackString");
529            namePMFail       = linkName("hugsprimPmFail");
530 assert(nonNull(namePMFail));
531 #define xyzzy(aaa,bbb) aaa = linkName(bbb)
532
533
534                /* pmc                                   */
535                pFun(nameSel,            "_SEL");
536
537                /* strict constructors                   */
538                xyzzy(nameFlip,           "flip"     );
539
540                /* parser                                */
541                xyzzy(nameFromTo,         "enumFromTo");
542                xyzzy(nameFromThenTo,     "enumFromThenTo");
543                xyzzy(nameFrom,           "enumFrom");
544                xyzzy(nameFromThen,       "enumFromThen");
545
546                /* deriving                              */
547                xyzzy(nameApp,            "++");
548                xyzzy(nameReadField,      "hugsprimReadField");
549                xyzzy(nameReadParen,      "readParen");
550                xyzzy(nameShowField,      "hugsprimShowField");
551                xyzzy(nameShowParen,      "showParen");
552                xyzzy(nameLex,            "lex");
553                xyzzy(nameComp,           ".");
554                xyzzy(nameAnd,            "&&");
555                xyzzy(nameCompAux,        "hugsprimCompAux");
556                xyzzy(nameMap,            "map");
557
558                /* implementTagToCon                     */
559                xyzzy(nameError,          "hugsprimError");
560
561            typeStable = linkTycon("Stable");
562            typeRef    = linkTycon("IORef");
563            // {Prim,PrimByte,PrimMutable,PrimMutableByte}Array ?
564
565            ifLinkConstrItbl ( nameFalse );
566            ifLinkConstrItbl ( nameTrue );
567            ifLinkConstrItbl ( nameNil );
568            ifLinkConstrItbl ( nameCons );
569
570            /* PrelErr.hi doesn't give a type for error, alas.  
571               So error never appears in any symbol table.
572               So we fake it by copying the table entry for
573               hugsprimError -- which is just a call to error.
574               Although we put it on the Prelude export list, we
575               have to claim internally that it lives in PrelErr, 
576               so that the correct symbol (PrelErr_error_closure)
577               is referred to.
578               Big Big Sigh.
579            */
580            nm            = newName ( findText("error"), NIL );
581            name(nm)      = name(nameError);
582            name(nm).mod  = findModule(findText("PrelErr"));
583            name(nm).text = findText("error");
584            setCurrModule(modulePrelude);
585            module(modulePrelude).exports
586               = cons ( nm, module(modulePrelude).exports );
587
588            /* The GHC prelude doesn't seem to export Addr.  Add it to the
589               export list for the sake of compatibility with standalone mode.
590            */
591            module(modulePrelude).exports
592               = cons ( pair(typeAddr,DOTDOT), 
593                        module(modulePrelude).exports );
594            addTycon(typeAddr);
595
596            /* Make nameListMonad be the builder fn for instance Monad [].
597               Standalone hugs does this with a disgusting hack in 
598               checkInstDefn() in static.c.  We have a slightly different
599               disgusting hack for the combined case.
600            */
601            {
602            Class cm;   /* :: Class   */
603            List  is;   /* :: [Inst]  */
604            cm = findClassInAnyModule(findText("Monad"));
605            assert(nonNull(cm));
606            is = cclass(cm).instances;
607            assert(nonNull(is));
608            while (nonNull(is) && snd(inst(hd(is)).head) != typeList)
609               is = tl(is);
610            assert(nonNull(is));
611            nameListMonad = inst(hd(is)).builder;
612            assert(nonNull(nameListMonad));
613            }
614
615            break;
616         }
617         case PREPREL : 
618
619            if (combined) {
620                Module modulePrelBase;
621
622                modulePrelude = findFakeModule(textPrelude);
623                module(modulePrelude).objectExtraNames 
624                   = singleton(findText("libHS_cbits"));
625
626                nameMkC = addWiredInBoxingTycon("PrelBase", "Char",  "C#",CHAR_REP,   STAR );
627                nameMkI = addWiredInBoxingTycon("PrelBase", "Int",   "I#",INT_REP,    STAR );
628                nameMkW = addWiredInBoxingTycon("PrelAddr", "Word",  "W#",WORD_REP,   STAR );
629                nameMkA = addWiredInBoxingTycon("PrelAddr", "Addr",  "A#",ADDR_REP,   STAR );
630                nameMkF = addWiredInBoxingTycon("PrelFloat","Float", "F#",FLOAT_REP,  STAR );
631                nameMkD = addWiredInBoxingTycon("PrelFloat","Double","D#",DOUBLE_REP, STAR );
632                nameMkInteger            
633                        = addWiredInBoxingTycon("PrelNum","Integer","Integer#",0 ,STAR );
634                nameMkPrimByteArray      
635                        = addWiredInBoxingTycon("PrelGHC","ByteArray","PrimByteArray#",0 ,STAR );
636
637                for (i=0; i<NUM_TUPLES; ++i) {
638                    if (i != 1) addTupleTycon(i);
639                }
640                addWiredInEnumTycon("PrelBase","Bool",
641                                    doubleton(findText("False"),findText("True")));
642
643                //nameMkThreadId
644                //        = addWiredInBoxingTycon("PrelConc","ThreadId","ThreadId#"
645                //                                ,1,0,THREADID_REP);
646
647                setCurrModule(modulePrelude);
648
649                typeArrow = addPrimTycon(findText("(->)"),
650                                         pair(STAR,pair(STAR,STAR)),
651                                         2,DATATYPE,NIL);
652
653                /* desugaring                            */
654                pFun(nameInd,            "_indirect");
655                name(nameInd).number = DFUNNAME;
656
657                /* newtype and USE_NEWTYPE_FOR_DICTS     */
658                /* make a name entry for PrelBase.id _before_ loading Prelude
659                   since ifSetClassDefaultsAndDCon() may need to refer to
660                   nameId. 
661                */
662                modulePrelBase = findModule(findText("PrelBase"));
663                setCurrModule(modulePrelBase);
664                pFun(nameId,             "id");
665                setCurrModule(modulePrelude);
666
667            } else {
668
669                modulePrelude = newModule(textPrelude);
670                setCurrModule(modulePrelude);
671         
672                for (i=0; i<NUM_TUPLES; ++i) {
673                    if (i != 1) addTupleTycon(i);
674                }
675                setCurrModule(modulePrelude);
676
677                typeArrow = addPrimTycon(findText("(->)"),
678                                         pair(STAR,pair(STAR,STAR)),
679                                         2,DATATYPE,NIL);
680
681                /* newtype and USE_NEWTYPE_FOR_DICTS     */
682                pFun(nameId,             "id");
683
684                /* desugaring                            */
685                pFun(nameInd,            "_indirect");
686                name(nameInd).number = DFUNNAME;
687
688                /* pmc                                   */
689                pFun(nameSel,            "_SEL");
690
691                /* strict constructors                   */
692                pFun(nameFlip,           "flip"     );
693
694                /* parser                                */
695                pFun(nameFromTo,         "enumFromTo");
696                pFun(nameFromThenTo,     "enumFromThenTo");
697                pFun(nameFrom,           "enumFrom");
698                pFun(nameFromThen,       "enumFromThen");
699
700                /* deriving                              */
701                pFun(nameApp,            "++");
702                pFun(nameReadField,      "hugsprimReadField");
703                pFun(nameReadParen,      "readParen");
704                pFun(nameShowField,      "hugsprimShowField");
705                pFun(nameShowParen,      "showParen");
706                pFun(nameLex,            "lex");
707                pFun(nameComp,           ".");
708                pFun(nameAnd,            "&&");
709                pFun(nameCompAux,        "hugsprimCompAux");
710                pFun(nameMap,            "map");
711
712                /* implementTagToCon                     */
713                pFun(namePMFail,         "hugsprimPmFail");
714                pFun(nameError,          "error");
715                pFun(nameUnpackString,   "hugsprimUnpackString");
716
717                /* hooks for handwritten bytecode */
718                pFun(namePrimSeq,        "primSeq");
719                pFun(namePrimCatch,      "primCatch");
720                pFun(namePrimRaise,      "primRaise");
721                pFun(namePrimTakeMVar,   "primTakeMVar");
722                {
723                   StgVar vv = mkStgVar(NIL,NIL);
724                   Name n = namePrimSeq;
725                   name(n).line = 0;
726                   name(n).arity = 1;
727                   name(n).type = NIL;
728                   vv = mkStgVar(NIL,NIL);
729                   stgVarInfo(vv) = mkPtr ( asm_BCO_seq() );
730                   name(n).stgVar = vv;
731                   stgGlobals=cons(pair(n,vv),stgGlobals);
732                   namePrimSeq = n;
733                }
734                {
735                   StgVar vv = mkStgVar(NIL,NIL);
736                   Name n = namePrimCatch;
737                   name(n).line = 0;
738                   name(n).arity = 2;
739                   name(n).type = NIL;
740                   stgVarInfo(vv) = mkPtr ( asm_BCO_catch() );
741                   name(n).stgVar = vv;
742                   stgGlobals=cons(pair(n,vv),stgGlobals);
743                }
744                {
745                   StgVar vv = mkStgVar(NIL,NIL);
746                   Name n = namePrimRaise;
747                   name(n).line = 0;
748                   name(n).arity = 1;
749                   name(n).type = NIL;
750                   stgVarInfo(vv) = mkPtr ( asm_BCO_raise() );
751                   name(n).stgVar = vv;
752                   stgGlobals=cons(pair(n,vv),stgGlobals);
753                }
754                {
755                   StgVar vv = mkStgVar(NIL,NIL);
756                   Name n = namePrimTakeMVar;
757                   name(n).line = 0;
758                   name(n).arity = 2;
759                   name(n).type = NIL;
760                   stgVarInfo(vv) = mkPtr ( asm_BCO_takeMVar() );
761                   name(n).stgVar = vv;
762                   stgGlobals=cons(pair(n,vv),stgGlobals);
763                }
764            }
765            break;
766     }
767 }
768 #undef pFun
769
770 //#include "fooble.c"
771 /*-------------------------------------------------------------------------*/