#include "HsVersions.h"
import DynFlags ( DynFlag(..), DynFlags(..), dopt, GhcMode(..) )
-import StaticFlags ( opt_SccProfilingOn )
+import StaticFlags ( opt_SccProfilingOn,
+ opt_AutoSccsOnAllToplevs,
+ opt_AutoSccsOnExportedToplevs )
import DriverPhases ( isHsBoot )
import HscTypes ( ModGuts(..), HscEnv(..),
Dependencies(..), ForeignStubs(..), TypeEnv, IsBootInterface )
tcg_binds = binds,
tcg_fords = fords,
tcg_rules = rules,
- tcg_insts = insts })
+ tcg_insts = insts,
+ tcg_fam_insts = fam_insts })
= do { showPass dflags "Desugar"
-- Desugar the program
+ ; let auto_scc = mkAutoScc mod exports
+
; mb_res <- case ghcMode dflags of
JustTypecheck -> return (Just ([], [], NoStubs))
_ -> initDs hsc_env mod rdr_env type_env $ do
{ -- Add export flags to bindings
keep_alive <- readIORef keep_var
; let final_prs = addExportFlags ghci_mode exports keep_alive
- all_prs ds_rules
+ all_prs ds_rules
ds_binds = [Rec final_prs]
-- Notice that we put the whole lot in a big Rec, even the foreign binds
-- When compiling PrelFloat, which defines data Float = F# Float#
-- sort to get into canonical order
mod_guts = ModGuts {
- mg_module = mod,
- mg_boot = isHsBoot hsc_src,
- mg_exports = exports,
- mg_deps = deps,
- mg_usages = usages,
- mg_dir_imps = [m | (m,_,_) <- moduleEnvElts dir_imp_mods],
- mg_rdr_env = rdr_env,
- mg_fix_env = fix_env,
- mg_deprecs = deprecs,
- mg_types = type_env,
- mg_insts = insts,
- mg_rules = ds_rules,
- mg_binds = ds_binds,
- mg_foreign = ds_fords }
+ mg_module = mod,
+ mg_boot = isHsBoot hsc_src,
+ mg_exports = exports,
+ mg_deps = deps,
+ mg_usages = usages,
+ mg_dir_imps = [m | (m,_,_) <- moduleEnvElts dir_imp_mods],
+ mg_rdr_env = rdr_env,
+ mg_fix_env = fix_env,
+ mg_deprecs = deprecs,
+ mg_types = type_env,
+ mg_insts = insts,
+ mg_fam_insts = fam_insts,
+ mg_rules = ds_rules,
+ mg_binds = ds_binds,
+ mg_foreign = ds_fords }
; return (Just mod_guts)
}}}
where
dflags = hsc_dflags hsc_env
ghci_mode = ghcMode (hsc_dflags hsc_env)
- auto_scc | opt_SccProfilingOn = TopLevel
- | otherwise = NoSccs
+
+mkAutoScc :: Module -> NameSet -> AutoScc
+mkAutoScc mod exports
+ | not opt_SccProfilingOn -- No profiling
+ = NoSccs
+ | opt_AutoSccsOnAllToplevs -- Add auto-scc on all top-level things
+ = AddSccs mod (\id -> True)
+ | opt_AutoSccsOnExportedToplevs -- Only on exported things
+ = AddSccs mod (\id -> idName id `elemNameSet` exports)
+ | otherwise
+ = NoSccs
+
deSugarExpr :: HscEnv
-> Module -> GlobalRdrEnv -> TypeEnv