/* ----------------------------------------------------------------------------
- * $Id: StgTicky.h,v 1.2 1999/02/02 14:21:28 simonm Exp $
+ * $Id: StgTicky.h,v 1.5 1999/06/24 13:10:31 simonmar Exp $
+ *
+ * (c) The AQUA project, Glasgow University, 1994-1997
+ * (c) The GHC Team, 1998-1999
*
* Ticky-ticky profiling macros.
*
ALLOC_FUN_gds += (g); ALLOC_FUN_slp += (s); \
TICK_ALLOC_HISTO(FUN,_HS,g,s)
-#define TICK_ALLOC_THK(g,s) \
- ALLOC_THK_ctr++; ALLOC_THK_adm += _HS; \
+#define TICK_ALLOC_UP_THK(g,s) \
+ ALLOC_UP_THK_ctr++; ALLOC_THK_adm += _HS; \
+ ALLOC_THK_gds += (g); ALLOC_THK_slp += (s); \
+ TICK_ALLOC_HISTO(THK,_HS,g,s)
+
+#define TICK_ALLOC_SE_THK(g,s) \
+ ALLOC_SE_THK_ctr++; ALLOC_THK_adm += _HS; \
ALLOC_THK_gds += (g); ALLOC_THK_slp += (s); \
TICK_ALLOC_HISTO(THK,_HS,g,s)
#define TICK_ENT_THK() ENT_THK_ctr++ /* thunk */
#define TICK_ENT_FUN_STD() ENT_FUN_STD_ctr++ /* std entry pt */
-#define TICK_ENT_FUN_DIRECT(n) ENT_FUN_DIRECT_ctr++ /* fast entry pt */
+
+struct ent_counter {
+ unsigned registeredp:16, /* 0 == no, 1 == yes */
+ arity:16, /* arity (static info) */
+ stk_args:16; /* # of args off stack */
+ /* (rest of args are in registers) */
+ StgChar *f_str; /* name of the thing */
+ StgChar *f_arg_kinds; /* info about the args types */
+ I_ ctr; /* the actual counter */
+ struct ent_counter *link; /* link to chain them all together */
+};
+
+#define TICK_ENT_FUN_DIRECT(f_ct, f_str, f_arity, f_args, f_arg_kinds) \
+ { \
+ static struct ent_counter f_ct \
+ = { 0, \
+ (f_arity), (f_args), (f_str), (f_arg_kinds), \
+ 0, NULL }; \
+ if ( ! f_ct.registeredp ) { \
+ /* hook this one onto the front of the list */ \
+ f_ct.link = ticky_entry_ctrs; \
+ ticky_entry_ctrs = & (f_ct); \
+ \
+ /* mark it as "registered" */ \
+ f_ct.registeredp = 1; \
+ } \
+ f_ct.ctr += 1; \
+ } \
+ ENT_FUN_DIRECT_ctr++ /* the old boring one */
+
+extern struct ent_counter *ticky_entry_ctrs;
#define TICK_ENT_CON(n) ENT_CON_ctr++ /* enter constructor */
#define TICK_ENT_IND(n) ENT_IND_ctr++ /* enter indirection */
+#define TICK_ENT_PERM_IND(n) ENT_PERM_IND_ctr++ /* enter permanent indirection */
#define TICK_ENT_PAP(n) ENT_PAP_ctr++ /* enter PAP */
#define TICK_ENT_AP_UPD(n) ENT_AP_UPD_ctr++ /* enter AP_UPD */
#define TICK_ENT_BH() ENT_BH_ctr++ /* enter BLACKHOLE */
+
/* -----------------------------------------------------------------------------
Returns
-------------------------------------------------------------------------- */
-------------------------------------------------------------------------- */
#define TICK_UPDF_OMITTED() UPDF_OMITTED_ctr++
-#define TICK_UPDF_PUSHED() UPDF_PUSHED_ctr++
+#define TICK_UPDF_PUSHED(tgt,inf) UPDF_PUSHED_ctr++ \
+/* ; fprintf(stderr,"UPDF_PUSHED:%p:%p\n",tgt,inf) */
#define TICK_SEQF_PUSHED() SEQF_PUSHED_ctr++
#define TICK_CATCHF_PUSHED() CATCHF_PUSHED_ctr++
#define TICK_UPDF_RCC_PUSHED() UPDF_RCC_PUSHED_ctr++
/* For the generational collector:
*/
#define TICK_UPD_NEW_IND() UPD_NEW_IND_ctr++
+#define TICK_UPD_NEW_PERM_IND(tgt) UPD_NEW_PERM_IND_ctr++ \
+/* ; fprintf(stderr,"UPD_NEW_PERM:%p\n",tgt) */
#define TICK_UPD_OLD_IND() UPD_OLD_IND_ctr++
+#define TICK_UPD_OLD_PERM_IND() UPD_OLD_PERM_IND_ctr++
+
+/* Count blackholes:
+ */
+#define TICK_UPD_BH_UPDATABLE() UPD_BH_UPDATABLE_ctr++
+#define TICK_UPD_BH_SINGLE_ENTRY() UPD_BH_SINGLE_ENTRY_ctr++
+#define TICK_UPD_CAF_BH_UPDATABLE(s) \
+ UPD_CAF_BH_UPDATABLE_ctr++ \
+/* ; fprintf(stderr,"TICK_UPD_CAF_BH_UPDATABLE(%s)\n",s) */
+#define TICK_UPD_CAF_BH_SINGLE_ENTRY(s) \
+ UPD_CAF_BH_SINGLE_ENTRY_ctr++ \
+/* ; fprintf(stderr,"TICK_UPD_CAF_BH_SINGLE_ENTRY(%s)\n",s) */
+
/* -----------------------------------------------------------------------------
Garbage collection counters
#endif
;
-EXTERN unsigned long ALLOC_THK_ctr INIT(0);
+EXTERN unsigned long ALLOC_UP_THK_ctr INIT(0);
+EXTERN unsigned long ALLOC_SE_THK_ctr INIT(0);
EXTERN unsigned long ALLOC_THK_adm INIT(0);
EXTERN unsigned long ALLOC_THK_gds INIT(0);
EXTERN unsigned long ALLOC_THK_slp INIT(0);
EXTERN unsigned long ENT_FUN_DIRECT_ctr INIT(0);
EXTERN unsigned long ENT_CON_ctr INIT(0);
EXTERN unsigned long ENT_IND_ctr INIT(0);
+EXTERN unsigned long ENT_PERM_IND_ctr INIT(0);
EXTERN unsigned long ENT_PAP_ctr INIT(0);
EXTERN unsigned long ENT_AP_UPD_ctr INIT(0);
EXTERN unsigned long ENT_BH_ctr INIT(0);
;
EXTERN unsigned long UPD_NEW_IND_ctr INIT(0);
+EXTERN unsigned long UPD_NEW_PERM_IND_ctr INIT(0);
EXTERN unsigned long UPD_OLD_IND_ctr INIT(0);
+EXTERN unsigned long UPD_OLD_PERM_IND_ctr INIT(0);
+
+EXTERN unsigned long UPD_BH_UPDATABLE_ctr INIT(0);
+EXTERN unsigned long UPD_BH_SINGLE_ENTRY_ctr INIT(0);
+EXTERN unsigned long UPD_CAF_BH_UPDATABLE_ctr INIT(0);
+EXTERN unsigned long UPD_CAF_BH_SINGLE_ENTRY_ctr INIT(0);
EXTERN unsigned long GC_SEL_ABANDONED_ctr INIT(0);
EXTERN unsigned long GC_SEL_MINOR_ctr INIT(0);
#define TICK_ALLOC_HEAP(words)
#define TICK_ALLOC_FUN(g,s)
-#define TICK_ALLOC_THK(g,s)
+#define TICK_ALLOC_UP_THK(g,s)
+#define TICK_ALLOC_SE_THK(g,s)
#define TICK_ALLOC_CON(g,s)
#define TICK_ALLOC_TUP(g,s)
#define TICK_ALLOC_BH(g,s)
#define TICK_ENT_CON(n)
#define TICK_ENT_IND(n)
+#define TICK_ENT_PERM_IND(n)
#define TICK_ENT_PAP(n)
#define TICK_ENT_AP_UPD(n)
#define TICK_ENT_BH()
#define TICK_VEC_RETURN(n)
#define TICK_UPDF_OMITTED()
-#define TICK_UPDF_PUSHED()
+#define TICK_UPDF_PUSHED(tgt,inf)
#define TICK_SEQF_PUSHED()
#define TICK_CATCHF_PUSHED()
#define TICK_UPDF_RCC_PUSHED()
#define TICK_UPD_PAP_IN_PLACE()
#define TICK_UPD_NEW_IND()
+#define TICK_UPD_NEW_PERM_IND(tgt)
#define TICK_UPD_OLD_IND()
+#define TICK_UPD_OLD_PERM_IND()
+
+#define TICK_UPD_BH_UPDATABLE()
+#define TICK_UPD_BH_SINGLE_ENTRY()
+#define TICK_UPD_CAF_BH_UPDATABLE()
+#define TICK_UPD_CAF_BH_SINGLE_ENTRY()
#define TICK_GC_SEL_ABANDONED()
#define TICK_GC_SEL_MINOR()