Commit e07e2550 authored by Simon Marlow's avatar Simon Marlow
Browse files

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.
parent dce3fd4e
...@@ -32,7 +32,7 @@ module CostCentre ( ...@@ -32,7 +32,7 @@ module CostCentre (
#include "HsVersions.h" #include "HsVersions.h"
import Var ( Id ) import Var ( Id )
import Name ( getOccName, occNameFS ) import Name
import Module ( Module ) import Module ( Module )
import Outputable import Outputable
import FastTypes import FastTypes
...@@ -206,9 +206,16 @@ mkUserCC cc_name mod ...@@ -206,9 +206,16 @@ mkUserCC cc_name mod
mkAutoCC :: Id -> Module -> IsCafCC -> CostCentre mkAutoCC :: Id -> Module -> IsCafCC -> CostCentre
mkAutoCC id mod is_caf 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 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 } mkAllCafsCC m = AllCafsCC { cc_mod = m }
...@@ -359,7 +366,7 @@ pp_caf other = empty ...@@ -359,7 +366,7 @@ pp_caf other = empty
ppCostCentreLbl (NoCostCentre) = text "NONE_cc" ppCostCentreLbl (NoCostCentre) = text "NONE_cc"
ppCostCentreLbl (AllCafsCC {cc_mod = m}) = ppr m <> text "_CAFs_cc" ppCostCentreLbl (AllCafsCC {cc_mod = m}) = ppr m <> text "_CAFs_cc"
ppCostCentreLbl (NormalCC {cc_name = n, cc_mod = m, cc_is_caf = is_caf}) 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" text (case is_caf of { CafCC -> "_CAF"; _ -> "" }) <> text "_cc"
-- This is the name to go in the user-displayed string, -- This is the name to go in the user-displayed string,
......
...@@ -32,7 +32,8 @@ import StgSyn ...@@ -32,7 +32,8 @@ import StgSyn
import PackageConfig ( PackageId ) import PackageConfig ( PackageId )
import StaticFlags ( opt_AutoSccsOnIndividualCafs ) import StaticFlags ( opt_AutoSccsOnIndividualCafs )
import CostCentre -- lots of things import CostCentre -- lots of things
import Id ( Id ) import Id
import Name
import Module ( Module ) import Module ( Module )
import UniqSupply ( splitUniqSupply, UniqSupply ) import UniqSupply ( splitUniqSupply, UniqSupply )
#ifdef PROF_DO_BOXING #ifdef PROF_DO_BOXING
...@@ -128,8 +129,13 @@ stgMassageForProfiling this_pkg mod_name us stg_binds ...@@ -128,8 +129,13 @@ stgMassageForProfiling this_pkg mod_name us stg_binds
-- Top level CAF without a cost centre attached -- Top level CAF without a cost centre attached
-- Attach CAF cc (collect if individual CAF ccs) -- Attach CAF cc (collect if individual CAF ccs)
= (if opt_AutoSccsOnIndividualCafs = (if opt_AutoSccsOnIndividualCafs
then let cc = mkAutoCC binder mod_name CafCC then let cc = mkAutoCC binder modl CafCC
ccs = mkSingletonCCS cc 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 in
collectCC cc `thenMM_` collectCC cc `thenMM_`
collectCCS ccs `thenMM_` collectCCS ccs `thenMM_`
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment