The ticky StgEntCounter structure was trying to be clever by using a
fixed-width 32-bit field for the registeredp value. But the code generators
are not up to handling structures packed tightly like this (on a 64-bit
architecture); result seg-fault on 64-bit.
Really there should be some complaint from the code generators, not simply
a seg fault.
Anyway I switched to using native words for StgEntCounter fields, and
now at least it works.
-- krc: note that all the fields are I32 now; some were I16 before,
-- but the code generator wasn't handling that properly and it led to chaos,
-- panic and disorder.
-- krc: note that all the fields are I32 now; some were I16 before,
-- but the code generator wasn't handling that properly and it led to chaos,
-- panic and disorder.
- [ CmmInt 0 I32,
- CmmInt (fromIntegral (length args)) I32, -- Arity
- CmmInt (fromIntegral on_stk) I32, -- Words passed on stack
+ [ mkIntCLit 0,
+ mkIntCLit (length args),-- Arity
+ mkIntCLit on_stk, -- Words passed on stack
fun_descr_lit,
arg_descr_lit,
zeroCLit, -- Entry count
fun_descr_lit,
arg_descr_lit,
zeroCLit, -- Entry count
= emitIf test (stmtsC register_stmts)
where
-- krc: code generator doesn't handle Not, so we test for Eq 0 instead
= emitIf test (stmtsC register_stmts)
where
-- krc: code generator doesn't handle Not, so we test for Eq 0 instead
- test = CmmMachOp (MO_Eq I32)
+ test = CmmMachOp (MO_Eq wordRep)
[CmmLoad (CmmLit (cmmLabelOffB ctr_lbl
[CmmLoad (CmmLit (cmmLabelOffB ctr_lbl
- oFFSET_StgEntCounter_registeredp)) I32,
+ oFFSET_StgEntCounter_registeredp)) wordRep,
CmmLit (mkIntCLit 0)]
register_stmts
= [ CmmStore (CmmLit (cmmLabelOffB ctr_lbl oFFSET_StgEntCounter_link))
CmmLit (mkIntCLit 0)]
register_stmts
= [ CmmStore (CmmLit (cmmLabelOffB ctr_lbl oFFSET_StgEntCounter_link))
tickyAllocPrim :: CmmExpr -> CmmExpr -> CmmExpr -> Code
tickyAllocPrim :: CmmExpr -> CmmExpr -> CmmExpr -> Code
-tickyAllocPrim hdr goods slop = ifTicky $ panic "ToDo: tickyAllocPrim"
+tickyAllocPrim hdr goods slop = ifTicky $ pprTrace "ToDo: tickyAllocPrim" empty (return ())
tickyAllocThunk :: CmmExpr -> CmmExpr -> Code
tickyAllocThunk :: CmmExpr -> CmmExpr -> Code
-tickyAllocThunk goods slop = ifTicky $ panic "ToDo: tickyAllocThunk"
+tickyAllocThunk goods slop = ifTicky $ pprTrace "ToDo: tickyAllocThunk" empty (return ())
tickyAllocPAP :: CmmExpr -> CmmExpr -> Code
tickyAllocPAP :: CmmExpr -> CmmExpr -> Code
-tickyAllocPAP goods slop = ifTicky $ panic "ToDo: tickyAllocPAP"
+tickyAllocPAP goods slop = ifTicky $ pprTrace "ToDo: tickyAllocPAP" empty (return ())
tickyAllocHeap :: VirtualHpOffset -> Code
-- Called when doing a heap check [TICK_ALLOC_HEAP]
tickyAllocHeap :: VirtualHpOffset -> Code
-- Called when doing a heap check [TICK_ALLOC_HEAP]
bumpHistogram :: LitString -> Int -> Code
bumpHistogram lbl n
bumpHistogram :: LitString -> Int -> Code
bumpHistogram lbl n
- = bumpHistogramE lbl (CmmLit (CmmInt (fromIntegral n) cLongRep))
+-- = bumpHistogramE lbl (CmmLit (CmmInt (fromIntegral n) cLongRep))
+ = return () -- TEMP SPJ Apr 07
bumpHistogramE :: LitString -> CmmExpr -> Code
bumpHistogramE lbl n
bumpHistogramE :: LitString -> CmmExpr -> Code
bumpHistogramE lbl n
-------------------------------------------------------------------------- */
typedef struct _StgEntCounter {
-------------------------------------------------------------------------- */
typedef struct _StgEntCounter {
- /* krc: StgWord32, not StgWord16, in order to match the code
- generator, which doesn't generate anything of that type. */
- StgWord32 registeredp; /* 0 == no, 1 == yes */
- StgWord32 arity; /* arity (static info) */
- StgWord32 stk_args; /* # of args off stack */
+ /* Using StgWord for everything, becuase both the C and asm code
+ generators make trouble if you try to pack things tighter */
+ StgWord registeredp; /* 0 == no, 1 == yes */
+ StgInt arity; /* arity (static info) */
+ StgInt stk_args; /* # of args off stack */
/* (rest of args are in registers) */
char *str; /* name of the thing */
char *arg_kinds; /* info about the args types */
/* (rest of args are in registers) */
char *str; /* name of the thing */
char *arg_kinds; /* info about the args types */