[project @ 2000-02-08 15:32:29 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.40 $
13  * $Date: 2000/02/08 15:32:30 $
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         nameFromDouble   = linkName("fromDouble");
413         nameReturn       = linkName("return");
414         nameBind         = linkName(">>=");
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         namePmFromInteger = linkName("hugsprimPmFromInteger");
489         namePmSubtract    = linkName("hugsprimPmSubtract");
490         namePmLe          = linkName("hugsprimPmLe");
491
492         if (!combined) {
493            implementCfun ( nameCons, NIL );
494            implementCfun ( nameNil, NIL );
495            implementCfun ( nameUnit, NIL );
496         }
497     }
498 }
499
500
501 /* --------------------------------------------------------------------------
502  * 
503  * ------------------------------------------------------------------------*/
504
505 /* ToDo: fix pFun (or eliminate its use) */
506 #define pFun(n,s) n = predefinePrim(s)
507
508 Void linkControl(what)
509 Int what; {
510     Int i;
511     switch (what) {
512       //case EXIT : fooble();break;
513         case RESET   :
514         case MARK    : 
515                        break;
516
517         case POSTPREL: {
518            Module modulePrelBase = findModule(findText("PrelBase"));
519            assert(nonNull(modulePrelBase));
520            fprintf(stderr, "linkControl(POSTPREL)\n");
521            setCurrModule(modulePrelude);
522            linkPreludeTC();
523            linkPreludeCM();
524            linkPreludeNames();
525
526            nameUnpackString = linkName("hugsprimUnpackString");
527            namePMFail       = linkName("hugsprimPmFail");
528 assert(nonNull(namePMFail));
529 #define xyzzy(aaa,bbb) aaa = linkName(bbb)
530
531
532                /* pmc                                   */
533                xyzzy(nameSel,            "_SEL");
534
535                /* strict constructors                   */
536                xyzzy(nameFlip,           "flip"     );
537
538                /* parser                                */
539                xyzzy(nameFromTo,         "enumFromTo");
540                xyzzy(nameFromThenTo,     "enumFromThenTo");
541                xyzzy(nameFrom,           "enumFrom");
542                xyzzy(nameFromThen,       "enumFromThen");
543
544                /* deriving                              */
545                xyzzy(nameApp,            "++");
546                xyzzy(nameReadField,      "readField");
547                xyzzy(nameReadParen,      "readParen");
548                xyzzy(nameShowField,      "showField");
549                xyzzy(nameShowParen,      "showParen");
550                xyzzy(nameLex,            "lex");
551                xyzzy(nameComp,           ".");
552                xyzzy(nameAnd,            "&&");
553                xyzzy(nameCompAux,        "hugsprimCompAux");
554                xyzzy(nameMap,            "map");
555
556                /* implementTagToCon                     */
557                xyzzy(nameError,          "hugsprimError");
558
559            typeStable = linkTycon("Stable");
560            typeRef    = linkTycon("IORef");
561            // {Prim,PrimByte,PrimMutable,PrimMutableByte}Array ?
562
563            ifLinkConstrItbl ( nameFalse );
564            ifLinkConstrItbl ( nameTrue );
565            ifLinkConstrItbl ( nameNil );
566            ifLinkConstrItbl ( nameCons );
567            break;
568         }
569         case PREPREL : 
570
571            if (combined) {
572                Module modulePrelBase;
573
574                modulePrelude = findFakeModule(textPrelude);
575                module(modulePrelude).objectExtraNames 
576                   = singleton(findText("libHS_cbits"));
577
578                nameMkC = addWiredInBoxingTycon("PrelBase", "Char",  "C#",CHAR_REP,   STAR );
579                nameMkI = addWiredInBoxingTycon("PrelBase", "Int",   "I#",INT_REP,    STAR );
580                nameMkW = addWiredInBoxingTycon("PrelAddr", "Word",  "W#",WORD_REP,   STAR );
581                nameMkA = addWiredInBoxingTycon("PrelAddr", "Addr",  "A#",ADDR_REP,   STAR );
582                nameMkF = addWiredInBoxingTycon("PrelFloat","Float", "F#",FLOAT_REP,  STAR );
583                nameMkD = addWiredInBoxingTycon("PrelFloat","Double","D#",DOUBLE_REP, STAR );
584                nameMkInteger            
585                        = addWiredInBoxingTycon("PrelNum","Integer","Integer#",0 ,STAR );
586                nameMkPrimByteArray      
587                        = addWiredInBoxingTycon("PrelGHC","ByteArray","PrimByteArray#",0 ,STAR );
588
589                for (i=0; i<NUM_TUPLES; ++i) {
590                    if (i != 1) addTupleTycon(i);
591                }
592                addWiredInEnumTycon("PrelBase","Bool",
593                                    doubleton(findText("False"),findText("True")));
594
595                //nameMkThreadId
596                //        = addWiredInBoxingTycon("PrelConc","ThreadId","ThreadId#"
597                //                                ,1,0,THREADID_REP);
598
599                setCurrModule(modulePrelude);
600
601                typeArrow = addPrimTycon(findText("(->)"),
602                                         pair(STAR,pair(STAR,STAR)),
603                                         2,DATATYPE,NIL);
604
605                /* desugaring                            */
606                pFun(nameInd,            "_indirect");
607                name(nameInd).number = DFUNNAME;
608
609                /* newtype and USE_NEWTYPE_FOR_DICTS     */
610                /* make a name entry for PrelBase.id _before_ loading Prelude
611                   since ifSetClassDefaultsAndDCon() may need to refer to
612                   nameId. 
613                */
614                modulePrelBase = findModule(findText("PrelBase"));
615                setCurrModule(modulePrelBase);
616                pFun(nameId,             "id");
617                setCurrModule(modulePrelude);
618
619            } else {
620
621                modulePrelude = newModule(textPrelude);
622                setCurrModule(modulePrelude);
623         
624                for (i=0; i<NUM_TUPLES; ++i) {
625                    if (i != 1) addTupleTycon(i);
626                }
627                setCurrModule(modulePrelude);
628
629                typeArrow = addPrimTycon(findText("(->)"),
630                                         pair(STAR,pair(STAR,STAR)),
631                                         2,DATATYPE,NIL);
632
633                /* newtype and USE_NEWTYPE_FOR_DICTS     */
634                pFun(nameId,             "id");
635
636                /* desugaring                            */
637                pFun(nameInd,            "_indirect");
638                name(nameInd).number = DFUNNAME;
639
640                /* pmc                                   */
641                pFun(nameSel,            "_SEL");
642
643                /* strict constructors                   */
644                pFun(nameFlip,           "flip"     );
645
646                /* parser                                */
647                pFun(nameFromTo,         "enumFromTo");
648                pFun(nameFromThenTo,     "enumFromThenTo");
649                pFun(nameFrom,           "enumFrom");
650                pFun(nameFromThen,       "enumFromThen");
651
652                /* deriving                              */
653                pFun(nameApp,            "++");
654                pFun(nameReadField,      "readField");
655                pFun(nameReadParen,      "readParen");
656                pFun(nameShowField,      "showField");
657                pFun(nameShowParen,      "showParen");
658                pFun(nameLex,            "lex");
659                pFun(nameComp,           ".");
660                pFun(nameAnd,            "&&");
661                pFun(nameCompAux,        "hugsprimCompAux");
662                pFun(nameMap,            "map");
663
664                /* implementTagToCon                     */
665                pFun(namePMFail,         "hugsprimPmFail");
666                pFun(nameError,          "error");
667                pFun(nameUnpackString,   "hugsprimUnpackString");
668
669                /* hooks for handwritten bytecode */
670                pFun(namePrimSeq,        "primSeq");
671                pFun(namePrimCatch,      "primCatch");
672                pFun(namePrimRaise,      "primRaise");
673                pFun(namePrimTakeMVar,   "primTakeMVar");
674                {
675                   StgVar vv = mkStgVar(NIL,NIL);
676                   Name n = namePrimSeq;
677                   name(n).line = 0;
678                   name(n).arity = 1;
679                   name(n).type = NIL;
680                   vv = mkStgVar(NIL,NIL);
681                   stgVarInfo(vv) = mkPtr ( asm_BCO_seq() );
682                   name(n).stgVar = vv;
683                   stgGlobals=cons(pair(n,vv),stgGlobals);
684                   namePrimSeq = n;
685                }
686                {
687                   StgVar vv = mkStgVar(NIL,NIL);
688                   Name n = namePrimCatch;
689                   name(n).line = 0;
690                   name(n).arity = 2;
691                   name(n).type = NIL;
692                   stgVarInfo(vv) = mkPtr ( asm_BCO_catch() );
693                   name(n).stgVar = vv;
694                   stgGlobals=cons(pair(n,vv),stgGlobals);
695                }
696                {
697                   StgVar vv = mkStgVar(NIL,NIL);
698                   Name n = namePrimRaise;
699                   name(n).line = 0;
700                   name(n).arity = 1;
701                   name(n).type = NIL;
702                   stgVarInfo(vv) = mkPtr ( asm_BCO_raise() );
703                   name(n).stgVar = vv;
704                   stgGlobals=cons(pair(n,vv),stgGlobals);
705                }
706                {
707                   StgVar vv = mkStgVar(NIL,NIL);
708                   Name n = namePrimTakeMVar;
709                   name(n).line = 0;
710                   name(n).arity = 2;
711                   name(n).type = NIL;
712                   stgVarInfo(vv) = mkPtr ( asm_BCO_takeMVar() );
713                   name(n).stgVar = vv;
714                   stgGlobals=cons(pair(n,vv),stgGlobals);
715                }
716            }
717            break;
718     }
719 }
720 #undef pFun
721
722 #include "fooble.c"
723 /*-------------------------------------------------------------------------*/