Lightweight ticky-ticky profiling
[ghc-hetmet.git] / compiler / main / StaticFlags.hs
index 68c50c8..53957e7 100644 (file)
@@ -27,6 +27,10 @@ module StaticFlags (
        opt_SccProfilingOn,
        opt_DoTickyProfiling,
 
+        -- Hpc opts
+       opt_Hpc,
+        opt_Hpc_Tracer,
+
        -- language opts
        opt_DictsStrict,
        opt_IrrefutableTuples,
@@ -37,7 +41,6 @@ module StaticFlags (
        -- optimisation opts
        opt_NoMethodSharing, 
        opt_NoStateHack,
-       opt_LiberateCaseThreshold,
        opt_CprOff,
        opt_RulesOff,
        opt_SimplNoPreInlining,
@@ -94,7 +97,7 @@ parseStaticFlags args = do
   when (not (null errs)) $ throwDyn (UsageError (unlines errs))
 
     -- deal with the way flags: the way (eg. prof) gives rise to
-    -- futher flags, some of which might be static.
+    -- further flags, some of which might be static.
   way_flags <- findBuildTag
 
     -- if we're unregisterised, add some more flags
@@ -150,6 +153,11 @@ static_flags = [
   ,  ( "dppr-user-length", AnySuffix addOpt )
       -- rest of the debugging flags are dynamic
 
+       --------- Haskell Program Coverage -----------------------------------
+
+  ,  ( "fhpc"           , PassFlag addOpt )
+  ,  ( "fhpc-tracer"    , PassFlag addOpt )
+
        --------- Profiling --------------------------------------------------
   ,  ( "auto-all"      , NoArg (addOpt "-fauto-sccs-on-all-toplevs") )
   ,  ( "auto"          , NoArg (addOpt "-fauto-sccs-on-exported-toplevs") )
@@ -264,6 +272,13 @@ opt_AutoSccsOnIndividualCafs       = lookUp  FSLIT("-fauto-sccs-on-individual-cafs")
 opt_SccProfilingOn             = lookUp  FSLIT("-fscc-profiling")
 opt_DoTickyProfiling           = lookUp  FSLIT("-fticky-ticky")
 
+
+-- Hpc opts
+
+opt_Hpc                                = lookUp FSLIT("-fhpc")  
+                                 || opt_Hpc_Tracer 
+opt_Hpc_Tracer                 = lookUp FSLIT("-fhpc-tracer")
+
 -- language opts
 opt_DictsStrict                        = lookUp  FSLIT("-fdicts-strict")
 opt_IrrefutableTuples          = lookUp  FSLIT("-firrefutable-tuples")
@@ -276,7 +291,6 @@ opt_NoMethodSharing         = lookUp  FSLIT("-fno-method-sharing")
 opt_CprOff                     = lookUp  FSLIT("-fcpr-off")
 opt_RulesOff                   = lookUp  FSLIT("-frules-off")
        -- Switch off CPR analysis in the new demand analyser
-opt_LiberateCaseThreshold      = lookup_def_int "-fliberate-case-threshold" (10::Int)
 opt_MaxWorkerArgs              = lookup_def_int "-fmax-worker-args" (10::Int)
 
 opt_GranMacros                 = lookUp  FSLIT("-fgransim")
@@ -300,7 +314,11 @@ opt_UF_UpdateInPlace               = lookUp  FSLIT("-funfolding-update-in-place")
 
 opt_UF_DearOp   = ( 4 :: Int)
                        
+#if darwin_TARGET_OS && x86_64_TARGET_ARCH
+opt_PIC                         = True
+#else
 opt_PIC                         = lookUp FSLIT("-fPIC")
+#endif
 opt_Static                     = lookUp  FSLIT("-static")
 opt_Unregisterised             = lookUp  FSLIT("-funregisterised")
 
@@ -471,7 +489,8 @@ findBuildTag :: IO [String]  -- new options
 findBuildTag = do
   way_names <- readIORef v_Ways
   let ws = sort (nub way_names)
-  if not (allowed_combination ws)
+  res <-
+    if not (allowed_combination ws)
       then throwDyn (CmdLineError $
                    "combination not supported: "  ++
                    foldr1 (\a b -> a ++ '/':b) 
@@ -485,6 +504,15 @@ findBuildTag = do
           writeIORef v_RTS_Build_tag rts_tag
           return (concat flags)
 
+  -- krc: horrible, I know.
+  (if opt_DoTickyProfiling then do
+                  writeIORef v_RTS_Build_tag (mkBuildTag [(lkupWay WayTicky)])
+                  return (res ++ (wayOpts (lkupWay WayTicky)))
+   else
+                  return res)
+
+
+
 mkBuildTag :: [Way] -> String
 mkBuildTag ways = concat (intersperse "_" (map wayTag ways))