X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=compiler%2FbasicTypes%2FBasicTypes.lhs;h=fad6533144b2003ed16dc47a3d18cafe7ff61a07;hb=6d65a616ca845f7d574af8da8a8c183f24f40caa;hp=04ed8fa14109bbfe9bb9e10071998a981888efab;hpb=497302c44ad08c6c27d0e15d94a787f332c0cfec;p=ghc-hetmet.git diff --git a/compiler/basicTypes/BasicTypes.lhs b/compiler/basicTypes/BasicTypes.lhs index 04ed8fa..fad6533 100644 --- a/compiler/basicTypes/BasicTypes.lhs +++ b/compiler/basicTypes/BasicTypes.lhs @@ -55,6 +55,10 @@ module BasicTypes( CompilerPhase, Activation(..), isActive, isNeverActive, isAlwaysActive, + RuleMatchInfo(..), isConLike, isFunLike, + InlinePragma(..), defaultInlinePragma, isDefaultInlinePragma, + inlinePragmaActivation, inlinePragmaRuleMatchInfo, + setInlinePragmaActivation, setInlinePragmaRuleMatchInfo, InlineSpec(..), defaultInlineSpec, alwaysInlineSpec, neverInlineSpec, SuccessFlag(..), succeeded, failed, successIf @@ -580,35 +584,94 @@ data Activation = NeverActive | ActiveAfter CompilerPhase -- Active in this phase and later deriving( Eq ) -- Eq used in comparing rules in HsDecls +data RuleMatchInfo = ConLike + | FunLike + deriving( Eq ) + +isConLike :: RuleMatchInfo -> Bool +isConLike ConLike = True +isConLike _ = False + +isFunLike :: RuleMatchInfo -> Bool +isFunLike FunLike = True +isFunLike _ = False + +data InlinePragma + = InlinePragma + Activation -- Says during which phases inlining is allowed + RuleMatchInfo -- Should the function be treated like a constructor? + deriving( Eq ) + +defaultInlinePragma :: InlinePragma +defaultInlinePragma = InlinePragma AlwaysActive FunLike + +isDefaultInlinePragma :: InlinePragma -> Bool +isDefaultInlinePragma (InlinePragma activation match_info) + = isAlwaysActive activation && isFunLike match_info + +inlinePragmaActivation :: InlinePragma -> Activation +inlinePragmaActivation (InlinePragma activation _) = activation + +inlinePragmaRuleMatchInfo :: InlinePragma -> RuleMatchInfo +inlinePragmaRuleMatchInfo (InlinePragma _ info) = info + +setInlinePragmaActivation :: InlinePragma -> Activation -> InlinePragma +setInlinePragmaActivation (InlinePragma _ info) activation + = InlinePragma activation info + +setInlinePragmaRuleMatchInfo :: InlinePragma -> RuleMatchInfo -> InlinePragma +setInlinePragmaRuleMatchInfo (InlinePragma activation _) info + = InlinePragma activation info + data InlineSpec - = Inline - Activation -- Says during which phases inlining is allowed + = Inline + InlinePragma Bool -- True <=> INLINE -- False <=> NOINLINE deriving( Eq ) -defaultInlineSpec, alwaysInlineSpec, neverInlineSpec :: InlineSpec +defaultInlineSpec :: InlineSpec +alwaysInlineSpec, neverInlineSpec :: RuleMatchInfo -> InlineSpec -defaultInlineSpec = Inline AlwaysActive False -- Inlining is OK, but not forced -alwaysInlineSpec = Inline AlwaysActive True -- INLINE always -neverInlineSpec = Inline NeverActive False -- NOINLINE +defaultInlineSpec = Inline defaultInlinePragma False + -- Inlining is OK, but not forced +alwaysInlineSpec match_info + = Inline (InlinePragma AlwaysActive match_info) True + -- INLINE always +neverInlineSpec match_info + = Inline (InlinePragma NeverActive match_info) False + -- NOINLINE instance Outputable Activation where ppr NeverActive = ptext (sLit "NEVER") ppr AlwaysActive = ptext (sLit "ALWAYS") ppr (ActiveBefore n) = brackets (char '~' <> int n) ppr (ActiveAfter n) = brackets (int n) + +instance Outputable RuleMatchInfo where + ppr ConLike = ptext (sLit "CONLIKE") + ppr FunLike = ptext (sLit "FUNLIKE") + +instance Outputable InlinePragma where + ppr (InlinePragma activation FunLike) + = ppr activation + ppr (InlinePragma activation match_info) + = ppr match_info <+> ppr activation instance Outputable InlineSpec where - ppr (Inline act is_inline) + ppr (Inline (InlinePragma act match_info) is_inline) | is_inline = ptext (sLit "INLINE") - <> case act of - AlwaysActive -> empty - _ -> ppr act + <+> ppr_match_info + <+> case act of + AlwaysActive -> empty + _ -> ppr act | otherwise = ptext (sLit "NOINLINE") - <> case act of - NeverActive -> empty - _ -> ppr act + <+> ppr_match_info + <+> case act of + NeverActive -> empty + _ -> ppr act + where + ppr_match_info = if isFunLike match_info then empty else ppr match_info isActive :: CompilerPhase -> Activation -> Bool isActive _ NeverActive = False