[project @ 2000-03-07 06:24:23 by andy]
[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.46 $
13  * $Date: 2000/03/07 06:24:23 $
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         nameMFail        = linkName("fail");
415         nameLe           = linkName("<=");
416         nameGt           = linkName(">");
417         nameShowsPrec    = linkName("showsPrec");
418         nameReadsPrec    = linkName("readsPrec");
419         nameEQ           = linkName("EQ");
420         nameCompare      = linkName("compare");
421         nameMinBnd       = linkName("minBound");
422         nameMaxBnd       = linkName("maxBound");
423         nameRange        = linkName("range");
424         nameIndex        = linkName("index");
425         namePlus         = linkName("+");
426         nameMult         = linkName("*");
427         nameRangeSize    = linkName("rangeSize");
428         nameInRange      = linkName("inRange");
429         nameMinus        = linkName("-");
430         /* These come before calls to implementPrim */
431         if (!combined) {
432            for(i=0; i<NUM_TUPLES; ++i) {
433                if (i != 1) implementTuple(i);
434            }
435         }
436     }
437 }
438
439 Void linkPreludeNames(void) {           /* Hook to names defined in Prelude */
440     static Bool initialised = FALSE;
441     if (!initialised) {
442         Int i;
443         initialised = TRUE;
444
445         setCurrModule(modulePrelude);
446
447         /* primops */
448         nameMkIO           = linkName("hugsprimMkIO");
449
450         if (!combined) {
451            for (i=0; asmPrimOps[i].name; ++i) {
452                Text t = findText(asmPrimOps[i].name);
453                Name n = findName(t);
454                if (isNull(n)) {
455                    n = newName(t,NIL);
456                }
457                name(n).line   = 0;
458                name(n).defn   = NIL;
459                name(n).type   = primType(asmPrimOps[i].monad,
460                                          asmPrimOps[i].args,
461                                          asmPrimOps[i].results);
462                name(n).arity  = strlen(asmPrimOps[i].args);
463                name(n).primop = &(asmPrimOps[i]);
464                implementPrim(n);
465            }
466         }
467         /* static(tidyInfix)                        */
468         nameNegate         = linkName("negate");
469         /* user interface                           */
470         nameRunIO_toplevel = linkName("hugsprimRunIO_toplevel");
471         nameShow           = linkName("show");
472         namePutStr         = linkName("putStr");
473         namePrint          = linkName("print");
474         /* desugar                                  */
475         nameOtherwise      = linkName("otherwise");
476         nameUndefined      = linkName("undefined");
477         /* pmc                                      */
478 #       if NPLUSK                      
479         namePmSub          = linkName("hugsprimPmSub");
480 #       endif                          
481         /* translator                               */
482         nameEqChar         = linkName("hugsprimEqChar");
483         nameCreateAdjThunk = linkName("hugsprimCreateAdjThunk");
484         namePmInt          = linkName("hugsprimPmInt");
485         namePmInteger      = linkName("hugsprimPmInteger");
486         namePmDouble       = linkName("hugsprimPmDouble");
487
488         nameFromDouble     = linkName("fromDouble");
489         namePmFromInteger = linkName("hugsprimPmFromInteger");
490
491         namePmSubtract    = linkName("hugsprimPmSubtract");
492         namePmLe          = linkName("hugsprimPmLe");
493
494         if (!combined) {
495            implementCfun ( nameCons, NIL );
496            implementCfun ( nameNil, NIL );
497            implementCfun ( nameUnit, NIL );
498         }
499     }
500 }
501
502
503 /* --------------------------------------------------------------------------
504  * 
505  * ------------------------------------------------------------------------*/
506
507 /* ToDo: fix pFun (or eliminate its use) */
508 #define pFun(n,s) n = predefinePrim(s)
509
510 Void linkControl(what)
511 Int what; {
512     Int i;
513     switch (what) {
514       //case EXIT : fooble();break;
515         case RESET   :
516         case MARK    : 
517                        break;
518
519         case POSTPREL: {
520            Name nm;
521            Module modulePrelBase = findModule(findText("PrelBase"));
522            assert(nonNull(modulePrelBase));
523            fprintf(stderr, "linkControl(POSTPREL)\n");
524            setCurrModule(modulePrelude);
525            linkPreludeTC();
526            linkPreludeCM();
527            linkPreludeNames();
528
529            nameUnpackString = linkName("hugsprimUnpackString");
530            namePMFail       = linkName("hugsprimPmFail");
531 assert(nonNull(namePMFail));
532 #define xyzzy(aaa,bbb) aaa = linkName(bbb)
533
534
535                /* pmc                                   */
536                pFun(nameSel,            "_SEL");
537
538                /* strict constructors                   */
539                xyzzy(nameFlip,           "flip"     );
540
541                /* parser                                */
542                xyzzy(nameFromTo,         "enumFromTo");
543                xyzzy(nameFromThenTo,     "enumFromThenTo");
544                xyzzy(nameFrom,           "enumFrom");
545                xyzzy(nameFromThen,       "enumFromThen");
546
547                /* deriving                              */
548                xyzzy(nameApp,            "++");
549                xyzzy(nameReadField,      "hugsprimReadField");
550                xyzzy(nameReadParen,      "readParen");
551                xyzzy(nameShowField,      "hugsprimShowField");
552                xyzzy(nameShowParen,      "showParen");
553                xyzzy(nameLex,            "lex");
554                xyzzy(nameComp,           ".");
555                xyzzy(nameAnd,            "&&");
556                xyzzy(nameCompAux,        "hugsprimCompAux");
557                xyzzy(nameMap,            "map");
558
559                /* implementTagToCon                     */
560                xyzzy(nameError,          "hugsprimError");
561
562            typeStable = linkTycon("Stable");
563            typeRef    = linkTycon("IORef");
564            // {Prim,PrimByte,PrimMutable,PrimMutableByte}Array ?
565
566            ifLinkConstrItbl ( nameFalse );
567            ifLinkConstrItbl ( nameTrue );
568            ifLinkConstrItbl ( nameNil );
569            ifLinkConstrItbl ( nameCons );
570
571            /* PrelErr.hi doesn't give a type for error, alas.  
572               So error never appears in any symbol table.
573               So we fake it by copying the table entry for
574               hugsprimError -- which is just a call to error.
575               Although we put it on the Prelude export list, we
576               have to claim internally that it lives in PrelErr, 
577               so that the correct symbol (PrelErr_error_closure)
578               is referred to.
579               Big Big Sigh.
580            */
581            nm            = newName ( findText("error"), NIL );
582            name(nm)      = name(nameError);
583            name(nm).mod  = findModule(findText("PrelErr"));
584            name(nm).text = findText("error");
585            setCurrModule(modulePrelude);
586            module(modulePrelude).exports
587               = cons ( nm, module(modulePrelude).exports );
588
589            /* The GHC prelude doesn't seem to export Addr.  Add it to the
590               export list for the sake of compatibility with standalone mode.
591            */
592            module(modulePrelude).exports
593               = cons ( pair(typeAddr,DOTDOT), 
594                        module(modulePrelude).exports );
595            addTycon(typeAddr);
596
597            /* Make nameListMonad be the builder fn for instance Monad [].
598               Standalone hugs does this with a disgusting hack in 
599               checkInstDefn() in static.c.  We have a slightly different
600               disgusting hack for the combined case.
601            */
602            {
603            Class cm;   /* :: Class   */
604            List  is;   /* :: [Inst]  */
605            cm = findClassInAnyModule(findText("Monad"));
606            assert(nonNull(cm));
607            is = cclass(cm).instances;
608            assert(nonNull(is));
609            while (nonNull(is) && snd(inst(hd(is)).head) != typeList)
610               is = tl(is);
611            assert(nonNull(is));
612            nameListMonad = inst(hd(is)).builder;
613            assert(nonNull(nameListMonad));
614            }
615
616            break;
617         }
618         case PREPREL : 
619
620            if (combined) {
621                Module modulePrelBase;
622
623                modulePrelude = findFakeModule(textPrelude);
624                module(modulePrelude).objectExtraNames 
625                   = singleton(findText("libHS_cbits"));
626
627                nameMkC = addWiredInBoxingTycon("PrelBase", "Char",  "C#",CHAR_REP,   STAR );
628                nameMkI = addWiredInBoxingTycon("PrelBase", "Int",   "I#",INT_REP,    STAR );
629                nameMkW = addWiredInBoxingTycon("PrelAddr", "Word",  "W#",WORD_REP,   STAR );
630                nameMkA = addWiredInBoxingTycon("PrelAddr", "Addr",  "A#",ADDR_REP,   STAR );
631                nameMkF = addWiredInBoxingTycon("PrelFloat","Float", "F#",FLOAT_REP,  STAR );
632                nameMkD = addWiredInBoxingTycon("PrelFloat","Double","D#",DOUBLE_REP, STAR );
633                nameMkInteger            
634                        = addWiredInBoxingTycon("PrelNum","Integer","Integer#",0 ,STAR );
635                nameMkPrimByteArray      
636                        = addWiredInBoxingTycon("PrelGHC","ByteArray","PrimByteArray#",0 ,STAR );
637
638                for (i=0; i<NUM_TUPLES; ++i) {
639                    if (i != 1) addTupleTycon(i);
640                }
641                addWiredInEnumTycon("PrelBase","Bool",
642                                    doubleton(findText("False"),findText("True")));
643
644                //nameMkThreadId
645                //        = addWiredInBoxingTycon("PrelConc","ThreadId","ThreadId#"
646                //                                ,1,0,THREADID_REP);
647
648                setCurrModule(modulePrelude);
649
650                typeArrow = addPrimTycon(findText("(->)"),
651                                         pair(STAR,pair(STAR,STAR)),
652                                         2,DATATYPE,NIL);
653
654                /* desugaring                            */
655                pFun(nameInd,            "_indirect");
656                name(nameInd).number = DFUNNAME;
657
658                /* newtype and USE_NEWTYPE_FOR_DICTS     */
659                /* make a name entry for PrelBase.id _before_ loading Prelude
660                   since ifSetClassDefaultsAndDCon() may need to refer to
661                   nameId. 
662                */
663                modulePrelBase = findModule(findText("PrelBase"));
664                setCurrModule(modulePrelBase);
665                pFun(nameId,             "id");
666                setCurrModule(modulePrelude);
667
668            } else {
669
670                modulePrelude = newModule(textPrelude);
671                setCurrModule(modulePrelude);
672         
673                for (i=0; i<NUM_TUPLES; ++i) {
674                    if (i != 1) addTupleTycon(i);
675                }
676                setCurrModule(modulePrelude);
677
678                typeArrow = addPrimTycon(findText("(->)"),
679                                         pair(STAR,pair(STAR,STAR)),
680                                         2,DATATYPE,NIL);
681
682                /* newtype and USE_NEWTYPE_FOR_DICTS     */
683                pFun(nameId,             "id");
684
685                /* desugaring                            */
686                pFun(nameInd,            "_indirect");
687                name(nameInd).number = DFUNNAME;
688
689                /* pmc                                   */
690                pFun(nameSel,            "_SEL");
691
692                /* strict constructors                   */
693                pFun(nameFlip,           "flip"     );
694
695                /* parser                                */
696                pFun(nameFromTo,         "enumFromTo");
697                pFun(nameFromThenTo,     "enumFromThenTo");
698                pFun(nameFrom,           "enumFrom");
699                pFun(nameFromThen,       "enumFromThen");
700
701                /* deriving                              */
702                pFun(nameApp,            "++");
703                pFun(nameReadField,      "hugsprimReadField");
704                pFun(nameReadParen,      "readParen");
705                pFun(nameShowField,      "hugsprimShowField");
706                pFun(nameShowParen,      "showParen");
707                pFun(nameLex,            "lex");
708                pFun(nameComp,           ".");
709                pFun(nameAnd,            "&&");
710                pFun(nameCompAux,        "hugsprimCompAux");
711                pFun(nameMap,            "map");
712
713                /* implementTagToCon                     */
714                pFun(namePMFail,         "hugsprimPmFail");
715                pFun(nameError,          "error");
716                pFun(nameUnpackString,   "hugsprimUnpackString");
717
718                /* hooks for handwritten bytecode */
719                pFun(namePrimSeq,        "primSeq");
720                pFun(namePrimCatch,      "primCatch");
721                pFun(namePrimRaise,      "primRaise");
722                pFun(namePrimTakeMVar,   "primTakeMVar");
723                {
724                   StgVar vv = mkStgVar(NIL,NIL);
725                   Name n = namePrimSeq;
726                   name(n).line = 0;
727                   name(n).arity = 1;
728                   name(n).type = NIL;
729                   vv = mkStgVar(NIL,NIL);
730                   stgVarInfo(vv) = mkPtr ( asm_BCO_seq() );
731                   name(n).stgVar = vv;
732                   stgGlobals=cons(pair(n,vv),stgGlobals);
733                   namePrimSeq = n;
734                }
735                {
736                   StgVar vv = mkStgVar(NIL,NIL);
737                   Name n = namePrimCatch;
738                   name(n).line = 0;
739                   name(n).arity = 2;
740                   name(n).type = NIL;
741                   stgVarInfo(vv) = mkPtr ( asm_BCO_catch() );
742                   name(n).stgVar = vv;
743                   stgGlobals=cons(pair(n,vv),stgGlobals);
744                }
745                {
746                   StgVar vv = mkStgVar(NIL,NIL);
747                   Name n = namePrimRaise;
748                   name(n).line = 0;
749                   name(n).arity = 1;
750                   name(n).type = NIL;
751                   stgVarInfo(vv) = mkPtr ( asm_BCO_raise() );
752                   name(n).stgVar = vv;
753                   stgGlobals=cons(pair(n,vv),stgGlobals);
754                }
755                {
756                   StgVar vv = mkStgVar(NIL,NIL);
757                   Name n = namePrimTakeMVar;
758                   name(n).line = 0;
759                   name(n).arity = 2;
760                   name(n).type = NIL;
761                   stgVarInfo(vv) = mkPtr ( asm_BCO_takeMVar() );
762                   name(n).stgVar = vv;
763                   stgGlobals=cons(pair(n,vv),stgGlobals);
764                }
765            }
766            break;
767     }
768 }
769 #undef pFun
770
771 //#include "fooble.c"
772 /*-------------------------------------------------------------------------*/