Make ticky work, at least partly, on 64-bit machines
authorsimonpj@microsoft.com <unknown>
Tue, 24 Apr 2007 13:30:11 +0000 (13:30 +0000)
committersimonpj@microsoft.com <unknown>
Tue, 24 Apr 2007 13:30:11 +0000 (13:30 +0000)
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.

compiler/codeGen/CgTicky.hs
includes/Rts.h

index 0be58dd..f5524d2 100644 (file)
@@ -89,9 +89,9 @@ emitTickyCounter cl_info args on_stk
 -- 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
@@ -166,9 +166,9 @@ registerTickyCtr ctr_lbl
   = 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 
-                               oFFSET_StgEntCounter_registeredp)) I32,
+                               oFFSET_StgEntCounter_registeredp)) wordRep,
                CmmLit (mkIntCLit 0)]
     register_stmts
       =        [ CmmStore (CmmLit (cmmLabelOffB ctr_lbl oFFSET_StgEntCounter_link))
@@ -265,13 +265,13 @@ tickyDynAlloc cl_info
 
 
 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 goods slop = ifTicky $ panic "ToDo: tickyAllocThunk"
+tickyAllocThunk goods slop = ifTicky $ pprTrace "ToDo: tickyAllocThunk" empty (return ())
 
 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]
@@ -313,7 +313,8 @@ addToMemLong = addToMem cLongRep
 
 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 
index 59edc09..7375798 100644 (file)
@@ -270,11 +270,11 @@ extern void stg_exit(int n) GNU_ATTRIBUTE(__noreturn__);
    -------------------------------------------------------------------------- */
 
 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 */