Fix #249 (-caf-all bugs)
authorSimon Marlow <simonmar@microsoft.com>
Wed, 28 Feb 2007 15:50:09 +0000 (15:50 +0000)
committerSimon Marlow <simonmar@microsoft.com>
Wed, 28 Feb 2007 15:50:09 +0000 (15:50 +0000)
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.

compiler/profiling/CostCentre.lhs
compiler/profiling/SCCfinal.lhs

index 56fde05..bc3a5d1 100644 (file)
@@ -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, 
index d27a3a0..7aaf109 100644 (file)
@@ -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_`