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