[project @ 2000-09-06 10:23:52 by simonmar]
authorsimonmar <unknown>
Wed, 6 Sep 2000 10:23:52 +0000 (10:23 +0000)
committersimonmar <unknown>
Wed, 6 Sep 2000 10:23:52 +0000 (10:23 +0000)
Add new PrimRep, namely PrimPtrRep, as a catch-all for the various
boxed primitive types that currently don't have their own PrimReps.
Use this for MVar# and MutVar#.  This fixes a crash in the code
generator when a function returns one of these types.

ghc/compiler/absCSyn/PprAbsC.lhs
ghc/compiler/codeGen/CgRetConv.lhs
ghc/compiler/nativeGen/MachMisc.lhs
ghc/compiler/prelude/PrimRep.lhs
ghc/compiler/prelude/TysPrim.lhs

index 82431ab..01952d4 100644 (file)
@@ -1300,6 +1300,7 @@ pprUnionTag StablePtrRep  = char 'p'
 pprUnionTag StableNameRep      = char 'p'
 pprUnionTag WeakPtrRep         = char 'p'
 pprUnionTag ForeignObjRep      = char 'p'
+pprUnionTag PrimPtrRep         = char 'p'
 
 pprUnionTag ThreadIdRep                = char 't'
 
index 4c0151e..fa7215b 100644 (file)
@@ -1,7 +1,7 @@
 %
 % (c) The GRASP Project, Glasgow University, 1992-1998
 %
-% $Id: CgRetConv.lhs,v 1.24 2000/08/07 23:37:20 qrczak Exp $
+% $Id: CgRetConv.lhs,v 1.25 2000/09/06 10:23:52 simonmar Exp $
 %
 \section[CgRetConv]{Return conventions for the code generator}
 
@@ -89,6 +89,7 @@ dataReturnConvPrim VoidRep    = VoidReg
 -- Return a primitive-array pointer in the usual register:
 dataReturnConvPrim ArrayRep     = VanillaReg ArrayRep ILIT(1)
 dataReturnConvPrim ByteArrayRep = VanillaReg ByteArrayRep ILIT(1)
+dataReturnConvPrim PrimPtrRep   = VanillaReg PrimPtrRep ILIT(1)
 
 dataReturnConvPrim StablePtrRep = VanillaReg StablePtrRep ILIT(1)
 dataReturnConvPrim ForeignObjRep = VanillaReg ForeignObjRep ILIT(1)
index 213da00..00462da 100644 (file)
@@ -283,6 +283,7 @@ primRepToSize FloatRep          = IF_ARCH_alpha( TF, IF_ARCH_i386( F, IF_ARCH_sparc(
 primRepToSize DoubleRep            = IF_ARCH_alpha( TF, IF_ARCH_i386( DF,IF_ARCH_sparc( DF,)))
 primRepToSize ArrayRep     = IF_ARCH_alpha( Q,  IF_ARCH_i386( L, IF_ARCH_sparc( W ,)))
 primRepToSize ByteArrayRep  = IF_ARCH_alpha( Q,         IF_ARCH_i386( L, IF_ARCH_sparc( W ,)))
+primRepToSize PrimPtrRep    = IF_ARCH_alpha( Q,         IF_ARCH_i386( L, IF_ARCH_sparc( W ,)))
 primRepToSize WeakPtrRep    = IF_ARCH_alpha( Q,         IF_ARCH_i386( L, IF_ARCH_sparc( W ,)))
 primRepToSize ForeignObjRep = IF_ARCH_alpha( Q,  IF_ARCH_i386( L, IF_ARCH_sparc( W ,)))
 primRepToSize BCORep        = IF_ARCH_alpha( Q,  IF_ARCH_i386( L, IF_ARCH_sparc( W ,)))
index 2a84114..ab6fdc4 100644 (file)
@@ -78,6 +78,11 @@ data PrimRep
   | ArrayRep           -- Primitive array of Haskell pointers
   | ByteArrayRep       -- Primitive array of bytes (no Haskell pointers)
 
+  | PrimPtrRep         -- Used for MutVars and MVars; 
+                       -- a pointer to a primitive object
+                       -- ToDo: subsumes WeakPtrRep, ThreadIdRep, 
+                       -- StableNameRep, ForeignObjRep, and BCORep ?
+
   | VoidRep            -- Occupies no space at all!
                        -- (Primitive states are mapped onto this)
   deriving (Eq, Ord)
@@ -117,6 +122,7 @@ isFollowableRep ByteArrayRep  = True        --      ''
 isFollowableRep WeakPtrRep    = True   --      ''
 isFollowableRep ForeignObjRep = True   --      ''
 isFollowableRep StableNameRep = True    --      ''
+isFollowableRep PrimPtrRep    = True    --      ''
 isFollowableRep ThreadIdRep   = True   -- pointer to a TSO
 
 isFollowableRep other        = False
@@ -227,6 +233,7 @@ showPrimRep AddrRep    = "StgAddr"
 showPrimRep FloatRep      = "StgFloat"
 showPrimRep DoubleRep     = "StgDouble"
 showPrimRep ArrayRep      = "P_" -- see comment below
+showPrimRep PrimPtrRep    = "P_"
 showPrimRep ByteArrayRep   = "StgByteArray"
 showPrimRep StablePtrRep   = "StgStablePtr"
 showPrimRep StableNameRep  = "P_"
index 4be0716..918b8c3 100644 (file)
@@ -165,7 +165,7 @@ system, to parameterise State#.
 
 \begin{code}
 realWorldTy         = mkTyConTy realWorldTyCon
-realWorldTyCon      = pcPrimTyCon realWorldTyConKey SLIT("RealWorld") 0 [] PtrRep
+realWorldTyCon      = pcPrimTyCon realWorldTyConKey SLIT("RealWorld") 0 [] PrimPtrRep
 realWorldStatePrimTy = mkStatePrimTy realWorldTy       -- State# RealWorld
 \end{code}
 
@@ -204,7 +204,7 @@ mkMutableByteArrayPrimTy s  = mkTyConApp mutableByteArrayPrimTyCon [s]
 
 \begin{code}
 mutVarPrimTyCon = pcPrimTyCon mutVarPrimTyConKey SLIT("MutVar#")
-                              2 vrcsZP PtrRep
+                              2 vrcsZP PrimPtrRep
 
 mkMutVarPrimTy s elt       = mkTyConApp mutVarPrimTyCon [s, elt]
 \end{code}
@@ -217,7 +217,7 @@ mkMutVarPrimTy s elt            = mkTyConApp mutVarPrimTyCon [s, elt]
 
 \begin{code}
 mVarPrimTyCon = pcPrimTyCon mVarPrimTyConKey SLIT("MVar#")
-                            2 vrcsZP PtrRep
+                            2 vrcsZP PrimPtrRep
 
 mkMVarPrimTy s elt         = mkTyConApp mVarPrimTyCon [s, elt]
 \end{code}