+
+typedef struct _StgEntCounter {
+ 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) */
+ char *str; /* name of the thing */
+ char *arg_kinds; /* info about the args types */
+ I_ entry_count; /* Trips to fast entry code */
+ I_ slow_entry_count; /* Trips to slow entry code */
+ I_ allocs; /* number of allocations by this fun */
+ struct _StgEntCounter *link;/* link to chain them all together */
+} StgEntCounter;
+
+#define TICK_CTR(f_ct, str, arity, args, arg_kinds) \
+ static StgEntCounter f_ct \
+ = { 0, arity, args, \
+ str, arg_kinds, \
+ 0, 0, 0, NULL };
+
+/* The slow entry point for a function always goes to
+ the fast entry point, which will register the stats block,
+ so no need to do so here */
+#define TICK_ENT_FUN_STD(f_ct) \
+ f_ct.slow_entry_count++; \
+ ENT_FUN_STD_ctr++ /* The total one */
+
+#define TICK_ENT_FUN_DIRECT(f_ct) \
+ { \
+ 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.entry_count += 1; \
+ } \
+ ENT_FUN_DIRECT_ctr++ /* The total one */
+
+extern StgEntCounter top_ct;
+extern StgEntCounter *ticky_entry_ctrs;