summaryrefslogtreecommitdiff
path: root/compiler/profiling
diff options
context:
space:
mode:
authorSimon Marlow <simonmar@microsoft.com>2007-02-28 15:50:09 +0000
committerSimon Marlow <simonmar@microsoft.com>2007-02-28 15:50:09 +0000
commite07e2550074ddc7d96e2092e56add418403bd29a (patch)
treeb3017d2d151644f020d8b83e01864baf236dc50e /compiler/profiling
parentdce3fd4efcb90f61b115a400559ef687a11f2c53 (diff)
downloadhaskell-e07e2550074ddc7d96e2092e56add418403bd29a.tar.gz
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.
Diffstat (limited to 'compiler/profiling')
-rw-r--r--compiler/profiling/CostCentre.lhs13
-rw-r--r--compiler/profiling/SCCfinal.lhs10
2 files changed, 18 insertions, 5 deletions
diff --git a/compiler/profiling/CostCentre.lhs b/compiler/profiling/CostCentre.lhs
index 56fde05608..bc3a5d169d 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 d27a3a0c4a..7aaf109697 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_`