[project @ 1996-01-11 14:06:51 by partain]
[ghc-hetmet.git] / ghc / compiler / codeGen / SMRep.lhs
index fb5b113..c7656af 100644 (file)
@@ -83,6 +83,52 @@ data SMRep
                        -- Used for mutable tuples
        Int             -- # ptr words
 
+{- Mattson review:
+
+To: simonpj@dcs.gla.ac.uk, partain@dcs.gla.ac.uk
+Cc: kh@dcs.gla.ac.uk, trinder@dcs.gla.ac.uk, areid@dcs.gla.ac.uk
+Subject: Correct me if I'm wrong...
+Date: Fri, 17 Feb 1995 18:09:00 +0000
+From: Jim Mattson <mattson@dcs.gla.ac.uk>
+
+BigTupleRep == TUPLE
+
+    Never generated by the compiler, and only used in the RTS when
+    mutuples don't require special attention at GC time (e.g. 2s)
+    When it is used, it is a primitive object (never entered).
+    May be mutable...probably should never be used in the parallel 
+    system, since we need to distinguish mutables from immutables when
+    deciding whether to copy or move closures across processors.
+
+DataRep == DATA (aka MutableByteArray & ByteArray)
+    Never generated by the compiler, and only used in the RTS for
+    ArrayOfData.  Always a primitive object (never entered).  May
+    be mutable...though we don't distinguish between mutable and
+    immutable data arrays in the sequential world, it would probably
+    be useful in the parallel world to know when it is safe to just
+    copy one of these.  I believe the hooks are in place for changing
+    the InfoPtr on a MutableByteArray when it's frozen to a ByteArray
+    if we want to do so.
+
+DynamicRep == DYN
+    Never generated by the compiler, and only used in the RTS for
+    PAPs and the Stable Pointer table.  PAPs are non-primitive,
+    non-updatable, normal-form objects, but the SPT is a primitive,
+    mutable object.  At the moment, there is no SPT in the parallel
+    world.  Presumably, it would be possible to have an SPT on each
+    processor, and we could identify a stable pointer as a (processor,
+    SPT-entry) pair, but would it be worth it?
+
+MuTupleRep == MUTUPLE
+    Never generated by the compiler, and only used in the RTS when
+    mutuples *do* require special attention at GC time.
+    When it is used, it is a primitive object (never entered).
+    Always mutable...there is an IMMUTUPLE in the RTS, but no
+    corresponding type in the compiler.
+
+--jim
+-}
+
 instance Eq SMRep where
     (SpecialisedRep k1 a1 b1 _) == (SpecialisedRep k2 a2 b2 _) = (tagOf_SMSpecRepKind k1) _EQ_ (tagOf_SMSpecRepKind k2)
                                                               && a1 == a2 && b1 == b2
@@ -137,8 +183,8 @@ tagOf_SMRep PhantomRep                   = ILIT(8)
 tagOf_SMRep (MuTupleRep _)          = ILIT(9)
 
 instance Text SMRep where
-    showsPrec d rep rest
-      = (case rep of
+    showsPrec d rep
+      = showString (case rep of
           StaticRep _ _                         -> "STATIC"
           SpecialisedRep kind _ _ SMNormalForm  -> "SPEC_N"
           SpecialisedRep kind _ _ SMSingleEntry -> "SPEC_S"
@@ -146,12 +192,12 @@ instance Text SMRep where
           GenericRep _ _ SMNormalForm           -> "GEN_N"
           GenericRep _ _ SMSingleEntry          -> "GEN_S"
           GenericRep _ _ SMUpdatable            -> "GEN_U"
-          BigTupleRep _                 -> "TUPLE"
-          DataRep       _               -> "DATA"
-          DynamicRep                    -> "DYN"
-          BlackHoleRep                  -> "BH"
-          PhantomRep                    -> "INREGS"
-          MuTupleRep _                  -> "MUTUPLE") ++ rest
+          BigTupleRep _                         -> "TUPLE"
+          DataRep       _                       -> "DATA"
+          DynamicRep                            -> "DYN"
+          BlackHoleRep                          -> "BH"
+          PhantomRep                            -> "INREGS"
+          MuTupleRep _                          -> "MUTUPLE")
 
 instance Outputable SMRep where
     ppr sty rep = ppStr (show rep)