summaryrefslogtreecommitdiff
path: root/compiler/profiling/ProfInit.hs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/profiling/ProfInit.hs')
-rw-r--r--compiler/profiling/ProfInit.hs50
1 files changed, 34 insertions, 16 deletions
diff --git a/compiler/profiling/ProfInit.hs b/compiler/profiling/ProfInit.hs
index 9add61e561..931299a655 100644
--- a/compiler/profiling/ProfInit.hs
+++ b/compiler/profiling/ProfInit.hs
@@ -8,11 +8,12 @@
module ProfInit (profilingInitCode) where
+import GhcPrelude
+
import CLabel
import CostCentre
import DynFlags
import Outputable
-import FastString
import Module
-- -----------------------------------------------------------------------------
@@ -22,25 +23,42 @@ import Module
-- module;
profilingInitCode :: Module -> CollectedCCs -> SDoc
-profilingInitCode this_mod (local_CCs, ___extern_CCs, singleton_CCSs)
+profilingInitCode this_mod (local_CCs, singleton_CCSs)
= sdocWithDynFlags $ \dflags ->
if not (gopt Opt_SccProfilingOn dflags)
then empty
else vcat
- [ text "static void prof_init_" <> ppr this_mod
- <> text "(void) __attribute__((constructor));"
- , text "static void prof_init_" <> ppr this_mod <> text "(void)"
- , braces (vcat (
- map emitRegisterCC local_CCs ++
- map emitRegisterCCS singleton_CCSs
- ))
- ]
+ $ map emit_cc_decl local_CCs
+ ++ map emit_ccs_decl singleton_CCSs
+ ++ [emit_cc_list local_CCs]
+ ++ [emit_ccs_list singleton_CCSs]
+ ++ [ text "static void prof_init_" <> ppr this_mod
+ <> text "(void) __attribute__((constructor));"
+ , text "static void prof_init_" <> ppr this_mod <> text "(void)"
+ , braces (vcat
+ [ text "registerCcList" <> parens local_cc_list_label <> semi
+ , text "registerCcsList" <> parens singleton_cc_list_label <> semi
+ ])
+ ]
where
- emitRegisterCC cc =
- text "extern CostCentre " <> cc_lbl <> ptext (sLit "[];") $$
- text "REGISTER_CC(" <> cc_lbl <> char ')' <> semi
+ emit_cc_decl cc =
+ text "extern CostCentre" <+> cc_lbl <> text "[];"
where cc_lbl = ppr (mkCCLabel cc)
- emitRegisterCCS ccs =
- text "extern CostCentreStack " <> ccs_lbl <> ptext (sLit "[];") $$
- text "REGISTER_CCS(" <> ccs_lbl <> char ')' <> semi
+ local_cc_list_label = text "local_cc_" <> ppr this_mod
+ emit_cc_list ccs =
+ text "static CostCentre *" <> local_cc_list_label <> text "[] ="
+ <+> braces (vcat $ [ ppr (mkCCLabel cc) <> comma
+ | cc <- ccs
+ ] ++ [text "NULL"])
+ <> semi
+
+ emit_ccs_decl ccs =
+ text "extern CostCentreStack" <+> ccs_lbl <> text "[];"
where ccs_lbl = ppr (mkCCSLabel ccs)
+ singleton_cc_list_label = text "singleton_cc_" <> ppr this_mod
+ emit_ccs_list ccs =
+ text "static CostCentreStack *" <> singleton_cc_list_label <> text "[] ="
+ <+> braces (vcat $ [ ppr (mkCCSLabel cc) <> comma
+ | cc <- ccs
+ ] ++ [text "NULL"])
+ <> semi