From: Simon Marlow Date: Wed, 28 Feb 2007 15:50:09 +0000 (+0000) Subject: Fix #249 (-caf-all bugs) X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=e07e2550074ddc7d96e2092e56add418403bd29a Fix #249 (-caf-all bugs) There were two bugs: * we were generating the symbol name for the CAF cost centre from the OccName, which isn't unique enough in the case of system-generated non-external names * :Main.main caused problems, because we were assuming that every top-level CAF was from the current module. --- diff --git a/compiler/profiling/CostCentre.lhs b/compiler/profiling/CostCentre.lhs index 56fde05..bc3a5d1 100644 --- a/compiler/profiling/CostCentre.lhs +++ b/compiler/profiling/CostCentre.lhs @@ -32,7 +32,7 @@ module CostCentre ( #include "HsVersions.h" import Var ( Id ) -import Name ( getOccName, occNameFS ) +import Name import Module ( Module ) import Outputable import FastTypes @@ -206,9 +206,16 @@ mkUserCC cc_name mod mkAutoCC :: Id -> Module -> IsCafCC -> CostCentre mkAutoCC id mod is_caf - = NormalCC { cc_name = occNameFS (getOccName id), cc_mod = mod, + = NormalCC { cc_name = str, cc_mod = mod, cc_is_dupd = OriginalCC, cc_is_caf = is_caf } + where + name = getName id + -- beware: we might be making an auto CC for a compiler-generated + -- thing (like a CAF when -caf-all is on), so include the uniq. + -- See bug #249, tests prof001, prof002 + str | isSystemName name = mkFastString (showSDoc (ppr name)) + | otherwise = occNameFS (getOccName id) mkAllCafsCC m = AllCafsCC { cc_mod = m } @@ -359,7 +366,7 @@ pp_caf other = empty ppCostCentreLbl (NoCostCentre) = text "NONE_cc" ppCostCentreLbl (AllCafsCC {cc_mod = m}) = ppr m <> text "_CAFs_cc" ppCostCentreLbl (NormalCC {cc_name = n, cc_mod = m, cc_is_caf = is_caf}) - = ppr m <> ftext (zEncodeFS n) <> + = ppr m <> char '_' <> ftext (zEncodeFS n) <> text (case is_caf of { CafCC -> "_CAF"; _ -> "" }) <> text "_cc" -- This is the name to go in the user-displayed string, diff --git a/compiler/profiling/SCCfinal.lhs b/compiler/profiling/SCCfinal.lhs index d27a3a0..7aaf109 100644 --- a/compiler/profiling/SCCfinal.lhs +++ b/compiler/profiling/SCCfinal.lhs @@ -32,7 +32,8 @@ import StgSyn import PackageConfig ( PackageId ) import StaticFlags ( opt_AutoSccsOnIndividualCafs ) import CostCentre -- lots of things -import Id ( Id ) +import Id +import Name import Module ( Module ) import UniqSupply ( splitUniqSupply, UniqSupply ) #ifdef PROF_DO_BOXING @@ -128,8 +129,13 @@ stgMassageForProfiling this_pkg mod_name us stg_binds -- Top level CAF without a cost centre attached -- Attach CAF cc (collect if individual CAF ccs) = (if opt_AutoSccsOnIndividualCafs - then let cc = mkAutoCC binder mod_name CafCC + then let cc = mkAutoCC binder modl CafCC ccs = mkSingletonCCS cc + -- careful: the binder might be :Main.main, + -- which doesn't belong to module mod_name. + -- bug #249, tests prof001, prof002 + modl | Just m <- nameModule_maybe (idName binder) = m + | otherwise = mod_name in collectCC cc `thenMM_` collectCCS ccs `thenMM_`