%
-% (c) The GRASP/AQUA Project, Glasgow University, 1992-1998
-%
-% $Id: CLabel.lhs,v 1.23 1999/01/20 16:07:43 simonm Exp $
+% (c) The University of Glasgow, 1992-2002
%
\section[CLabel]{@CLabel@: Information to make C Labels}
mkClosureLabel,
mkSRTLabel,
+ mkSRTDescLabel,
mkInfoTableLabel,
- mkStdEntryLabel,
- mkFastEntryLabel,
+ mkEntryLabel,
+ mkSlowEntryLabel,
mkConEntryLabel,
mkStaticConEntryLabel,
mkRednCountsLabel,
mkConInfoTableLabel,
- mkStaticClosureLabel,
mkStaticInfoTableLabel,
mkApEntryLabel,
mkApInfoTableLabel,
mkAsmTempLabel,
+ mkModuleInitLabel,
+ mkPlainModuleInitLabel,
+
mkErrorStdEntryLabel,
- mkUpdEntryLabel,
+
+ mkStgUpdatePAPLabel,
+ mkSplitMarkerLabel,
+ mkUpdInfoLabel,
+ mkSeqInfoLabel,
+ mkIndInfoLabel,
+ mkIndStaticInfoLabel,
+ mkRtsGCEntryLabel,
+ mkMainCapabilityLabel,
+ mkCharlikeClosureLabel,
+ mkIntlikeClosureLabel,
+ mkMAP_FROZEN_infoLabel,
+ mkEMPTY_MVAR_infoLabel,
+
+ mkTopTickyCtrLabel,
mkBlackHoleInfoTableLabel,
+ mkBlackHoleBQInfoTableLabel,
+ mkCAFBlackHoleInfoTableLabel,
+ mkSECAFBlackHoleInfoTableLabel,
mkRtsPrimOpLabel,
+ moduleRegdLabel,
+
mkSelectorInfoLabel,
mkSelectorEntryLabel,
+ mkRtsApplyInfoLabel,
+ mkRtsApplyEntryLabel,
+
+ mkForeignLabel,
+
mkCC_Label, mkCCS_Label,
- needsCDecl, isReadOnly, isAsmTemp, externallyVisibleCLabel,
+ needsCDecl, isAsmTemp, externallyVisibleCLabel,
- CLabelType(..), labelType,
+ CLabelType(..), labelType, labelDynamic,
pprCLabel
-#if ! OMIT_NATIVE_CODEGEN
- , pprCLabel_asm
-#endif
) where
import {-# SOURCE #-} MachMisc ( underscorePrefix, fmtAsmLbl )
#endif
+import CmdLineOpts ( opt_Static, opt_DoTickyProfiling )
import CStrings ( pp_cSEP )
-import DataCon ( ConTag, DataCon )
-import Name ( Name, isExternallyVisibleName )
+import DataCon ( ConTag )
+import Module ( moduleName, moduleNameFS,
+ Module, isHomeModule )
+import Name ( Name, getName, isDllName, isExternalName )
import TyCon ( TyCon )
import Unique ( pprUnique, Unique )
-import PrimOp ( PrimOp, pprPrimOp )
+import PrimOp ( PrimOp )
import CostCentre ( CostCentre, CostCentreStack )
-import Util
import Outputable
+import FastString
\end{code}
things we want to find out:
| AsmTempLabel Unique
+ | ModuleInitLabel
+ Module -- the module name
+ String -- its "way"
+ -- at some point we might want some kind of version number in
+ -- the module init label, to guard against compiling modules in
+ -- the wrong order. We can't use the interface file version however,
+ -- because we don't always recompile modules which depend on a module
+ -- whose version has changed.
+
+ | PlainModuleInitLabel Module -- without the vesrion & way info
+
| RtsLabel RtsLabelInfo
+ | ForeignLabel FastString Bool -- a 'C' (or otherwise foreign) label
+ -- Bool <=> is dynamic
+
| CC_Label CostCentre
| CCS_Label CostCentreStack
\begin{code}
data IdLabelInfo
= Closure -- Label for (static???) closure
-
| SRT -- Static reference table
-
- | InfoTbl -- Info table for a closure; always read-only
-
- | EntryStd -- Thunk, or "slow", code entry point
-
- | EntryFast Int -- entry pt when no arg satisfaction chk needed;
- -- Int is the arity of the function (to be
- -- encoded into the name)
+ | SRTDesc -- Static reference table descriptor
+ | InfoTbl -- Info tables for closures; always read-only
+ | Entry -- entry point
+ | Slow -- slow entry point
-- Ticky-ticky counting
| RednCounts -- Label of place to keep reduction-count info for
-- this Id
+
+ | Bitmap -- A bitmap (function or case return)
+
deriving (Eq, Ord)
data DataConLabelInfo
= ConEntry -- the only kind of entry pt for constructors
| ConInfoTbl -- corresponding info table
-
- | StaticClosure -- Static constructor closure
- -- e.g., nullary constructor
| StaticConEntry -- static constructor entry point
| StaticInfoTbl -- corresponding info table
deriving (Eq, Ord)
| CaseVecTbl
| CaseAlt ConTag
| CaseDefault
- | CaseBitmap
deriving (Eq, Ord)
data RtsLabelInfo
= RtsShouldNeverHappenCode
- | RtsBlackHoleInfoTbl
+ | RtsBlackHoleInfoTbl LitString -- black hole with info table name
- | RtsUpdEntry
+ | RtsUpdInfo -- upd_frame_info
+ | RtsSeqInfo -- seq_frame_info
+ | RtsGCEntryLabel String -- a heap check fail handler, eg stg_chk_2
+ | RtsMainCapability -- MainCapability
+ | Rts_Closure String -- misc rts closures, eg CHARLIKE_closure
+ | Rts_Info String -- misc rts itbls, eg MUT_ARR_PTRS_FROZEN_info
+ | Rts_Code String -- misc rts code
| RtsSelectorInfoTbl Bool{-updatable-} Int{-offset-} -- Selector thunks
| RtsSelectorEntry Bool{-updatable-} Int{-offset-}
| RtsPrimOp PrimOp
+ | RtsTopTickyCtr
+
+ | RtsModuleRegd
+
+ | RtsApplyInfoLabel LitString
+ | RtsApplyEntryLabel LitString
+
deriving (Eq, Ord)
-- Label Type: for generating C declarations.
data CLabelType
- = InfoTblType
+ = RetInfoTblType
+ | InfoTblType
| ClosureType
| VecTblType
+ | ClosureTblType
| CodeType
| DataType
\end{code}
\begin{code}
mkClosureLabel id = IdLabel id Closure
mkSRTLabel id = IdLabel id SRT
-mkInfoTableLabel id = IdLabel id InfoTbl
-mkStdEntryLabel id = IdLabel id EntryStd
-mkFastEntryLabel id arity = ASSERT(arity > 0)
- IdLabel id (EntryFast arity)
-
+mkSRTDescLabel id = IdLabel id SRTDesc
+mkInfoTableLabel id = IdLabel id InfoTbl
+mkEntryLabel id = IdLabel id Entry
+mkSlowEntryLabel id = IdLabel id Slow
+mkBitmapLabel id = IdLabel id Bitmap
mkRednCountsLabel id = IdLabel id RednCounts
-mkStaticClosureLabel con = DataConLabel con StaticClosure
mkStaticInfoTableLabel con = DataConLabel con StaticInfoTbl
mkConInfoTableLabel con = DataConLabel con ConInfoTbl
mkConEntryLabel con = DataConLabel con ConEntry
mkVecTblLabel uniq = CaseLabel uniq CaseVecTbl
mkAltLabel uniq tag = CaseLabel uniq (CaseAlt tag)
mkDefaultLabel uniq = CaseLabel uniq CaseDefault
-mkBitmapLabel uniq = CaseLabel uniq CaseBitmap
+
mkClosureTblLabel tycon = TyConLabel tycon
mkAsmTempLabel = AsmTempLabel
+mkModuleInitLabel = ModuleInitLabel
+mkPlainModuleInitLabel = PlainModuleInitLabel
+
-- Some fixed runtime system labels
-mkErrorStdEntryLabel = RtsLabel RtsShouldNeverHappenCode
-mkUpdEntryLabel = RtsLabel RtsUpdEntry
-mkBlackHoleInfoTableLabel = RtsLabel RtsBlackHoleInfoTbl
+mkErrorStdEntryLabel = RtsLabel RtsShouldNeverHappenCode
+mkStgUpdatePAPLabel = RtsLabel (Rts_Code "stg_update_PAP")
+mkSplitMarkerLabel = RtsLabel (Rts_Code "__stg_split_marker")
+mkUpdInfoLabel = RtsLabel RtsUpdInfo
+mkSeqInfoLabel = RtsLabel RtsSeqInfo
+mkIndInfoLabel = RtsLabel (Rts_Info "stg_IND_info")
+mkIndStaticInfoLabel = RtsLabel (Rts_Info "stg_IND_STATIC_info")
+mkRtsGCEntryLabel str = RtsLabel (RtsGCEntryLabel str)
+mkMainCapabilityLabel = RtsLabel RtsMainCapability
+mkCharlikeClosureLabel = RtsLabel (Rts_Closure "stg_CHARLIKE_closure")
+mkIntlikeClosureLabel = RtsLabel (Rts_Closure "stg_INTLIKE_closure")
+mkMAP_FROZEN_infoLabel = RtsLabel (Rts_Info "stg_MUT_ARR_PTRS_FROZEN_info")
+mkEMPTY_MVAR_infoLabel = RtsLabel (Rts_Info "stg_EMPTY_MVAR_info")
+
+mkTopTickyCtrLabel = RtsLabel RtsTopTickyCtr
+mkBlackHoleInfoTableLabel = RtsLabel (RtsBlackHoleInfoTbl SLIT("stg_BLACKHOLE_info"))
+mkBlackHoleBQInfoTableLabel = RtsLabel (RtsBlackHoleInfoTbl SLIT("stg_BLACKHOLE_BQ_info"))
+mkCAFBlackHoleInfoTableLabel = RtsLabel (RtsBlackHoleInfoTbl SLIT("stg_CAF_BLACKHOLE_info"))
+mkSECAFBlackHoleInfoTableLabel = if opt_DoTickyProfiling then
+ RtsLabel (RtsBlackHoleInfoTbl SLIT("stg_SE_CAF_BLACKHOLE_info"))
+ else -- RTS won't have info table unless -ticky is on
+ panic "mkSECAFBlackHoleInfoTableLabel requires -ticky"
mkRtsPrimOpLabel primop = RtsLabel (RtsPrimOp primop)
+moduleRegdLabel = RtsLabel RtsModuleRegd
+
mkSelectorInfoLabel upd off = RtsLabel (RtsSelectorInfoTbl upd off)
mkSelectorEntryLabel upd off = RtsLabel (RtsSelectorEntry upd off)
mkApInfoTableLabel upd off = RtsLabel (RtsApInfoTbl upd off)
mkApEntryLabel upd off = RtsLabel (RtsApEntry upd off)
+ -- Foreign labels
+
+mkForeignLabel :: FastString -> Bool -> CLabel
+mkForeignLabel str is_dynamic = ForeignLabel str is_dynamic
+
-- Cost centres etc.
mkCC_Label cc = CC_Label cc
mkCCS_Label ccs = CCS_Label ccs
+
+-- Std RTS application routines
+
+mkRtsApplyInfoLabel = RtsLabel . RtsApplyInfoLabel
+mkRtsApplyEntryLabel = RtsLabel . RtsApplyEntryLabel
\end{code}
\begin{code}
needsCDecl :: CLabel -> Bool -- False <=> it's pre-declared; don't bother
-isReadOnly :: CLabel -> Bool -- lives in C "text space"
isAsmTemp :: CLabel -> Bool -- is a local temporary for native code generation
externallyVisibleCLabel :: CLabel -> Bool -- not C "static"
\end{code}
let-no-escapes, which can be recursive.
\begin{code}
+ -- don't bother declaring SRT & Bitmap labels, we always make sure
+ -- they are defined before use.
+needsCDecl (IdLabel _ SRT) = False
+needsCDecl (IdLabel _ SRTDesc) = False
+needsCDecl (IdLabel _ Bitmap) = False
needsCDecl (IdLabel _ _) = True
needsCDecl (CaseLabel _ CaseReturnPt) = True
needsCDecl (DataConLabel _ _) = True
-needsCDecl (CaseLabel _ _) = False
+needsCDecl (TyConLabel _) = True
+needsCDecl (ModuleInitLabel _ _) = True
+needsCDecl (PlainModuleInitLabel _) = True
+needsCDecl (CaseLabel _ _) = False
needsCDecl (AsmTempLabel _) = False
-needsCDecl (TyConLabel _) = False
needsCDecl (RtsLabel _) = False
+needsCDecl (ForeignLabel _ _) = False
needsCDecl (CC_Label _) = False
needsCDecl (CCS_Label _) = False
\end{code}
-Whether the labelled thing can be put in C "text space":
-
-\begin{code}
-isReadOnly (IdLabel _ InfoTbl) = True -- info-tables: yes
-isReadOnly (IdLabel _ other) = False -- others: pessimistically, no
-
-isReadOnly (DataConLabel _ _) = True -- and so on, for other
-isReadOnly (TyConLabel _) = True
-isReadOnly (CaseLabel _ _) = True
-isReadOnly (AsmTempLabel _) = True
-isReadOnly (RtsLabel _) = True
-isReadOnly (CC_Label _) = True
-isReadOnly (CCS_Label _) = True
-\end{code}
-
Whether the label is an assembler temporary:
\begin{code}
externallyVisibleCLabel (TyConLabel tc) = True
externallyVisibleCLabel (CaseLabel _ _) = False
externallyVisibleCLabel (AsmTempLabel _) = False
+externallyVisibleCLabel (ModuleInitLabel _ _)= True
+externallyVisibleCLabel (PlainModuleInitLabel _)= True
+externallyVisibleCLabel (RtsLabel RtsModuleRegd) = False --hack
externallyVisibleCLabel (RtsLabel _) = True
-externallyVisibleCLabel (IdLabel id _) = isExternallyVisibleName id
+externallyVisibleCLabel (ForeignLabel _ _) = True
+externallyVisibleCLabel (IdLabel id _) = isExternalName id
externallyVisibleCLabel (CC_Label _) = False -- not strictly true
externallyVisibleCLabel (CCS_Label _) = False -- not strictly true
\end{code}
-For generating correct types in label declarations...
+For generating correct types in label declarations, and also for
+deciding whether the C compiler would like us to use '&' before the
+label to get its address:
\begin{code}
labelType :: CLabel -> CLabelType
-labelType (RtsLabel RtsBlackHoleInfoTbl) = InfoTblType
+labelType (RtsLabel (RtsBlackHoleInfoTbl _)) = InfoTblType
labelType (RtsLabel (RtsSelectorInfoTbl _ _)) = InfoTblType
labelType (RtsLabel (RtsApInfoTbl _ _)) = InfoTblType
-labelType (CaseLabel _ CaseReturnInfo) = InfoTblType
+labelType (RtsLabel RtsUpdInfo) = RetInfoTblType
+labelType (RtsLabel RtsSeqInfo) = RetInfoTblType
+labelType (RtsLabel RtsTopTickyCtr) = CodeType -- XXX
+labelType (RtsLabel (Rts_Info _)) = InfoTblType
+labelType (RtsLabel (RtsApplyInfoLabel _)) = RetInfoTblType
+labelType (RtsLabel (RtsApplyEntryLabel _)) = CodeType
+labelType (CaseLabel _ CaseReturnInfo) = RetInfoTblType
labelType (CaseLabel _ CaseReturnPt) = CodeType
labelType (CaseLabel _ CaseVecTbl) = VecTblType
+labelType (TyConLabel _) = ClosureTblType
+labelType (ModuleInitLabel _ _) = CodeType
+labelType (PlainModuleInitLabel _) = CodeType
+labelType (CC_Label _) = CodeType -- hack
+labelType (CCS_Label _) = CodeType -- hack
labelType (IdLabel _ info) =
case info of
- InfoTbl -> InfoTblType
- Closure -> ClosureType
- _ -> CodeType
+ InfoTbl -> InfoTblType
+ Closure -> ClosureType
+ Bitmap -> DataType
+ _ -> CodeType
labelType (DataConLabel _ info) =
case info of
ConInfoTbl -> InfoTblType
StaticInfoTbl -> InfoTblType
- StaticClosure -> ClosureType
_ -> CodeType
labelType _ = DataType
\end{code}
+When referring to data in code, we need to know whether
+that data resides in a DLL or not. [Win32 only.]
+@labelDynamic@ returns @True@ if the label is located
+in a DLL, be it a data reference or not.
+
+\begin{code}
+labelDynamic :: CLabel -> Bool
+labelDynamic lbl =
+ case lbl of
+ -- The special case for RtsShouldNeverHappenCode is because the associated address is
+ -- NULL, i.e. not a DLL entry point
+ RtsLabel RtsShouldNeverHappenCode -> False
+ RtsLabel _ -> not opt_Static -- i.e., is the RTS in a DLL or not?
+ IdLabel n k -> isDllName n
+ DataConLabel n k -> isDllName n
+ TyConLabel tc -> isDllName (getName tc)
+ ForeignLabel _ d -> d
+ ModuleInitLabel m _ -> (not opt_Static) && (not (isHomeModule m))
+ PlainModuleInitLabel m -> (not opt_Static) && (not (isHomeModule m))
+ _ -> False
+\end{code}
+
+
OLD?: These GRAN functions are needed for spitting out GRAN_FETCH() at the
right places. It is used to detect when the abstractC statement of an
CCodeBlock actually contains the code for a slow entry point. -- HWL
info Info table
srt Static reference table
+ srtd Static reference table descriptor
entry Entry code
+ slow Slow entry code (if any)
ret Direct return address
vtbl Vector table
<n>_alt Case alternative (tag n)
dflt Default case alternative
btm Large bitmap vector
closure Static closure
- static_closure Static closure (???)
con_entry Dynamic Constructor entry code
con_info Dynamic Constructor info table
static_entry Static Constructor entry code
static_info Static Constructor info table
sel_info Selector info table
sel_entry Selector entry code
+ cc Cost centre
+ ccs Cost centre stack
\begin{code}
--- specialised for PprAsm: saves lots of arg passing in NCG
-#if ! OMIT_NATIVE_CODEGEN
-pprCLabel_asm = pprCLabel
-#endif
-
pprCLabel :: CLabel -> SDoc
#if ! OMIT_NATIVE_CODEGEN
= hcat [pprUnique u, pp_cSEP, int tag, pp_cSEP, ptext SLIT("alt")]
pprCLbl (CaseLabel u CaseDefault)
= hcat [pprUnique u, pp_cSEP, ptext SLIT("dflt")]
-pprCLbl (CaseLabel u CaseBitmap)
- = hcat [pprUnique u, pp_cSEP, ptext SLIT("btm")]
-pprCLbl (RtsLabel RtsShouldNeverHappenCode) = ptext SLIT("stg_error_entry")
+pprCLbl (RtsLabel RtsShouldNeverHappenCode) = ptext SLIT("NULL")
+-- used to be stg_error_entry but Windows can't have DLL entry points as static
+-- initialisers, and besides, this ShouldNeverHappen, right?
+
+pprCLbl (RtsLabel RtsUpdInfo) = ptext SLIT("stg_upd_frame_info")
+pprCLbl (RtsLabel RtsSeqInfo) = ptext SLIT("stg_seq_frame_info")
+pprCLbl (RtsLabel RtsMainCapability) = ptext SLIT("MainCapability")
+pprCLbl (RtsLabel (RtsGCEntryLabel str)) = text str
+pprCLbl (RtsLabel (Rts_Closure str)) = text str
+pprCLbl (RtsLabel (Rts_Info str)) = text str
+pprCLbl (RtsLabel (Rts_Code str)) = text str
-pprCLbl (RtsLabel RtsUpdEntry) = ptext SLIT("Upd_frame_entry")
+pprCLbl (RtsLabel RtsTopTickyCtr) = ptext SLIT("top_ct")
-pprCLbl (RtsLabel RtsBlackHoleInfoTbl) = ptext SLIT("CAF_BLACKHOLE_info")
+pprCLbl (RtsLabel (RtsBlackHoleInfoTbl info)) = ptext info
pprCLbl (RtsLabel (RtsSelectorInfoTbl upd_reqd offset))
- = hcat [ptext SLIT("__sel_"), text (show offset),
+ = hcat [ptext SLIT("stg_sel_"), text (show offset),
ptext (if upd_reqd
then SLIT("_upd_info")
else SLIT("_noupd_info"))
]
pprCLbl (RtsLabel (RtsSelectorEntry upd_reqd offset))
- = hcat [ptext SLIT("__sel_"), text (show offset),
+ = hcat [ptext SLIT("stg_sel_"), text (show offset),
ptext (if upd_reqd
then SLIT("_upd_entry")
else SLIT("_noupd_entry"))
]
pprCLbl (RtsLabel (RtsApInfoTbl upd_reqd arity))
- = hcat [ptext SLIT("__ap_"), text (show arity),
+ = hcat [ptext SLIT("stg_ap_"), text (show arity),
ptext (if upd_reqd
then SLIT("_upd_info")
else SLIT("_noupd_info"))
]
pprCLbl (RtsLabel (RtsApEntry upd_reqd arity))
- = hcat [ptext SLIT("__ap_"), text (show arity),
+ = hcat [ptext SLIT("stg_ap_"), text (show arity),
ptext (if upd_reqd
then SLIT("_upd_entry")
else SLIT("_noupd_entry"))
]
+pprCLbl (RtsLabel (RtsApplyInfoLabel fs))
+ = ptext SLIT("stg_ap_") <> ptext fs <> ptext SLIT("_info")
+
+pprCLbl (RtsLabel (RtsApplyEntryLabel fs))
+ = ptext SLIT("stg_ap_") <> ptext fs <> ptext SLIT("_ret")
+
pprCLbl (RtsLabel (RtsPrimOp primop))
- = pprPrimOp primop <> ptext SLIT("_fast")
+ = ppr primop <> ptext SLIT("_fast")
+
+pprCLbl (RtsLabel RtsModuleRegd)
+ = ptext SLIT("module_registered")
+
+pprCLbl (ForeignLabel str _)
+ = ftext str
pprCLbl (TyConLabel tc)
= hcat [ppr tc, pp_cSEP, ptext SLIT("closure_tbl")]
pprCLbl (CC_Label cc) = ppr cc
pprCLbl (CCS_Label ccs) = ppr ccs
+pprCLbl (ModuleInitLabel mod way)
+ = ptext SLIT("__stginit_") <> ftext (moduleNameFS (moduleName mod))
+ <> char '_' <> text way
+pprCLbl (PlainModuleInitLabel mod)
+ = ptext SLIT("__stginit_") <> ftext (moduleNameFS (moduleName mod))
+
ppIdFlavor :: IdLabelInfo -> SDoc
ppIdFlavor x = pp_cSEP <>
(case x of
Closure -> ptext SLIT("closure")
SRT -> ptext SLIT("srt")
- InfoTbl -> ptext SLIT("info")
- EntryStd -> ptext SLIT("entry")
- EntryFast arity -> --false:ASSERT (arity > 0)
- (<>) (ptext SLIT("fast")) (int arity)
+ SRTDesc -> ptext SLIT("srtd")
+ InfoTbl -> ptext SLIT("info")
+ Entry -> ptext SLIT("entry")
+ Slow -> ptext SLIT("slow")
RednCounts -> ptext SLIT("ct")
+ Bitmap -> ptext SLIT("btm")
)
ppConFlavor x = pp_cSEP <>
(case x of
- StaticClosure -> ptext SLIT("static_closure")
ConEntry -> ptext SLIT("con_entry")
ConInfoTbl -> ptext SLIT("con_info")
StaticConEntry -> ptext SLIT("static_entry")
StaticInfoTbl -> ptext SLIT("static_info")
)
\end{code}
-