[project @ 1999-11-12 17:32:36 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.12 $
13  * $Date: 1999/11/12 17:32:40 $
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 #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 Name nameEqDouble;
106 Name namePmInt;
107 Name namePmInteger;
108 Name namePmDouble;
109 Name namePmLe;
110 Name namePmSubtract;
111 Name namePmFromInteger;
112 Name nameMkIO;
113 Name nameRunST;
114 Name nameUnpackString;
115 Name nameError;
116 Name nameInd;
117 Name nameCreateAdjThunk;
118
119 Name nameAnd;
120 Name nameConCmp;
121 Name nameCompAux;
122 Name nameEnFrTh;
123 Name nameEnFrTo;
124 Name nameEnFrom;
125 Name nameEnFrEn;
126 Name nameEnToEn;
127 Name nameEnInRng;
128 Name nameEnIndex;
129 Name nameEnRange;
130 Name nameRangeSize;
131 Name nameComp;
132 Name nameShowField;
133 Name nameApp;
134 Name nameShowParen;
135 Name nameReadParen;
136 Name nameLex;
137 Name nameReadField;
138 Name nameFlip;
139
140 Name namePrimSeq;
141 Name namePrimCatch;
142 Name namePrimRaise;
143
144 Name nameFromTo;
145 Name nameFromThen;
146 Name nameFrom;
147 Name nameFromThenTo;
148 Name nameNegate;
149
150 /* these names are required before we've had a chance to do the right thing */
151 Name nameSel;
152 Name nameUnsafeUnpackCString;
153
154 /* constructors used during translation and codegen */
155 Name nameMkC;                           /* Char#        -> Char           */
156 Name nameMkI;                           /* Int#         -> Int            */
157 Name nameMkInteger;                     /* Integer#     -> Integer        */
158 Name nameMkW;                           /* Word#        -> Word           */
159 Name nameMkA;                           /* Addr#        -> Addr            */
160 Name nameMkF;                           /* Float#       -> Float           */
161 Name nameMkD;                           /* Double#      -> Double          */
162 Name nameMkPrimArray;            
163 Name nameMkPrimByteArray;
164 Name nameMkRef;                  
165 Name nameMkPrimMutableArray;     
166 Name nameMkPrimMutableByteArray; 
167 Name nameMkStable;                      /* StablePtr# a -> StablePtr a     */
168 #ifdef PROVIDE_WEAK
169 Name nameMkWeak;                        /* Weak# a      -> Weak a          */
170 #endif
171 #ifdef PROVIDE_FOREIGN
172 Name nameMkForeign;                     /* ForeignObj#  -> ForeignObj      */
173 #endif
174 #ifdef PROVIDE_CONCURRENT
175 Name nameMkThreadId;                    /* ThreadId#    -> ThreadId        */
176 Name nameMkMVar;                        /* MVar#        -> MVar            */
177 #endif
178
179
180
181 Name nameMinBnd;
182 Name nameMaxBnd;
183 Name nameCompare;
184 Name nameShowsPrec;
185 Name nameIndex;
186 Name nameReadsPrec; 
187 Name nameRange;
188 Name nameEQ;
189 Name nameInRange;
190 Name nameGt;
191 Name nameLe;
192 Name namePlus;
193 Name nameMult;
194 Name nameMFail;
195 Type typeOrdering;
196 Module modulePrelude;
197 Name nameMap;
198 Name nameMinus;
199
200
201 /* --------------------------------------------------------------------------
202  * Frequently used type skeletons:
203  * ------------------------------------------------------------------------*/
204
205 Type  arrow;                     /* mkOffset(0) -> mkOffset(1)      */
206 Type  boundPair;                 /* (mkOffset(0),mkOffset(0))       */
207 Type  listof;                    /* [ mkOffset(0) ]                 */
208 Type  typeVarToVar;              /* mkOffset(0) -> mkOffset(0)      */
209
210 Cell  predNum;                   /* Num (mkOffset(0))               */
211 Cell  predFractional;            /* Fractional (mkOffset(0))        */
212 Cell  predIntegral;              /* Integral (mkOffset(0))          */
213 Kind  starToStar;                /* Type -> Type                    */
214 Cell  predMonad;                 /* Monad (mkOffset(0))             */
215
216 /* --------------------------------------------------------------------------
217  * 
218  * ------------------------------------------------------------------------*/
219
220 static Tycon linkTycon ( String s );
221 static Tycon linkClass ( String s );
222 static Name  linkName  ( String s );
223 static Void  mkTypes   ( void );
224 static Name  predefinePrim ( String s );
225
226
227 static Tycon linkTycon( String s )
228 {
229     Tycon tc = findTycon(findText(s));
230     if (nonNull(tc)) {
231         return tc;
232     }
233     ERRMSG(0) "Prelude does not define standard type \"%s\"", s
234     EEND;
235 }
236
237 static Class linkClass( String s )
238 {
239     Class cc = findClass(findText(s));
240     if (nonNull(cc)) {
241         return cc;
242     }
243     ERRMSG(0) "Prelude does not define standard class \"%s\"", s
244     EEND;
245 }
246
247 static Name linkName( String s )
248 {
249     Name n = findName(findText(s));
250     if (nonNull(n)) {
251         return n;
252     }
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 Void linkPreludeTC(void) {              /* Hook to tycons and classes in   */
272     static Bool initialised = FALSE;    /* prelude when first loaded       */
273     if (!initialised) {
274         Int i;
275         initialised = TRUE;
276         setCurrModule(modulePrelude);
277
278         typeChar         = linkTycon("Char");
279         typeInt          = linkTycon("Int");
280         typeInteger      = linkTycon("Integer");
281         typeWord         = linkTycon("Word");
282         typeAddr         = linkTycon("Addr");
283         typePrimArray            = linkTycon("PrimArray");
284         typePrimByteArray        = linkTycon("PrimByteArray");
285         typeRef                  = linkTycon("Ref");
286         typePrimMutableArray     = linkTycon("PrimMutableArray");
287         typePrimMutableByteArray = linkTycon("PrimMutableByteArray");
288         typeFloat        = linkTycon("Float");
289         typeDouble       = linkTycon("Double");
290         typeStable       = linkTycon("StablePtr");
291 #ifdef PROVIDE_WEAK
292         typeWeak         = linkTycon("Weak");
293 #endif
294 #ifdef PROVIDE_FOREIGN
295         typeForeign      = linkTycon("ForeignObj");
296 #endif
297 #ifdef PROVIDE_CONCURRENT
298         typeThreadId     = linkTycon("ThreadId");
299         typeMVar         = linkTycon("MVar");
300 #endif
301
302         typeBool         = linkTycon("Bool");
303         typeST           = linkTycon("ST");
304         typeIO           = linkTycon("IO");
305         typeException    = linkTycon("Exception");
306         typeString       = linkTycon("String");
307         typeOrdering     = linkTycon("Ordering");
308
309         classEq          = linkClass("Eq");
310         classOrd         = linkClass("Ord");
311         classIx          = linkClass("Ix");
312         classEnum        = linkClass("Enum");
313         classShow        = linkClass("Show");
314         classRead        = linkClass("Read");
315         classBounded     = linkClass("Bounded");
316         classReal        = linkClass("Real");
317         classIntegral    = linkClass("Integral");
318         classRealFrac    = linkClass("RealFrac");
319         classRealFloat   = linkClass("RealFloat");
320         classFractional  = linkClass("Fractional");
321         classFloating    = linkClass("Floating");
322         classNum         = linkClass("Num");
323         classMonad       = linkClass("Monad");
324
325         stdDefaults     = NIL;
326         stdDefaults     = cons(typeDouble,stdDefaults);
327 #if DEFAULT_BIGNUM
328         stdDefaults     = cons(typeInteger,stdDefaults);
329 #else
330         stdDefaults     = cons(typeInt,stdDefaults);
331 #endif
332         mkTypes();
333
334         nameMkC          = addPrimCfunREP(findText("C#"),1,0,CHAR_REP);
335         nameMkI          = addPrimCfunREP(findText("I#"),1,0,INT_REP);
336         nameMkW          = addPrimCfunREP(findText("W#"),1,0,WORD_REP);
337         nameMkA          = addPrimCfunREP(findText("A#"),1,0,ADDR_REP);
338         nameMkF          = addPrimCfunREP(findText("F#"),1,0,FLOAT_REP);
339         nameMkD          = addPrimCfunREP(findText("D#"),1,0,DOUBLE_REP);
340         nameMkStable     = addPrimCfunREP(findText("Stable#"),1,0,STABLE_REP);
341         nameMkInteger    = addPrimCfunREP(findText("Integer#"),1,0,0);
342 #ifdef PROVIDE_FOREIGN
343         nameMkForeign    = addPrimCfunREP(findText("Foreign#"),1,0,0);
344 #endif
345 #ifdef PROVIDE_WEAK
346         nameMkWeak       = addPrimCfunREP(findText("Weak#"),1,0,0);
347 #endif
348         nameMkPrimArray            = addPrimCfunREP(findText("PrimArray#"),1,0,0);
349         nameMkPrimByteArray        = addPrimCfunREP(findText("PrimByteArray#"),1,0,0);
350         nameMkRef                  = addPrimCfunREP(findText("Ref#"),1,0,0);
351         nameMkPrimMutableArray     = addPrimCfunREP(findText("PrimMutableArray#"),1,0,0);
352         nameMkPrimMutableByteArray = addPrimCfunREP(findText("PrimMutableByteArray#"),1,0,0);
353 #ifdef PROVIDE_CONCURRENT
354         nameMkThreadId   = addPrimCfun(findTextREP("ThreadId#"),1,0,0);
355         nameMkMVar       = addPrimCfun(findTextREP("MVar#"),1,0,0);
356 #endif
357         /* The following primitives are referred to in derived instances and
358          * hence require types; the following types are a little more general
359          * than we might like, but they are the closest we can get without a
360          * special datatype class.
361          */
362         name(nameConCmp).type
363             = mkPolyType(starToStar,fn(aVar,fn(aVar,typeOrdering)));
364         name(nameEnRange).type
365             = mkPolyType(starToStar,fn(boundPair,listof));
366         name(nameEnIndex).type
367             = mkPolyType(starToStar,fn(boundPair,fn(aVar,typeInt)));
368         name(nameEnInRng).type
369             = mkPolyType(starToStar,fn(boundPair,fn(aVar,typeBool)));
370         name(nameEnToEn).type
371             = mkPolyType(starToStar,fn(aVar,fn(typeInt,aVar)));
372         name(nameEnFrEn).type
373             = mkPolyType(starToStar,fn(aVar,typeInt));
374         name(nameEnFrom).type
375             = mkPolyType(starToStar,fn(aVar,listof));
376         name(nameEnFrTo).type
377             = name(nameEnFrTh).type
378             = mkPolyType(starToStar,fn(aVar,fn(aVar,listof)));
379
380         name(namePrimSeq).type
381             = primType(MONAD_Id, "ab", "b");
382         name(namePrimCatch).type
383             = primType(MONAD_Id, "aH", "a");
384         name(namePrimRaise).type
385             = primType(MONAD_Id, "E", "a");
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                        {
568                           StgVar vv = mkStgVar(NIL,NIL);
569                           Name n = namePrimSeq;
570                           name(n).line = 0;
571                           name(n).arity = 1;
572                           name(n).type = NIL;
573                           vv = mkStgVar(NIL,NIL);
574                           stgVarInfo(vv) = mkPtr ( asm_BCO_seq() );
575                           name(n).stgVar = vv;
576                           stgGlobals=cons(pair(n,vv),stgGlobals);
577                           namePrimSeq = n;
578                        }
579                        {
580                           StgVar vv = mkStgVar(NIL,NIL);
581                           Name n = namePrimCatch;
582                           name(n).line = 0;
583                           name(n).arity = 2;
584                           name(n).type = NIL;
585                           stgVarInfo(vv) = mkPtr ( asm_BCO_catch() );
586                           name(n).stgVar = vv;
587                           stgGlobals=cons(pair(n,vv),stgGlobals);
588                        }
589                        {
590                           StgVar vv = mkStgVar(NIL,NIL);
591                           Name n = namePrimRaise;
592                           name(n).line = 0;
593                           name(n).arity = 1;
594                           name(n).type = NIL;
595                           stgVarInfo(vv) = mkPtr ( asm_BCO_raise() );
596                           name(n).stgVar = vv;
597                           stgGlobals=cons(pair(n,vv),stgGlobals);
598                        }
599
600                        break;
601     }
602 }
603 #undef pFun
604
605
606 /*-------------------------------------------------------------------------*/