+{-# OPTIONS -w #-}
+-- The above warning supression flag is a temporary kludge.
+-- While working on this module you are encouraged to remove it and fix
+-- any warnings in the module. See
+-- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
+-- for details
+
-----------------------------------------------------------------------------
--
-- Object-file symbols (called CLabel for histerical raisins).
--
-----------------------------------------------------------------------------
-{-# OPTIONS_GHC -w #-}
--- The above warning supression flag is a temporary kludge.
--- While working on this module you are encouraged to remove it and fix
--- any warnings in the module. See
--- http://hackage.haskell.org/trac/ghc/wiki/WorkingConventions#Warnings
--- for details
-
module CLabel (
CLabel, -- abstract type
mkRtsApFastLabel,
mkForeignLabel,
+ addLabelSize,
mkCCLabel, mkCCSLabel,
infoLblToEntryLbl, entryLblToInfoLbl,
needsCDecl, isAsmTemp, maybeAsmTemp, externallyVisibleCLabel,
+ isMathFun,
CLabelType(..), labelType, labelDynamic,
pprCLabel
mkDefaultLabel uniq = CaseLabel uniq CaseDefault
mkStringLitLabel = StringLitLabel
-mkAsmTempLabel = AsmTempLabel
+mkAsmTempLabel :: Uniquable a => a -> CLabel
+mkAsmTempLabel a = AsmTempLabel (getUnique a)
mkModuleInitLabel :: Module -> String -> CLabel
mkModuleInitLabel mod way = ModuleInitLabel mod way
mkForeignLabel :: FastString -> Maybe Int -> Bool -> CLabel
mkForeignLabel str mb_sz is_dynamic = ForeignLabel str mb_sz is_dynamic
+addLabelSize :: CLabel -> Int -> CLabel
+addLabelSize (ForeignLabel str _ is_dynamic) sz
+ = ForeignLabel str (Just sz) is_dynamic
+addLabelSize label _
+ = label
+
-- Cost centres etc.
mkCCLabel cc = CC_Label cc
needsCDecl (StringLitLabel _) = False
needsCDecl (AsmTempLabel _) = False
needsCDecl (RtsLabel _) = False
-needsCDecl (ForeignLabel _ _ _) = False
+ -- RTS labels are declared in RTS header files. Otherwise we'd need
+ -- to give types for each label reference in the RTS .cmm files
+ -- somehow; when generating .cmm code we know the types of labels (info,
+ -- entry etc.) but for hand-written .cmm code we don't.
+needsCDecl l@(ForeignLabel _ _ _) = not (isMathFun l)
needsCDecl (CC_Label _) = True
needsCDecl (CCS_Label _) = True
needsCDecl (HpcTicksLabel _) = True
maybeAsmTemp (AsmTempLabel uq) = Just uq
maybeAsmTemp _ = Nothing
+-- some labels have C prototypes in scope when compiling via C, because
+-- they are builtin to the C compiler. For these labels we avoid
+-- generating our own C prototypes.
+isMathFun :: CLabel -> Bool
+isMathFun (ForeignLabel fs _ _) = fs `elem` math_funs
+ where
+ math_funs = [
+ FSLIT("pow"), FSLIT("sin"), FSLIT("cos"),
+ FSLIT("tan"), FSLIT("sinh"), FSLIT("cosh"),
+ FSLIT("tanh"), FSLIT("asin"), FSLIT("acos"),
+ FSLIT("atan"), FSLIT("log"), FSLIT("exp"),
+ FSLIT("sqrt"), FSLIT("powf"), FSLIT("sinf"),
+ FSLIT("cosf"), FSLIT("tanf"), FSLIT("sinhf"),
+ FSLIT("coshf"), FSLIT("tanhf"), FSLIT("asinf"),
+ FSLIT("acosf"), FSLIT("atanf"), FSLIT("logf"),
+ FSLIT("expf"), FSLIT("sqrtf")
+ ]
+isMathFun _ = False
+
-- -----------------------------------------------------------------------------
-- Is a CLabel visible outside this object file or not?