X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=ghc%2Fincludes%2FStgProf.h;h=b2783efc338259cf77b4cf080dd3e50d0d34d513;hb=7e150969472ef9a48af9a7a2cc23a84952e90078;hp=6cebb331ae1d45a096c6abf2a788426ee97aefcc;hpb=1e87b41b945600dc1f4bb977921f89cb97a001d7;p=ghc-hetmet.git diff --git a/ghc/includes/StgProf.h b/ghc/includes/StgProf.h index 6cebb33..b2783ef 100644 --- a/ghc/includes/StgProf.h +++ b/ghc/includes/StgProf.h @@ -1,5 +1,5 @@ /* ----------------------------------------------------------------------------- - * $Id: StgProf.h,v 1.3 1999/03/18 17:57:19 simonm Exp $ + * $Id: StgProf.h,v 1.9 2000/04/03 15:54:49 simonmar Exp $ * * (c) The GHC Team, 1998 * @@ -9,8 +9,124 @@ #ifndef STGPROF_H #define STGPROF_H -#if defined(PROFILING) +#if !defined(PROFILING) +#define CCS_ALLOC(ccs, amount) doNothing() +#define ENTER_CC_PAP_CL(r) doNothing() +#define ENTER_CCS_PAP_CL(r) doNothing() + +#else /* PROFILING... */ + +/* ----------------------------------------------------------------------------- + * Constants + * ---------------------------------------------------------------------------*/ + +#define EMPTY_STACK NULL +#define EMPTY_TABLE NULL + +/* Constants used to set sumbsumed flag on CostCentres */ + +#define CC_IS_CAF 'c' /* 'c' => *is* a CAF cc */ +#define CC_IS_BORING 'B' /* 'B' => *not* a CAF/sub cc */ + +/* ----------------------------------------------------------------------------- + * Data Structures + * ---------------------------------------------------------------------------*/ +/* + * CostCentre + */ + +typedef struct _CostCentre { + int ccID; + + char *label; + char *module; + + /* used for accumulating costs at the end of the run... */ + unsigned long time_ticks; + unsigned long mem_alloc; + + char is_caf; + + struct _CostCentre *link; +} CostCentre; + + + +/* + * CostCentreStack + */ + +typedef struct _CostCentreStack { + int ccsID; + + CostCentre *cc; + struct _CostCentreStack *prevStack; + struct _IndexTable *indexTable; + + unsigned long scc_count; + unsigned long sub_scc_count; + unsigned long sub_cafcc_count; + + unsigned long time_ticks; + unsigned long mem_alloc; + unsigned long mem_resid; + + CostCentre *root; +} CostCentreStack; + + + +/* + * IndexTable + */ + +typedef struct _IndexTable { + CostCentre *cc; + CostCentreStack *ccs; + struct _IndexTable *next; + unsigned int back_edge; +} IndexTable; + + +/* ----------------------------------------------------------------------------- + Pre-defined cost centres and cost centre stacks + -------------------------------------------------------------------------- */ + +extern CostCentreStack *CCCS; /* current CCS */ + +extern CostCentre CC_MAIN[]; +extern CostCentreStack CCS_MAIN[]; /* Top CCS */ + +extern CostCentre CC_SYSTEM[]; +extern CostCentreStack CCS_SYSTEM[]; /* RTS costs */ + +extern CostCentre CC_GC[]; +extern CostCentreStack CCS_GC[]; /* Garbage collector costs */ + +extern CostCentre CC_SUBSUMED[]; +extern CostCentreStack CCS_SUBSUMED[]; /* Costs are subsumed by caller */ + +extern CostCentre CC_OVERHEAD[]; +extern CostCentreStack CCS_OVERHEAD[]; /* Profiling overhead */ + +extern CostCentre CC_DONT_CARE[]; +extern CostCentreStack CCS_DONT_CARE[]; /* shouldn't ever get set */ + +extern unsigned int CC_ID; /* global ids */ +extern unsigned int CCS_ID; +extern unsigned int HP_ID; + +/* ----------------------------------------------------------------------------- + * Functions + * ---------------------------------------------------------------------------*/ + +CostCentreStack *EnterFunCCS ( CostCentreStack *cccs, CostCentreStack *ccsfn ); +CostCentreStack *PushCostCentre ( CostCentreStack *, CostCentre * ); +CostCentreStack *AppendCCS ( CostCentreStack *ccs1, CostCentreStack *ccs2 ); + +extern unsigned int entering_PAP; + /* ----------------------------------------------------------------------------- * Registering CCs @@ -34,34 +150,9 @@ -------------------------------------------------------------------------- */ -extern F_ *register_stack; - extern CostCentre *CC_LIST; /* registered CC list */ extern CostCentreStack *CCS_LIST; /* registered CCS list */ -# define PUSH_REGISTER_STACK(reg_function) \ - *(register_stack++) = (F_)reg_function - -# define POP_REGISTER_STACK() \ - *(--register_stack) - -# define START_REGISTER_CCS(reg_mod_name) \ - static int _module_registered = 0; \ - FN_(reg_mod_name) { \ - FB_; \ - if (! _module_registered) { \ - _module_registered = 1 - -# define REGISTER_IMPORT(reg_mod_name) \ - do { EF_(reg_mod_name); \ - PUSH_REGISTER_STACK(reg_mod_name) ; \ - } while (0) - -# define END_REGISTER_CCS() \ - }; \ - JMP_(POP_REGISTER_STACK()); \ - FE_ } - #define REGISTER_CC(cc) \ do { \ extern CostCentre cc[]; \ @@ -84,16 +175,17 @@ extern CostCentreStack *CCS_LIST; /* registered CCS list */ * Declaring Cost Centres & Cost Centre Stacks. * -------------------------------------------------------------------------- */ -# define CC_DECLARE(cc_ident,name,module,group,subsumed,is_local) \ - is_local CostCentre cc_ident[1] \ - = {{ 0, \ - name, \ - module, \ - group, \ - subsumed, \ +# define CC_DECLARE(cc_ident,name,module,caf,is_local) \ + is_local CostCentre cc_ident[1] \ + = {{ 0, \ + name, \ + module, \ + 0, \ + 0, \ + caf, \ 0 }}; -# define CCS_DECLARE(ccs_ident,cc_ident,subsumed,is_local) \ +# define CCS_DECLARE(ccs_ident,cc_ident,is_local) \ is_local CostCentreStack ccs_ident[1] \ = {{ ccsID : 0, \ cc : cc_ident, \ @@ -102,10 +194,10 @@ extern CostCentreStack *CCS_LIST; /* registered CCS list */ scc_count : 0, \ sub_scc_count : 0, \ sub_cafcc_count : 0, \ - sub_dictcc_count : 0, \ time_ticks : 0, \ mem_alloc : 0, \ - is_subsumed : subsumed, \ + mem_resid : 0, \ + root : 0, \ }}; # define CC_EXTERN(cc_ident) \ @@ -132,12 +224,11 @@ extern CostCentreStack *CCS_LIST; /* registered CCS list */ * Pushing a new cost centre (i.e. for scc annotations) * -------------------------------------------------------------------------- */ -# define SET_CCC_X(cc,do_subcc_count,do_subdict_count,do_scc_count) \ - do { \ - if (do_subcc_count) { CCCS->sub_scc_count++; } \ - if (do_subdict_count) { CCCS->sub_dictcc_count++; } \ - CCCS = PushCostCentre(CCCS,cc); \ - if (do_scc_count) { CCCS->scc_count++; } \ +# define SET_CCC_X(cc,do_subcc_count,do_scc_count) \ + do { \ + if (do_subcc_count) { CCCS->sub_scc_count++; } \ + CCCS = PushCostCentre(CCCS,cc); \ + if (do_scc_count) { CCCS->scc_count++; } \ } while(0) /* We sometimes don't increment the scc_count field, for example when @@ -146,13 +237,10 @@ extern CostCentreStack *CCS_LIST; /* registered CCS list */ */ # define SET_CCC(cc_ident,do_scc_count) \ - SET_CCC_X(cc_ident,do_scc_count,0,do_scc_count) - -# define SET_DICT_CCC(cc_ident,do_scc_count) \ - SET_CCC_X(cc_ident,0,do_scc_count,do_scc_count) + SET_CCC_X(cc_ident,do_scc_count,do_scc_count) # define SET_CCS_TOP(cc_ident) \ - SET_CCC_X(cc_ident,0,0,1) + SET_CCC_X(cc_ident,0,1) /* ----------------------------------------------------------------------------- * Allocating new cost centres / cost centre stacks. @@ -181,7 +269,6 @@ extern CostCentreStack *CCS_LIST; /* registered CCS list */ (stack)->scc_count = 0; \ (stack)->time_ticks = 0; \ (stack)->sub_cafcc_count = 0; \ - (stack)->sub_dictcc_count = 0; \ (stack)->mem_alloc = 0; \ } while(0) @@ -195,11 +282,6 @@ extern CostCentreStack *CCS_LIST; /* registered CCS list */ #define CCCS_DETAIL_COUNT(inc_this) /*nothing*/ #endif -#define IS_CAF_OR_DICT_OR_SUB_CCS(ccs) \ - /* tests for lower case character */ \ - ((ccs)->is_subsumed & ' ') - - /* On entry to top level CAFs we count the scc ...*/ #define ENTER_CCS_CAF_X(ccs) \ @@ -221,10 +303,10 @@ extern CostCentreStack *CCS_LIST; /* registered CCS list */ * On entering a closure we only count the enter to thunks ... * ------------------------------------------------------------------------- */ -#define ENTER_CCS_T(ccs) \ - do { \ - CCCS = (CostCentreStack *)(ccs); \ - CCCS_DETAIL_COUNT(CCCS->thunk_count); \ +#define ENTER_CCS_T(ccs) \ + do { \ + CCCS = (CostCentreStack *)(ccs); \ + CCCS_DETAIL_COUNT(CCCS->thunk_count); \ } while(0) #define ENTER_CCS_TCL(closure) ENTER_CCS_T(CCS_HDR(closure)) @@ -234,37 +316,34 @@ extern CostCentreStack *CCS_LIST; /* registered CCS list */ * * Here is our special "hybrid" case when we do *not* set the CCCS. * (a) The closure is a function, not a thunk; - * (b) The CCS is CAF/DICT-ish. + * (b) The CCS is CAF-ish. * -------------------------------------------------------------------------- */ -#define ENTER_CCS_F(stack) \ - do { \ - CostCentreStack *ccs = (CostCentreStack *) (stack); \ - if ( ! IS_CAF_OR_DICT_OR_SUB_CCS(ccs) ) { \ - CCCS = ccs; \ - } else { \ - CCCS_DETAIL_COUNT(ccs->caffun_subsumed); \ - CCCS_DETAIL_COUNT(CCCS->subsumed_caf_count); \ - } \ - CCCS_DETAIL_COUNT(CCCS->function_count); \ +#define ENTER_CCS_F(stack) \ + do { \ + CostCentreStack *ccs = (CostCentreStack *) (stack); \ + CCCS_DETAIL_COUNT(CCCS->function_count); \ + CCCS = EnterFunCCS(CCCS,ccs); \ } while(0) #define ENTER_CCS_FCL(closure) ENTER_CCS_F(CCS_HDR(closure)) /* Entering a top-level function: costs are subsumed by the caller */ -#define ENTER_CCS_FSUB() \ - do { \ - CCCS_DETAIL_COUNT(CCCS->subsumed_fun_count); \ - CCCS_DETAIL_COUNT(CCCS->function_count); \ +#define ENTER_CCS_FSUB() \ + do { \ + CCCS_DETAIL_COUNT(CCCS->subsumed_fun_count); \ + CCCS_DETAIL_COUNT(CCCS->function_count); \ + entering_PAP = 0; \ } while(0) -#define ENTER_CCS_FCAF(stack) \ - do { \ - CostCentreStack *ccs = (CostCentreStack *) (stack); \ - CCCS_DETAIL_COUNT(ccs->caffun_subsumed); \ - CCCS_DETAIL_COUNT(CCCS->subsumed_caf_count); \ - CCCS_DETAIL_COUNT(CCCS->function_count); \ +#define ENTER_CCS_FCAF(stack) \ + do { \ + CostCentreStack *ccs = (CostCentreStack *) (stack); \ + CCCS_DETAIL_COUNT(ccs->caffun_subsumed); \ + CCCS_DETAIL_COUNT(CCCS->subsumed_caf_count); \ + CCCS_DETAIL_COUNT(CCCS->function_count); \ + entering_PAP = 0; \ } while(0) #define ENTER_CCS_FLOAD(ccs) \ @@ -275,17 +354,11 @@ extern CostCentreStack *CCS_LIST; /* registered CCS list */ /* These ENTER_CC_PAP things are only used in the RTS */ -#define ENTER_CCS_PAP(stack) \ - do { \ - CostCentreStack *ccs = (CostCentreStack *) (stack); \ - if ( ! IS_CAF_OR_DICT_OR_SUB_CCS(ccs) ) { \ - CCCS = ccs; \ - } else { \ - CCCS_DETAIL_COUNT(ccs->caffun_subsumed); \ - CCCS_DETAIL_COUNT(CCCS->subsumed_caf_count); \ - } \ - CCCS_DETAIL_COUNT(CCCS->pap_count); \ - } while(0) +#define ENTER_CCS_PAP(stack) \ + do { \ + ENTER_CCS_F(stack); \ + entering_PAP = rtsTrue; \ + } while(0) #define ENTER_CCS_PAP_CL(closure) \ ENTER_CCS_PAP((closure)->header.prof.ccs)