[project @ 2000-01-05 18:05:33 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.24 $
13  * $Date: 2000/01/05 18:05:34 $
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 nameRunIO;
93 Name namePrint;
94
95 Name nameOtherwise;
96 Name nameUndefined;                     /* generic undefined value         */
97 #if NPLUSK
98 Name namePmSub; 
99 #endif
100 Name namePMFail;
101 Name nameEqChar;
102 Name namePmInt;
103 Name namePmInteger;
104 Name namePmDouble;
105 Name namePmLe;
106 Name namePmSubtract;
107 Name namePmFromInteger;
108 Name nameMkIO;
109 Name nameUnpackString;
110 Name nameError;
111 Name nameInd;
112 Name nameCreateAdjThunk;
113
114 Name nameAnd;
115 Name nameCompAux;
116 Name nameRangeSize;
117 Name nameComp;
118 Name nameShowField;
119 Name nameApp;
120 Name nameShowParen;
121 Name nameReadParen;
122 Name nameLex;
123 Name nameReadField;
124 Name nameFlip;
125
126 Name namePrimSeq;
127 Name namePrimCatch;
128 Name namePrimRaise;
129 Name namePrimTakeMVar;
130
131 Name nameFromTo;
132 Name nameFromThen;
133 Name nameFrom;
134 Name nameFromThenTo;
135 Name nameNegate;
136
137 /* these names are required before we've had a chance to do the right thing */
138 Name nameSel;
139 Name nameUnsafeUnpackCString;
140
141 /* constructors used during translation and codegen */
142 Name nameMkC;                           /* Char#        -> Char           */
143 Name nameMkI;                           /* Int#         -> Int            */
144 Name nameMkInteger;                     /* Integer#     -> Integer        */
145 Name nameMkW;                           /* Word#        -> Word           */
146 Name nameMkA;                           /* Addr#        -> Addr            */
147 Name nameMkF;                           /* Float#       -> Float           */
148 Name nameMkD;                           /* Double#      -> Double          */
149 Name nameMkPrimArray;            
150 Name nameMkPrimByteArray;
151 Name nameMkRef;                  
152 Name nameMkPrimMutableArray;     
153 Name nameMkPrimMutableByteArray; 
154 Name nameMkStable;                      /* StablePtr# a -> StablePtr a     */
155 Name nameMkThreadId;                    /* ThreadId#    -> ThreadId        */
156 Name nameMkPrimMVar;                    /* MVar# a      -> MVar a          */
157 #ifdef PROVIDE_WEAK
158 Name nameMkWeak;                        /* Weak# a      -> Weak a          */
159 #endif
160 #ifdef PROVIDE_FOREIGN
161 Name nameMkForeign;                     /* ForeignObj#  -> ForeignObj      */
162 #endif
163
164
165
166 Name nameMinBnd;
167 Name nameMaxBnd;
168 Name nameCompare;
169 Name nameShowsPrec;
170 Name nameIndex;
171 Name nameReadsPrec; 
172 Name nameRange;
173 Name nameEQ;
174 Name nameInRange;
175 Name nameGt;
176 Name nameLe;
177 Name namePlus;
178 Name nameMult;
179 Name nameMFail;
180 Type typeOrdering;
181 Module modulePrelude;
182 Name nameMap;
183 Name nameMinus;
184
185
186 /* --------------------------------------------------------------------------
187  * Frequently used type skeletons:
188  * ------------------------------------------------------------------------*/
189
190 Type  arrow;                     /* mkOffset(0) -> mkOffset(1)      */
191 Type  boundPair;                 /* (mkOffset(0),mkOffset(0))       */
192 Type  listof;                    /* [ mkOffset(0) ]                 */
193 Type  typeVarToVar;              /* mkOffset(0) -> mkOffset(0)      */
194
195 Cell  predNum;                   /* Num (mkOffset(0))               */
196 Cell  predFractional;            /* Fractional (mkOffset(0))        */
197 Cell  predIntegral;              /* Integral (mkOffset(0))          */
198 Kind  starToStar;                /* Type -> Type                    */
199 Cell  predMonad;                 /* Monad (mkOffset(0))             */
200 Type  typeProgIO;                /* IO a                            */
201
202
203 /* --------------------------------------------------------------------------
204  * 
205  * ------------------------------------------------------------------------*/
206
207 static Tycon linkTycon ( String s );
208 static Tycon linkClass ( String s );
209 static Name  linkName  ( String s );
210 static Name  predefinePrim ( String s );
211
212
213 static Tycon linkTycon( String s )
214 {
215     Tycon tc = findTycon(findText(s));
216     if (nonNull(tc)) {
217         return tc;
218     }
219     ERRMSG(0) "Prelude does not define standard type \"%s\"", s
220     EEND;
221 }
222
223 static Class linkClass( String s )
224 {
225     Class cc = findClass(findText(s));
226     if (nonNull(cc)) {
227         return cc;
228     }
229     ERRMSG(0) "Prelude does not define standard class \"%s\"", s
230     EEND;
231 }
232
233 static Name linkName( String s )
234 {
235     Name n = findName(findText(s));
236     if (nonNull(n)) {
237         return n;
238     }
239     ERRMSG(0) "Prelude does not define standard name \"%s\"", s
240     EEND;
241 }
242
243 static Name predefinePrim ( String s )
244 {
245     Name nm;
246     Text t = findText(s);
247     nm = findName(t);
248     if (nonNull(nm)) {
249        //fprintf(stderr, "predefinePrim: %s already exists\n", s );
250     } else {
251        nm = newName(t,NIL);
252        name(nm).defn=PREDEFINED;
253     }
254     return nm;
255 }
256
257
258 /* --------------------------------------------------------------------------
259  * 
260  * ------------------------------------------------------------------------*/
261
262 /* In standalone mode, linkPreludeTC, linkPreludeCM and linkPreludeNames
263    are called, in that order, during static analysis of Prelude.hs.
264    In combined mode such an analysis does not happen.  Instead these
265    calls will be made as a result of a call link(POSTPREL).
266
267    linkPreludeTC, linkPreludeCM and linkPreludeNames are needed in both
268    standalone and combined modes.
269 */
270
271
272 Void linkPreludeTC(void) {              /* Hook to tycons and classes in   */
273     static Bool initialised = FALSE;    /* prelude when first loaded       */
274     if (!initialised) {
275         Int i;
276         initialised = TRUE;
277         setCurrModule(modulePrelude);
278
279         typeChar                 = linkTycon("Char");
280         typeInt                  = linkTycon("Int");
281         typeInteger              = linkTycon("Integer");
282         typeWord                 = linkTycon("Word");
283         typeAddr                 = linkTycon("Addr");
284         typePrimArray            = linkTycon("PrimArray");
285         typePrimByteArray        = linkTycon("PrimByteArray");
286         typeRef                  = linkTycon("STRef");
287         typePrimMutableArray     = linkTycon("PrimMutableArray");
288         typePrimMutableByteArray = linkTycon("PrimMutableByteArray");
289         typeFloat                = linkTycon("Float");
290         typeDouble               = linkTycon("Double");
291         typeStable               = linkTycon("StablePtr");
292 #       ifdef PROVIDE_WEAK
293         typeWeak                 = linkTycon("Weak");
294 #       endif
295 #       ifdef PROVIDE_FOREIGN
296         typeForeign              = linkTycon("ForeignObj");
297 #       endif
298         typeThreadId             = linkTycon("ThreadId");
299         typeMVar                 = linkTycon("MVar");
300         typeBool                 = linkTycon("Bool");
301         typeST                   = linkTycon("ST");
302         typeIO                   = linkTycon("IO");
303         typeException            = linkTycon("Exception");
304         typeString               = linkTycon("String");
305         typeOrdering             = linkTycon("Ordering");
306
307         classEq                  = linkClass("Eq");
308         classOrd                 = linkClass("Ord");
309         classIx                  = linkClass("Ix");
310         classEnum                = linkClass("Enum");
311         classShow                = linkClass("Show");
312         classRead                = linkClass("Read");
313         classBounded             = linkClass("Bounded");
314         classReal                = linkClass("Real");
315         classIntegral            = linkClass("Integral");
316         classRealFrac            = linkClass("RealFrac");
317         classRealFloat           = linkClass("RealFloat");
318         classFractional          = linkClass("Fractional");
319         classFloating            = linkClass("Floating");
320         classNum                 = linkClass("Num");
321         classMonad               = linkClass("Monad");
322
323         stdDefaults              = NIL;
324         stdDefaults              = cons(typeDouble,stdDefaults);
325 #       if DEFAULT_BIGNUM
326         stdDefaults              = cons(typeInteger,stdDefaults);
327 #       else
328         stdDefaults              = cons(typeInt,stdDefaults);
329 #       endif
330
331         predNum                  = ap(classNum,aVar);
332         predFractional           = ap(classFractional,aVar);
333         predIntegral             = ap(classIntegral,aVar);
334         predMonad                = ap(classMonad,aVar);
335         typeProgIO               = ap(typeIO,aVar);
336
337         nameMkC                  = addPrimCfunREP(findText("C#"),1,0,CHAR_REP);
338         nameMkI                  = addPrimCfunREP(findText("I#"),1,0,INT_REP);
339         nameMkW                  = addPrimCfunREP(findText("W#"),1,0,WORD_REP);
340         nameMkA                  = addPrimCfunREP(findText("A#"),1,0,ADDR_REP);
341         nameMkF                  = addPrimCfunREP(findText("F#"),1,0,FLOAT_REP);
342         nameMkD                  = addPrimCfunREP(findText("D#"),1,0,DOUBLE_REP);
343         nameMkStable             = addPrimCfunREP(findText("Stable#"),1,0,STABLE_REP);
344         nameMkThreadId           = addPrimCfunREP(findText("ThreadId#"),1,0,THREADID_REP);
345
346 #       ifdef PROVIDE_FOREIGN
347         nameMkForeign            = addPrimCfunREP(findText("Foreign#"),1,0,0);
348 #       endif
349 #       ifdef PROVIDE_WEAK
350         nameMkWeak               = addPrimCfunREP(findText("Weak#"),1,0,0);
351 #       endif
352         nameMkPrimArray          = addPrimCfunREP(findText("PrimArray#"),1,0,0);
353         nameMkPrimByteArray      = addPrimCfunREP(findText("PrimByteArray#"),1,0,0);
354         nameMkRef                = addPrimCfunREP(findText("STRef#"),1,0,0);
355         nameMkPrimMutableArray   = addPrimCfunREP(findText("PrimMutableArray#"),1,0,0);
356         nameMkPrimMutableByteArray = addPrimCfunREP(findText("PrimMutableByteArray#"),1,0,0);
357         nameMkPrimMVar           = addPrimCfunREP(findText("MVar#"),1,0,0);
358         nameMkInteger            = addPrimCfunREP(findText("Integer#"),1,0,0);
359
360         name(namePrimSeq).type   = primType(MONAD_Id, "ab", "b");
361         name(namePrimCatch).type = primType(MONAD_Id, "aH", "a");
362         name(namePrimRaise).type = primType(MONAD_Id, "E", "a");
363
364         /* This is a lie.  For a more accurate type of primTakeMVar
365            see ghc/interpreter/lib/Prelude.hs.
366         */
367         name(namePrimTakeMVar).type = primType(MONAD_Id, "rbc", "d");
368
369         for (i=2; i<=NUM_DTUPLES; i++) {/* Add derived instances of tuples */
370             addTupInst(classEq,i);
371             addTupInst(classOrd,i);
372             addTupInst(classIx,i);
373             addTupInst(classShow,i);
374             addTupInst(classRead,i);
375             addTupInst(classBounded,i);
376         }
377     }
378 }
379
380 Void linkPreludeCM(void) {              /* Hook to cfuns and mfuns in      */
381     static Bool initialised = FALSE;    /* prelude when first loaded       */
382     if (!initialised) {
383         Int i;
384         initialised = TRUE;
385
386         setCurrModule(modulePrelude);
387
388         /* constructors */
389         nameFalse        = linkName("False");
390         nameTrue         = linkName("True");
391
392         /* members */
393         nameEq           = linkName("==");
394         nameFromInt      = linkName("fromInt");
395         nameFromInteger  = linkName("fromInteger");
396         nameFromDouble   = linkName("fromDouble");
397         nameReturn       = linkName("return");
398         nameBind         = linkName(">>=");
399         nameLe           = linkName("<=");
400         nameGt           = linkName(">");
401         nameShowsPrec    = linkName("showsPrec");
402         nameReadsPrec    = linkName("readsPrec");
403         nameEQ           = linkName("EQ");
404         nameCompare      = linkName("compare");
405         nameMinBnd       = linkName("minBound");
406         nameMaxBnd       = linkName("maxBound");
407         nameRange        = linkName("range");
408         nameIndex        = linkName("index");
409         namePlus         = linkName("+");
410         nameMult         = linkName("*");
411         nameRangeSize    = linkName("rangeSize");
412         nameInRange      = linkName("inRange");
413         nameMinus        = linkName("-");
414         /* These come before calls to implementPrim */
415         for(i=0; i<NUM_TUPLES; ++i) {
416             implementTuple(i);
417         }
418     }
419 }
420
421 Void linkPreludeNames(void) {           /* Hook to names defined in Prelude */
422     static Bool initialised = FALSE;
423     if (!initialised) {
424         Int i;
425         initialised = TRUE;
426
427         setCurrModule(modulePrelude);
428
429         /* primops */
430         nameMkIO           = linkName("primMkIO");
431         for (i=0; asmPrimOps[i].name; ++i) {
432             Text t = findText(asmPrimOps[i].name);
433             Name n = findName(t);
434             if (isNull(n)) {
435                 n = newName(t,NIL);
436             }
437             name(n).line   = 0;
438             name(n).defn   = NIL;
439             name(n).type   = primType(asmPrimOps[i].monad,
440                                       asmPrimOps[i].args,
441                                       asmPrimOps[i].results);
442             name(n).arity  = strlen(asmPrimOps[i].args);
443             name(n).primop = &(asmPrimOps[i]);
444             implementPrim(n);
445         }
446
447         /* static(tidyInfix)                        */
448         nameNegate         = linkName("negate");
449         /* user interface                           */
450         nameRunIO          = linkName("primRunIO_hugs_toplevel");
451         namePrint          = linkName("print");
452         /* desugar                                  */
453         nameOtherwise      = linkName("otherwise");
454         nameUndefined      = linkName("undefined");
455         /* pmc                                      */
456 #       if NPLUSK                      
457         namePmSub          = linkName("primPmSub");
458 #       endif                          
459         /* translator                               */
460         nameEqChar         = linkName("primEqChar");
461         nameCreateAdjThunk = linkName("primCreateAdjThunk");
462         namePmInt          = linkName("primPmInt");
463         namePmInteger      = linkName("primPmInteger");
464         namePmDouble       = linkName("primPmDouble");
465  
466         namePmFromInteger = linkName("primPmFromInteger");
467         namePmSubtract    = linkName("primPmSubtract");
468         namePmLe          = linkName("primPmLe");
469
470         implementCfun ( nameCons, NIL );
471         implementCfun ( nameNil, NIL );
472         implementCfun ( nameUnit, NIL );
473     }
474 }
475
476
477 /* --------------------------------------------------------------------------
478  * 
479  * ------------------------------------------------------------------------*/
480
481 /* ToDo: fix pFun (or eliminate its use) */
482 #define pFun(n,s) n = predefinePrim(s)
483
484 Void linkControl(what)
485 Int what; {
486     Int i;
487     switch (what) {
488         case RESET   :
489         case MARK    : 
490                        break;
491
492         case POSTPREL: 
493           fprintf(stderr, "linkControl(POSTPREL)\n");
494 if (combined) assert(0);
495 break;
496
497         case PREPREL : 
498
499            if (combined) {
500
501                modulePrelude = findFakeModule(textPrelude);
502                module(modulePrelude).objectExtraNames 
503                   = singleton(findText("libHS_cbits"));
504
505                nameMkC = addWiredInBoxingTycon("PrelBase","Char",  "C#",1,0,CHAR_REP  );
506                nameMkI = addWiredInBoxingTycon("PrelBase","Int",   "I#",1,0,INT_REP   );
507                nameMkW = addWiredInBoxingTycon("PrelAddr","Word",  "W#",1,0,WORD_REP  );
508                nameMkA = addWiredInBoxingTycon("PrelAddr","Addr",  "A#",1,0,ADDR_REP  );
509                nameMkF = addWiredInBoxingTycon("PrelBase","Float", "F#",1,0,FLOAT_REP );
510                nameMkD = addWiredInBoxingTycon("PrelBase","Double","D#",1,0,DOUBLE_REP);
511                nameMkInteger            
512                        = addWiredInBoxingTycon("PrelBase","Integer","Integer#",1,0,0);
513                nameMkPrimByteArray      
514                        = addWiredInBoxingTycon("PrelGHC","ByteArray","PrimByteArray#",1,0,0);
515
516                for (i=0; i<NUM_TUPLES; ++i) {
517                    addTupleTycon(i);
518                }
519                addWiredInEnumTycon("PrelBase","Bool",
520                                    doubleton(findText("False"),findText("True")));
521
522                //nameMkThreadId
523                //        = addWiredInBoxingTycon("PrelConc","ThreadId","ThreadId#"
524                //                                ,1,0,THREADID_REP);
525
526                setCurrModule(modulePrelude);
527
528                typeArrow = addPrimTycon(findText("(->)"),
529                                         pair(STAR,pair(STAR,STAR)),
530                                         2,DATATYPE,NIL);
531            } else {
532
533                modulePrelude = newModule(textPrelude);
534                setCurrModule(modulePrelude);
535         
536                for (i=0; i<NUM_TUPLES; ++i) {
537                    addTupleTycon(i);
538                }
539                setCurrModule(modulePrelude);
540
541                typeArrow = addPrimTycon(findText("(->)"),
542                                         pair(STAR,pair(STAR,STAR)),
543                                         2,DATATYPE,NIL);
544
545                /* newtype and USE_NEWTYPE_FOR_DICTS     */
546                pFun(nameId,             "id");
547
548                /* desugaring                            */
549                pFun(nameInd,            "_indirect");
550                name(nameInd).number = DFUNNAME;
551
552                /* pmc                                   */
553                pFun(nameSel,            "_SEL");
554
555                /* strict constructors                   */
556                pFun(nameFlip,           "flip"     );
557
558                /* parser                                */
559                pFun(nameFromTo,         "enumFromTo");
560                pFun(nameFromThenTo,     "enumFromThenTo");
561                pFun(nameFrom,           "enumFrom");
562                pFun(nameFromThen,       "enumFromThen");
563
564                /* deriving                              */
565                pFun(nameApp,            "++");
566                pFun(nameReadField,      "readField");
567                pFun(nameReadParen,      "readParen");
568                pFun(nameShowField,      "showField");
569                pFun(nameShowParen,      "showParen");
570                pFun(nameLex,            "lex");
571                pFun(nameComp,           ".");
572                pFun(nameAnd,            "&&");
573                pFun(nameCompAux,        "primCompAux");
574                pFun(nameMap,            "map");
575
576                /* implementTagToCon                     */
577                pFun(namePMFail,         "primPmFail");
578                pFun(nameError,          "error");
579                pFun(nameUnpackString,   "primUnpackString");
580
581                /* hooks for handwritten bytecode */
582                pFun(namePrimSeq,        "primSeq");
583                pFun(namePrimCatch,      "primCatch");
584                pFun(namePrimRaise,      "primRaise");
585                pFun(namePrimTakeMVar,   "primTakeMVar");
586                {
587                   StgVar vv = mkStgVar(NIL,NIL);
588                   Name n = namePrimSeq;
589                   name(n).line = 0;
590                   name(n).arity = 1;
591                   name(n).type = NIL;
592                   vv = mkStgVar(NIL,NIL);
593                   stgVarInfo(vv) = mkPtr ( asm_BCO_seq() );
594                   name(n).stgVar = vv;
595                   stgGlobals=cons(pair(n,vv),stgGlobals);
596                   namePrimSeq = n;
597                }
598                {
599                   StgVar vv = mkStgVar(NIL,NIL);
600                   Name n = namePrimCatch;
601                   name(n).line = 0;
602                   name(n).arity = 2;
603                   name(n).type = NIL;
604                   stgVarInfo(vv) = mkPtr ( asm_BCO_catch() );
605                   name(n).stgVar = vv;
606                   stgGlobals=cons(pair(n,vv),stgGlobals);
607                }
608                {
609                   StgVar vv = mkStgVar(NIL,NIL);
610                   Name n = namePrimRaise;
611                   name(n).line = 0;
612                   name(n).arity = 1;
613                   name(n).type = NIL;
614                   stgVarInfo(vv) = mkPtr ( asm_BCO_raise() );
615                   name(n).stgVar = vv;
616                   stgGlobals=cons(pair(n,vv),stgGlobals);
617                }
618                {
619                   StgVar vv = mkStgVar(NIL,NIL);
620                   Name n = namePrimTakeMVar;
621                   name(n).line = 0;
622                   name(n).arity = 2;
623                   name(n).type = NIL;
624                   stgVarInfo(vv) = mkPtr ( asm_BCO_takeMVar() );
625                   name(n).stgVar = vv;
626                   stgGlobals=cons(pair(n,vv),stgGlobals);
627                }
628            }
629            break;
630     }
631 }
632 #undef pFun
633
634
635 /*-------------------------------------------------------------------------*/