[project @ 2000-01-05 18:05:33 by sewardj]
[ghc-hetmet.git] / ghc / interpreter / link.c
index d7d9bdb..f151506 100644 (file)
@@ -9,8 +9,8 @@
  * included in the distribution.
  *
  * $RCSfile: link.c,v $
- * $Revision: 1.20 $
- * $Date: 1999/12/06 16:25:25 $
+ * $Revision: 1.24 $
+ * $Date: 2000/01/05 18:05:34 $
  * ------------------------------------------------------------------------*/
 
 #include "prelude.h"
@@ -199,6 +199,7 @@ Kind  starToStar;                /* Type -> Type                    */
 Cell  predMonad;                 /* Monad (mkOffset(0))             */
 Type  typeProgIO;                /* IO a                            */
 
+
 /* --------------------------------------------------------------------------
  * 
  * ------------------------------------------------------------------------*/
@@ -206,7 +207,6 @@ Type  typeProgIO;                /* IO a                            */
 static Tycon linkTycon ( String s );
 static Tycon linkClass ( String s );
 static Name  linkName  ( String s );
-static Void  mkTypes   ( void );
 static Name  predefinePrim ( String s );
 
 
@@ -254,6 +254,21 @@ static Name predefinePrim ( String s )
     return nm;
 }
 
+
+/* --------------------------------------------------------------------------
+ * 
+ * ------------------------------------------------------------------------*/
+
+/* In standalone mode, linkPreludeTC, linkPreludeCM and linkPreludeNames
+   are called, in that order, during static analysis of Prelude.hs.
+   In combined mode such an analysis does not happen.  Instead these
+   calls will be made as a result of a call link(POSTPREL).
+
+   linkPreludeTC, linkPreludeCM and linkPreludeNames are needed in both
+   standalone and combined modes.
+*/
+
+
 Void linkPreludeTC(void) {              /* Hook to tycons and classes in   */
     static Bool initialised = FALSE;    /* prelude when first loaded       */
     if (!initialised) {
@@ -261,100 +276,95 @@ Void linkPreludeTC(void) {              /* Hook to tycons and classes in   */
         initialised = TRUE;
         setCurrModule(modulePrelude);
 
-        typeChar         = linkTycon("Char");
-        typeInt          = linkTycon("Int");
-        typeInteger      = linkTycon("Integer");
-        typeWord         = linkTycon("Word");
-        typeAddr         = linkTycon("Addr");
+        typeChar                 = linkTycon("Char");
+        typeInt                  = linkTycon("Int");
+        typeInteger              = linkTycon("Integer");
+        typeWord                 = linkTycon("Word");
+        typeAddr                 = linkTycon("Addr");
         typePrimArray            = linkTycon("PrimArray");
         typePrimByteArray        = linkTycon("PrimByteArray");
         typeRef                  = linkTycon("STRef");
         typePrimMutableArray     = linkTycon("PrimMutableArray");
         typePrimMutableByteArray = linkTycon("PrimMutableByteArray");
-        typeFloat        = linkTycon("Float");
-        typeDouble       = linkTycon("Double");
-        typeStable       = linkTycon("StablePtr");
-#ifdef PROVIDE_WEAK
-        typeWeak         = linkTycon("Weak");
-#endif
-#ifdef PROVIDE_FOREIGN
-        typeForeign      = linkTycon("ForeignObj");
-#endif
-        typeThreadId     = linkTycon("ThreadId");
-        typeMVar         = linkTycon("MVar");
-        typeBool         = linkTycon("Bool");
-        typeST           = linkTycon("ST");
-        typeIO           = linkTycon("IO");
-        typeException    = linkTycon("Exception");
-        typeString       = linkTycon("String");
-        typeOrdering     = linkTycon("Ordering");
-
-        classEq          = linkClass("Eq");
-        classOrd         = linkClass("Ord");
-        classIx          = linkClass("Ix");
-        classEnum        = linkClass("Enum");
-        classShow        = linkClass("Show");
-        classRead        = linkClass("Read");
-        classBounded     = linkClass("Bounded");
-        classReal        = linkClass("Real");
-        classIntegral    = linkClass("Integral");
-        classRealFrac    = linkClass("RealFrac");
-        classRealFloat   = linkClass("RealFloat");
-        classFractional  = linkClass("Fractional");
-        classFloating    = linkClass("Floating");
-        classNum         = linkClass("Num");
-        classMonad       = linkClass("Monad");
-
-        stdDefaults     = NIL;
-        stdDefaults     = cons(typeDouble,stdDefaults);
-#if DEFAULT_BIGNUM
-        stdDefaults     = cons(typeInteger,stdDefaults);
-#else
-        stdDefaults     = cons(typeInt,stdDefaults);
-#endif
-        mkTypes();
-
-        nameMkC          = addPrimCfunREP(findText("C#"),1,0,CHAR_REP);
-        nameMkI          = addPrimCfunREP(findText("I#"),1,0,INT_REP);
-        nameMkW          = addPrimCfunREP(findText("W#"),1,0,WORD_REP);
-        nameMkA          = addPrimCfunREP(findText("A#"),1,0,ADDR_REP);
-        nameMkF          = addPrimCfunREP(findText("F#"),1,0,FLOAT_REP);
-        nameMkD          = addPrimCfunREP(findText("D#"),1,0,DOUBLE_REP);
-        nameMkStable     = addPrimCfunREP(findText("Stable#"),1,0,STABLE_REP);
-        nameMkThreadId   = addPrimCfunREP(findText("ThreadId#"),1,0,THREADID_REP);
-
-#ifdef PROVIDE_FOREIGN
-        nameMkForeign    = addPrimCfunREP(findText("Foreign#"),1,0,0);
-#endif
-#ifdef PROVIDE_WEAK
-        nameMkWeak       = addPrimCfunREP(findText("Weak#"),1,0,0);
-#endif
-        nameMkPrimArray            = addPrimCfunREP(findText("PrimArray#"),1,0,0);
-        nameMkPrimByteArray        = addPrimCfunREP(findText("PrimByteArray#"),1,0,0);
-        nameMkRef                  = addPrimCfunREP(findText("STRef#"),1,0,0);
-        nameMkPrimMutableArray     = addPrimCfunREP(findText("PrimMutableArray#"),1,0,0);
+        typeFloat                = linkTycon("Float");
+        typeDouble               = linkTycon("Double");
+        typeStable               = linkTycon("StablePtr");
+#       ifdef PROVIDE_WEAK
+        typeWeak                 = linkTycon("Weak");
+#       endif
+#       ifdef PROVIDE_FOREIGN
+        typeForeign              = linkTycon("ForeignObj");
+#       endif
+        typeThreadId             = linkTycon("ThreadId");
+        typeMVar                 = linkTycon("MVar");
+        typeBool                 = linkTycon("Bool");
+        typeST                   = linkTycon("ST");
+        typeIO                   = linkTycon("IO");
+        typeException            = linkTycon("Exception");
+        typeString               = linkTycon("String");
+        typeOrdering             = linkTycon("Ordering");
+
+        classEq                  = linkClass("Eq");
+        classOrd                 = linkClass("Ord");
+        classIx                  = linkClass("Ix");
+        classEnum                = linkClass("Enum");
+        classShow                = linkClass("Show");
+        classRead                = linkClass("Read");
+        classBounded             = linkClass("Bounded");
+        classReal                = linkClass("Real");
+        classIntegral            = linkClass("Integral");
+        classRealFrac            = linkClass("RealFrac");
+        classRealFloat           = linkClass("RealFloat");
+        classFractional          = linkClass("Fractional");
+        classFloating            = linkClass("Floating");
+        classNum                 = linkClass("Num");
+        classMonad               = linkClass("Monad");
+
+        stdDefaults              = NIL;
+        stdDefaults              = cons(typeDouble,stdDefaults);
+#       if DEFAULT_BIGNUM
+        stdDefaults              = cons(typeInteger,stdDefaults);
+#       else
+        stdDefaults              = cons(typeInt,stdDefaults);
+#       endif
+
+        predNum                  = ap(classNum,aVar);
+        predFractional           = ap(classFractional,aVar);
+        predIntegral             = ap(classIntegral,aVar);
+        predMonad                = ap(classMonad,aVar);
+       typeProgIO               = ap(typeIO,aVar);
+
+        nameMkC                  = addPrimCfunREP(findText("C#"),1,0,CHAR_REP);
+        nameMkI                  = addPrimCfunREP(findText("I#"),1,0,INT_REP);
+        nameMkW                  = addPrimCfunREP(findText("W#"),1,0,WORD_REP);
+        nameMkA                  = addPrimCfunREP(findText("A#"),1,0,ADDR_REP);
+        nameMkF                  = addPrimCfunREP(findText("F#"),1,0,FLOAT_REP);
+        nameMkD                  = addPrimCfunREP(findText("D#"),1,0,DOUBLE_REP);
+        nameMkStable             = addPrimCfunREP(findText("Stable#"),1,0,STABLE_REP);
+        nameMkThreadId           = addPrimCfunREP(findText("ThreadId#"),1,0,THREADID_REP);
+
+#       ifdef PROVIDE_FOREIGN
+        nameMkForeign            = addPrimCfunREP(findText("Foreign#"),1,0,0);
+#       endif
+#       ifdef PROVIDE_WEAK
+        nameMkWeak               = addPrimCfunREP(findText("Weak#"),1,0,0);
+#       endif
+        nameMkPrimArray          = addPrimCfunREP(findText("PrimArray#"),1,0,0);
+        nameMkPrimByteArray      = addPrimCfunREP(findText("PrimByteArray#"),1,0,0);
+        nameMkRef                = addPrimCfunREP(findText("STRef#"),1,0,0);
+        nameMkPrimMutableArray   = addPrimCfunREP(findText("PrimMutableArray#"),1,0,0);
         nameMkPrimMutableByteArray = addPrimCfunREP(findText("PrimMutableByteArray#"),1,0,0);
-        nameMkPrimMVar             = addPrimCfunREP(findText("MVar#"),1,0,0);
-        nameMkInteger              = addPrimCfunREP(findText("Integer#"),1,0,0);
-
-        /* The following primitives are referred to in derived instances and
-         * hence require types; the following types are a little more general
-         * than we might like, but they are the closest we can get without a
-         * special datatype class.
-         */
-
-        name(namePrimSeq).type
-            = primType(MONAD_Id, "ab", "b");
-        name(namePrimCatch).type
-            = primType(MONAD_Id, "aH", "a");
-        name(namePrimRaise).type
-            = primType(MONAD_Id, "E", "a");
+        nameMkPrimMVar           = addPrimCfunREP(findText("MVar#"),1,0,0);
+        nameMkInteger            = addPrimCfunREP(findText("Integer#"),1,0,0);
+
+        name(namePrimSeq).type   = primType(MONAD_Id, "ab", "b");
+        name(namePrimCatch).type = primType(MONAD_Id, "aH", "a");
+        name(namePrimRaise).type = primType(MONAD_Id, "E", "a");
 
         /* This is a lie.  For a more accurate type of primTakeMVar
            see ghc/interpreter/lib/Prelude.hs.
        */
-        name(namePrimTakeMVar).type
-            = primType(MONAD_Id, "rbc", "d");
+        name(namePrimTakeMVar).type = primType(MONAD_Id, "rbc", "d");
 
         for (i=2; i<=NUM_DTUPLES; i++) {/* Add derived instances of tuples */
             addTupInst(classEq,i);
@@ -367,15 +377,6 @@ Void linkPreludeTC(void) {              /* Hook to tycons and classes in   */
     }
 }
 
-static Void mkTypes ( void )
-{
-        predNum        = ap(classNum,aVar);
-        predFractional = ap(classFractional,aVar);
-        predIntegral   = ap(classIntegral,aVar);
-        predMonad      = ap(classMonad,aVar);
-       typeProgIO     = ap(typeIO,aVar);
-}
-
 Void linkPreludeCM(void) {              /* Hook to cfuns and mfuns in      */
     static Bool initialised = FALSE;    /* prelude when first loaded       */
     if (!initialised) {
@@ -452,9 +453,9 @@ Void linkPreludeNames(void) {           /* Hook to names defined in Prelude */
         nameOtherwise      = linkName("otherwise");
         nameUndefined      = linkName("undefined");
         /* pmc                                      */
-#if NPLUSK                      
+#       if NPLUSK                      
         namePmSub          = linkName("primPmSub");
-#endif                          
+#       endif                          
         /* translator                               */
         nameEqChar         = linkName("primEqChar");
         nameCreateAdjThunk = linkName("primCreateAdjThunk");
@@ -465,10 +466,18 @@ Void linkPreludeNames(void) {           /* Hook to names defined in Prelude */
         namePmFromInteger = linkName("primPmFromInteger");
         namePmSubtract    = linkName("primPmSubtract");
         namePmLe          = linkName("primPmLe");
+
+        implementCfun ( nameCons, NIL );
+        implementCfun ( nameNil, NIL );
+        implementCfun ( nameUnit, NIL );
     }
 }
 
 
+/* --------------------------------------------------------------------------
+ * 
+ * ------------------------------------------------------------------------*/
+
 /* ToDo: fix pFun (or eliminate its use) */
 #define pFun(n,s) n = predefinePrim(s)
 
@@ -480,103 +489,144 @@ Int what; {
         case MARK    : 
                        break;
 
-        case INSTALL : linkControl(RESET);
-
-                       modulePrelude = newModule(textPrelude);
-                       setCurrModule(modulePrelude);
-
-                       for(i=0; i<NUM_TUPLES; ++i) {
-                           allocTupleTycon(i);
-                       }
-
-                       typeArrow = addPrimTycon(findText("(->)"),
-                                                pair(STAR,pair(STAR,STAR)),
-                                                2,DATATYPE,NIL);
-
-                       /* newtype and USE_NEWTYPE_FOR_DICTS     */
-                       pFun(nameId,             "id");
-
-                       /* desugaring                            */
-                       pFun(nameInd,            "_indirect");
-                       name(nameInd).number = DFUNNAME;
-
-                       /* pmc                                   */
-                       pFun(nameSel,            "_SEL");
-
-                       /* strict constructors                   */
-                       pFun(nameFlip,           "flip"     );
-
-                       /* parser                                */
-                       pFun(nameFromTo,         "enumFromTo");
-                       pFun(nameFromThenTo,     "enumFromThenTo");
-                       pFun(nameFrom,           "enumFrom");
-                       pFun(nameFromThen,       "enumFromThen");
-
-                       /* deriving                              */
-                       pFun(nameApp,            "++");
-                       pFun(nameReadField,      "readField");
-                       pFun(nameReadParen,      "readParen");
-                       pFun(nameShowField,      "showField");
-                       pFun(nameShowParen,      "showParen");
-                       pFun(nameLex,            "lex");
-                       pFun(nameComp,           ".");
-                       pFun(nameAnd,            "&&");
-                       pFun(nameCompAux,        "primCompAux");
-                       pFun(nameMap,            "map");
-
-                       /* implementTagToCon                     */
-                       pFun(namePMFail,         "primPmFail");
-                      pFun(nameError,          "error");
-                      pFun(nameUnpackString,   "primUnpackString");
-
-                       /* hooks for handwritten bytecode */
-                       pFun(namePrimSeq,        "primSeq");
-                       pFun(namePrimCatch,      "primCatch");
-                       pFun(namePrimRaise,      "primRaise");
-                       pFun(namePrimTakeMVar,   "primTakeMVar");
-                       {
-                          StgVar vv = mkStgVar(NIL,NIL);
-                          Name n = namePrimSeq;
-                          name(n).line = 0;
-                          name(n).arity = 1;
-                          name(n).type = NIL;
-                          vv = mkStgVar(NIL,NIL);
-                          stgVarInfo(vv) = mkPtr ( asm_BCO_seq() );
-                          name(n).stgVar = vv;
-                          stgGlobals=cons(pair(n,vv),stgGlobals);
-                          namePrimSeq = n;
-                       }
-                       {
-                          StgVar vv = mkStgVar(NIL,NIL);
-                          Name n = namePrimCatch;
-                          name(n).line = 0;
-                          name(n).arity = 2;
-                          name(n).type = NIL;
-                          stgVarInfo(vv) = mkPtr ( asm_BCO_catch() );
-                          name(n).stgVar = vv;
-                          stgGlobals=cons(pair(n,vv),stgGlobals);
-                       }
-                       {
-                          StgVar vv = mkStgVar(NIL,NIL);
-                          Name n = namePrimRaise;
-                          name(n).line = 0;
-                          name(n).arity = 1;
-                          name(n).type = NIL;
-                          stgVarInfo(vv) = mkPtr ( asm_BCO_raise() );
-                          name(n).stgVar = vv;
-                          stgGlobals=cons(pair(n,vv),stgGlobals);
-                       }
-                       {
-                          StgVar vv = mkStgVar(NIL,NIL);
-                          Name n = namePrimTakeMVar;
-                          name(n).line = 0;
-                          name(n).arity = 2;
-                          name(n).type = NIL;
-                          stgVarInfo(vv) = mkPtr ( asm_BCO_takeMVar() );
-                          name(n).stgVar = vv;
-                          stgGlobals=cons(pair(n,vv),stgGlobals);
-                       }
-                       break;
+        case POSTPREL: 
+         fprintf(stderr, "linkControl(POSTPREL)\n");
+if (combined) assert(0);
+break;
+
+        case PREPREL : 
+
+           if (combined) {
+
+               modulePrelude = findFakeModule(textPrelude);
+               module(modulePrelude).objectExtraNames 
+                  = singleton(findText("libHS_cbits"));
+
+               nameMkC = addWiredInBoxingTycon("PrelBase","Char",  "C#",1,0,CHAR_REP  );
+               nameMkI = addWiredInBoxingTycon("PrelBase","Int",   "I#",1,0,INT_REP   );
+               nameMkW = addWiredInBoxingTycon("PrelAddr","Word",  "W#",1,0,WORD_REP  );
+               nameMkA = addWiredInBoxingTycon("PrelAddr","Addr",  "A#",1,0,ADDR_REP  );
+               nameMkF = addWiredInBoxingTycon("PrelBase","Float", "F#",1,0,FLOAT_REP );
+               nameMkD = addWiredInBoxingTycon("PrelBase","Double","D#",1,0,DOUBLE_REP);
+               nameMkInteger            
+                       = addWiredInBoxingTycon("PrelBase","Integer","Integer#",1,0,0);
+               nameMkPrimByteArray      
+                       = addWiredInBoxingTycon("PrelGHC","ByteArray","PrimByteArray#",1,0,0);
+
+               for (i=0; i<NUM_TUPLES; ++i) {
+                   addTupleTycon(i);
+               }
+              addWiredInEnumTycon("PrelBase","Bool",
+                                   doubleton(findText("False"),findText("True")));
+
+               //nameMkThreadId
+               //        = addWiredInBoxingTycon("PrelConc","ThreadId","ThreadId#"
+               //                                ,1,0,THREADID_REP);
+
+               setCurrModule(modulePrelude);
+
+               typeArrow = addPrimTycon(findText("(->)"),
+                                        pair(STAR,pair(STAR,STAR)),
+                                        2,DATATYPE,NIL);
+           } else {
+
+               modulePrelude = newModule(textPrelude);
+               setCurrModule(modulePrelude);
+        
+               for (i=0; i<NUM_TUPLES; ++i) {
+                   addTupleTycon(i);
+               }
+               setCurrModule(modulePrelude);
+
+               typeArrow = addPrimTycon(findText("(->)"),
+                                        pair(STAR,pair(STAR,STAR)),
+                                        2,DATATYPE,NIL);
+
+               /* newtype and USE_NEWTYPE_FOR_DICTS     */
+               pFun(nameId,             "id");
+
+               /* desugaring                            */
+               pFun(nameInd,            "_indirect");
+               name(nameInd).number = DFUNNAME;
+
+               /* pmc                                   */
+               pFun(nameSel,            "_SEL");
+
+               /* strict constructors                   */
+               pFun(nameFlip,           "flip"     );
+
+               /* parser                                */
+               pFun(nameFromTo,         "enumFromTo");
+               pFun(nameFromThenTo,     "enumFromThenTo");
+               pFun(nameFrom,           "enumFrom");
+               pFun(nameFromThen,       "enumFromThen");
+
+               /* deriving                              */
+               pFun(nameApp,            "++");
+               pFun(nameReadField,      "readField");
+               pFun(nameReadParen,      "readParen");
+               pFun(nameShowField,      "showField");
+               pFun(nameShowParen,      "showParen");
+               pFun(nameLex,            "lex");
+               pFun(nameComp,           ".");
+               pFun(nameAnd,            "&&");
+               pFun(nameCompAux,        "primCompAux");
+               pFun(nameMap,            "map");
+
+               /* implementTagToCon                     */
+               pFun(namePMFail,         "primPmFail");
+               pFun(nameError,          "error");
+               pFun(nameUnpackString,   "primUnpackString");
+
+               /* hooks for handwritten bytecode */
+               pFun(namePrimSeq,        "primSeq");
+               pFun(namePrimCatch,      "primCatch");
+               pFun(namePrimRaise,      "primRaise");
+               pFun(namePrimTakeMVar,   "primTakeMVar");
+               {
+                  StgVar vv = mkStgVar(NIL,NIL);
+                  Name n = namePrimSeq;
+                  name(n).line = 0;
+                  name(n).arity = 1;
+                  name(n).type = NIL;
+                  vv = mkStgVar(NIL,NIL);
+                  stgVarInfo(vv) = mkPtr ( asm_BCO_seq() );
+                  name(n).stgVar = vv;
+                  stgGlobals=cons(pair(n,vv),stgGlobals);
+                  namePrimSeq = n;
+               }
+               {
+                  StgVar vv = mkStgVar(NIL,NIL);
+                  Name n = namePrimCatch;
+                  name(n).line = 0;
+                  name(n).arity = 2;
+                  name(n).type = NIL;
+                  stgVarInfo(vv) = mkPtr ( asm_BCO_catch() );
+                  name(n).stgVar = vv;
+                  stgGlobals=cons(pair(n,vv),stgGlobals);
+               }
+               {
+                  StgVar vv = mkStgVar(NIL,NIL);
+                  Name n = namePrimRaise;
+                  name(n).line = 0;
+                  name(n).arity = 1;
+                  name(n).type = NIL;
+                  stgVarInfo(vv) = mkPtr ( asm_BCO_raise() );
+                  name(n).stgVar = vv;
+                  stgGlobals=cons(pair(n,vv),stgGlobals);
+               }
+               {
+                  StgVar vv = mkStgVar(NIL,NIL);
+                  Name n = namePrimTakeMVar;
+                  name(n).line = 0;
+                  name(n).arity = 2;
+                  name(n).type = NIL;
+                  stgVarInfo(vv) = mkPtr ( asm_BCO_takeMVar() );
+                  name(n).stgVar = vv;
+                  stgGlobals=cons(pair(n,vv),stgGlobals);
+               }
+          }
+           break;
     }
 }
 #undef pFun