) where
#include "HsVersions.h"
-#include "../includes/ghcconfig.h"
- -- Needed by Constants.h
+#include "MachDeps.h"
+ -- For WORD_SIZE_IN_BITS only.
#include "../includes/Constants.h"
-- For LDV_CREATE_MASK, LDV_STATE_USE
-- which are StgWords
import CmmUtils ( zeroCLit, mkIntCLit, mkLblExpr )
import CLabel ( mkCCLabel, mkCCSLabel, mkRtsDataLabel )
-import Module ( moduleNameUserString )
+import Module ( moduleString )
import Id ( Id )
import CostCentre
import StgSyn ( GenStgExpr(..), StgExpr )
-import CmdLineOpts ( opt_SccProfilingOn )
+import StaticFlags ( opt_SccProfilingOn )
import FastString ( FastString, mkFastString, LitString )
import Constants -- Lots of field offsets
import Outputable
stmtC $ CmmStore curCCSAddr (costCentreFrom closure)
enter_ccs_fun stack = emitRtsCall SLIT("EnterFunCCS") [(stack,PtrHint)]
+ -- ToDo: vols
enter_ccs_fsub = enteringPAP 0
-> Code
emitCostCentreDecl cc = do
{ label <- mkStringCLit (costCentreUserName cc)
- ; modl <- mkStringCLit (moduleNameUserString (cc_mod cc))
+ ; modl <- mkStringCLit (moduleString (cc_mod cc))
; let
lits = [ zero, -- StgInt ccID,
label, -- char *label,
emitCostCentreStackDecl ccs
| Just cc <- maybeSingletonCCS ccs = do
{ let
- lits = [ zero,
- mkCCostCentre cc,
- zero, -- struct _CostCentreStack *prevStack;
- zero, -- struct _IndexTable *indexTable;
- zero, -- StgWord selected;
- zero64, -- StgWord64 scc_count;
- zero, -- StgWord time_ticks;
- zero64, -- StgWord64 mem_alloc;
- zero, -- StgWord inherited_ticks;
- zero64, -- StgWord64 inherited_alloc;
- zero -- CostCentre *root;
- ]
+ -- Note: to avoid making any assumptions about how the
+ -- C compiler (that compiles the RTS, in particular) does
+ -- layouts of structs containing long-longs, simply
+ -- pad out the struct with zero words until we hit the
+ -- size of the overall struct (which we get via DerivedConstants.h)
+ --
+ lits = zero : mkCCostCentre cc : replicate (sizeof_ccs_words - 2) zero
; emitDataLits (mkCCSLabel ccs) lits
}
| otherwise = pprPanic "emitCostCentreStackDecl" (ppr ccs)
zero = mkIntCLit 0
zero64 = CmmInt 0 I64
+sizeof_ccs_words :: Int
+sizeof_ccs_words
+ -- round up to the next word.
+ | ms == 0 = ws
+ | otherwise = ws + 1
+ where
+ (ws,ms) = SIZEOF_CostCentreStack `divMod` wORD_SIZE
-- ---------------------------------------------------------------------------
-- Registering CCs and CCSs
(cmmOrWord loadEra (CmmLit (mkWordCLit lDV_STATE_USE)))
loadEra :: CmmExpr
-loadEra = CmmLoad (mkLblExpr (mkRtsDataLabel SLIT("era"))) cIntRep
+loadEra = CmmMachOp (MO_U_Conv cIntRep wordRep)
+ [CmmLoad (mkLblExpr (mkRtsDataLabel SLIT("era"))) cIntRep]
ldvWord :: CmmExpr -> CmmExpr
-- Takes the address of a closure, and returns