module DDC.Core.Salt.Platform ( Platform (..) , platform32 , platform64) where import DDC.Base.Pretty -- | Enough information about the platform to generate code for it. -- We need to know the pointer size and alignment constraints -- so that we can lay out heap objects. data Platform = Platform { -- | Width of an address in bytes. platformAddrBytes :: Integer -- | Width of a constructor tag in bytes. , platformTagBytes :: Integer -- | Width of a Nat in bytes (used for object sizes like size_t). , platformNatBytes :: Integer -- | Align functions on this boundary in bytes. , platformAlignBytes :: Integer -- | Minimum size of a heap object in bytes. , platformObjBytes :: Integer } deriving Show instance Pretty Platform where ppr pp = vcat [ text "Address Width (bytes) : " <> text (show $ platformAddrBytes pp) , text "Tag Word Width (bytes) : " <> text (show $ platformTagBytes pp) , text "Nat Word Width (bytes) : " <> text (show $ platformNatBytes pp) , text "Function Alignment (bytes) : " <> text (show $ platformAlignBytes pp) , text "Minimum Object Size (bytes) : " <> text (show $ platformObjBytes pp) ] -- | 32-bit platform specification. -- -- Heap objects are aligned to 64-bit so that double-precision floats -- in the object payloads maintain their alignments. platform32 :: Platform platform32 = Platform { platformAddrBytes = 4 , platformTagBytes = 4 , platformNatBytes = 4 , platformAlignBytes = 4 , platformObjBytes = 8 } -- | 64-bit platform specification. platform64 :: Platform platform64 = Platform { platformAddrBytes = 8 , platformTagBytes = 4 , platformNatBytes = 8 , platformAlignBytes = 8 , platformObjBytes = 8 }