d15a756c98f19f7bde2f907182c59bd89085fec0
[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.43 $
13  * $Date: 2000/02/14 11:13:11 $
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            /* Make nameListMonad be the builder fn for instance Monad [].
589               Standalone hugs does this with a disgusting hack in 
590               checkInstDefn() in static.c.  We have a slightly different
591               disgusting hack for the combined case.
592            */
593            {
594            Class cm;   /* :: Class   */
595            List  is;   /* :: [Inst]  */
596            cm = findClassInAnyModule(findText("Monad"));
597            assert(nonNull(cm));
598            is = cclass(cm).instances;
599            assert(nonNull(is));
600            while (nonNull(is) && snd(inst(hd(is)).head) != typeList)
601               is = tl(is);
602            assert(nonNull(is));
603            nameListMonad = inst(hd(is)).builder;
604            assert(nonNull(nameListMonad));
605            }
606
607            break;
608         }
609         case PREPREL : 
610
611            if (combined) {
612                Module modulePrelBase;
613
614                modulePrelude = findFakeModule(textPrelude);
615                module(modulePrelude).objectExtraNames 
616                   = singleton(findText("libHS_cbits"));
617
618                nameMkC = addWiredInBoxingTycon("PrelBase", "Char",  "C#",CHAR_REP,   STAR );
619                nameMkI = addWiredInBoxingTycon("PrelBase", "Int",   "I#",INT_REP,    STAR );
620                nameMkW = addWiredInBoxingTycon("PrelAddr", "Word",  "W#",WORD_REP,   STAR );
621                nameMkA = addWiredInBoxingTycon("PrelAddr", "Addr",  "A#",ADDR_REP,   STAR );
622                nameMkF = addWiredInBoxingTycon("PrelFloat","Float", "F#",FLOAT_REP,  STAR );
623                nameMkD = addWiredInBoxingTycon("PrelFloat","Double","D#",DOUBLE_REP, STAR );
624                nameMkInteger            
625                        = addWiredInBoxingTycon("PrelNum","Integer","Integer#",0 ,STAR );
626                nameMkPrimByteArray      
627                        = addWiredInBoxingTycon("PrelGHC","ByteArray","PrimByteArray#",0 ,STAR );
628
629                for (i=0; i<NUM_TUPLES; ++i) {
630                    if (i != 1) addTupleTycon(i);
631                }
632                addWiredInEnumTycon("PrelBase","Bool",
633                                    doubleton(findText("False"),findText("True")));
634
635                //nameMkThreadId
636                //        = addWiredInBoxingTycon("PrelConc","ThreadId","ThreadId#"
637                //                                ,1,0,THREADID_REP);
638
639                setCurrModule(modulePrelude);
640
641                typeArrow = addPrimTycon(findText("(->)"),
642                                         pair(STAR,pair(STAR,STAR)),
643                                         2,DATATYPE,NIL);
644
645                /* desugaring                            */
646                pFun(nameInd,            "_indirect");
647                name(nameInd).number = DFUNNAME;
648
649                /* newtype and USE_NEWTYPE_FOR_DICTS     */
650                /* make a name entry for PrelBase.id _before_ loading Prelude
651                   since ifSetClassDefaultsAndDCon() may need to refer to
652                   nameId. 
653                */
654                modulePrelBase = findModule(findText("PrelBase"));
655                setCurrModule(modulePrelBase);
656                pFun(nameId,             "id");
657                setCurrModule(modulePrelude);
658
659            } else {
660
661                modulePrelude = newModule(textPrelude);
662                setCurrModule(modulePrelude);
663         
664                for (i=0; i<NUM_TUPLES; ++i) {
665                    if (i != 1) addTupleTycon(i);
666                }
667                setCurrModule(modulePrelude);
668
669                typeArrow = addPrimTycon(findText("(->)"),
670                                         pair(STAR,pair(STAR,STAR)),
671                                         2,DATATYPE,NIL);
672
673                /* newtype and USE_NEWTYPE_FOR_DICTS     */
674                pFun(nameId,             "id");
675
676                /* desugaring                            */
677                pFun(nameInd,            "_indirect");
678                name(nameInd).number = DFUNNAME;
679
680                /* pmc                                   */
681                pFun(nameSel,            "_SEL");
682
683                /* strict constructors                   */
684                pFun(nameFlip,           "flip"     );
685
686                /* parser                                */
687                pFun(nameFromTo,         "enumFromTo");
688                pFun(nameFromThenTo,     "enumFromThenTo");
689                pFun(nameFrom,           "enumFrom");
690                pFun(nameFromThen,       "enumFromThen");
691
692                /* deriving                              */
693                pFun(nameApp,            "++");
694                pFun(nameReadField,      "hugsprimReadField");
695                pFun(nameReadParen,      "readParen");
696                pFun(nameShowField,      "hugsprimShowField");
697                pFun(nameShowParen,      "showParen");
698                pFun(nameLex,            "lex");
699                pFun(nameComp,           ".");
700                pFun(nameAnd,            "&&");
701                pFun(nameCompAux,        "hugsprimCompAux");
702                pFun(nameMap,            "map");
703
704                /* implementTagToCon                     */
705                pFun(namePMFail,         "hugsprimPmFail");
706                pFun(nameError,          "error");
707                pFun(nameUnpackString,   "hugsprimUnpackString");
708
709                /* hooks for handwritten bytecode */
710                pFun(namePrimSeq,        "primSeq");
711                pFun(namePrimCatch,      "primCatch");
712                pFun(namePrimRaise,      "primRaise");
713                pFun(namePrimTakeMVar,   "primTakeMVar");
714                {
715                   StgVar vv = mkStgVar(NIL,NIL);
716                   Name n = namePrimSeq;
717                   name(n).line = 0;
718                   name(n).arity = 1;
719                   name(n).type = NIL;
720                   vv = mkStgVar(NIL,NIL);
721                   stgVarInfo(vv) = mkPtr ( asm_BCO_seq() );
722                   name(n).stgVar = vv;
723                   stgGlobals=cons(pair(n,vv),stgGlobals);
724                   namePrimSeq = n;
725                }
726                {
727                   StgVar vv = mkStgVar(NIL,NIL);
728                   Name n = namePrimCatch;
729                   name(n).line = 0;
730                   name(n).arity = 2;
731                   name(n).type = NIL;
732                   stgVarInfo(vv) = mkPtr ( asm_BCO_catch() );
733                   name(n).stgVar = vv;
734                   stgGlobals=cons(pair(n,vv),stgGlobals);
735                }
736                {
737                   StgVar vv = mkStgVar(NIL,NIL);
738                   Name n = namePrimRaise;
739                   name(n).line = 0;
740                   name(n).arity = 1;
741                   name(n).type = NIL;
742                   stgVarInfo(vv) = mkPtr ( asm_BCO_raise() );
743                   name(n).stgVar = vv;
744                   stgGlobals=cons(pair(n,vv),stgGlobals);
745                }
746                {
747                   StgVar vv = mkStgVar(NIL,NIL);
748                   Name n = namePrimTakeMVar;
749                   name(n).line = 0;
750                   name(n).arity = 2;
751                   name(n).type = NIL;
752                   stgVarInfo(vv) = mkPtr ( asm_BCO_takeMVar() );
753                   name(n).stgVar = vv;
754                   stgGlobals=cons(pair(n,vv),stgGlobals);
755                }
756            }
757            break;
758     }
759 }
760 #undef pFun
761
762 #include "fooble.c"
763 /*-------------------------------------------------------------------------*/