From af37b3001b086f39cbf1fe3ea2aa5c37f4f9a34f Mon Sep 17 00:00:00 2001 From: "simonpj@microsoft.com" Date: Mon, 15 Sep 2008 15:49:08 +0000 Subject: [PATCH] Improve warning for SpecConstr --- compiler/specialise/SpecConstr.lhs | 13 +++++++++---- compiler/utils/Util.lhs | 9 +++++++++ 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/compiler/specialise/SpecConstr.lhs b/compiler/specialise/SpecConstr.lhs index 7eb3529..bdd9a16 100644 --- a/compiler/specialise/SpecConstr.lhs +++ b/compiler/specialise/SpecConstr.lhs @@ -36,6 +36,7 @@ import Name import OccName ( mkSpecOcc ) import ErrUtils ( dumpIfSet_dyn ) import DynFlags ( DynFlags(..), DynFlag(..) ) +import StaticFlags ( opt_PprStyle_Debug ) import StaticFlags ( opt_SpecInlineJoinPoints ) import BasicTypes ( Activation(..) ) import Maybes ( orElse, catMaybes, isJust, isNothing ) @@ -1021,10 +1022,14 @@ specialise env bind_calls (fn, arg_bndrs, body, arg_occs) ; let spec_count' = length pats + spec_count ; case sc_count env of Just max | spec_count' > max - -> pprTrace "SpecConstr: too many specialisations for one function (see -fspec-constr-count):" - (vcat [ptext (sLit "Function:") <+> ppr fn, - ptext (sLit "Specialisations:") <+> ppr (pats ++ [p | OS p _ _ _ <- specs])]) - return (nullUsage, spec_info) + -> WARN( True, msg ) return (nullUsage, spec_info) + where + msg = vcat [ sep [ ptext (sLit "SpecConstr: specialisation of") <+> quotes (ppr fn) + , nest 2 (ptext (sLit "limited by bound of")) <+> int max ] + , ptext (sLit "Use -fspec-constr-count=n to set the bound") + , extra ] + extra | not opt_PprStyle_Debug = ptext (sLit "Use -dppr-debug to see specialisations") + | otherwise = ptext (sLit "Specialisations:") <+> ppr (pats ++ [p | OS p _ _ _ <- specs]) _normal_case -> do { diff --git a/compiler/utils/Util.lhs b/compiler/utils/Util.lhs index 4058a97..db6f96a 100644 --- a/compiler/utils/Util.lhs +++ b/compiler/utils/Util.lhs @@ -107,6 +107,15 @@ infixr 9 `thenCmp` %* * %************************************************************************ +These booleans are global constants, set by CPP flags. They allow us to +recompile a single module (this one) to change whether or not debug output +appears. They sometimes let us avoid even running CPP elsewhere. + +It's important that the flags are literal constants (True/False). Then, +with -0, tests of the flags in other modules will simplify to the correct +branch of the conditional, thereby dropping debug code altogether when +the flags are off. + \begin{code} ghciSupported :: Bool #ifdef GHCI -- 1.7.10.4