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