[project @ 1999-09-15 13:45:14 by simonmar]
[ghc-hetmet.git] / ghc / rts / DebugProf.c
1 /* -----------------------------------------------------------------------------
2  * $Id: DebugProf.c,v 1.7 1999/09/15 13:45:16 simonmar Exp $
3  *
4  * (c) The GHC Team 1998-1999
5  *
6  * Simple Heap Profiling
7  *
8  * ---------------------------------------------------------------------------*/
9
10 #include "Rts.h"
11 #include "Printer.h"
12 #include "BlockAlloc.h"
13 #include "DebugProf.h"
14 #include "RtsFlags.h"
15 #include "RtsUtils.h"
16 #include "Stats.h"
17
18 #if defined(DEBUG) && ! defined(PROFILING)
19
20 char prof_filename[128];
21 FILE *prof_file;
22
23 static void clear_table_data(void);
24 static void fprint_data(FILE *fp);
25
26 /* -----------------------------------------------------------------------------
27    The profiler itself
28    -------------------------------------------------------------------------- */
29
30 void
31 heapCensus(bdescr *bd)
32 {
33     StgPtr p;
34     const StgInfoTable *info;
35     StgDouble time;
36     nat size;
37     
38     /* usertime() isn't very accurate, since it includes garbage
39      * collection time.  We really want elapsed_mutator_time or
40      * something.  ToDo.
41      */
42     time = usertime();
43     fprintf(prof_file, "BEGIN_SAMPLE %0.2f\n", time);
44
45     while (bd != NULL) {
46         p = bd->start;
47         while (p < bd->free) {
48             info = get_itbl((StgClosure *)p);
49
50             switch (info->type) {
51             case BCO:
52                 size = bco_sizeW((StgBCO *)p);
53                 break;
54
55             case FUN:
56             case THUNK:
57             case CONSTR:
58             case IND_PERM:
59             case IND_OLDGEN_PERM:
60             case BLACKHOLE:
61             case BLACKHOLE_BQ:
62             case WEAK:
63             case FOREIGN:
64             case MVAR:
65             case MUT_VAR:
66             case CONSTR_INTLIKE:
67             case CONSTR_CHARLIKE:
68             case CONSTR_STATIC:
69             case CONSTR_NOCAF_STATIC:
70             case THUNK_STATIC:
71             case FUN_STATIC:
72             case IND_STATIC:
73                 size = sizeW_fromITBL(info);
74                 break;
75
76             case THUNK_SELECTOR:
77                 size = sizeofW(StgHeader) + MIN_UPD_SIZE;
78                 break;
79
80             case IND:
81             case IND_OLDGEN:
82                 size = sizeofW(StgInd);
83                 break;
84
85             case AP_UPD: /* we can treat this as being the same as a PAP */
86             case PAP:
87                 size = pap_sizeW((StgPAP *)p);
88                 break;
89
90             case ARR_WORDS:
91                 size = arr_words_sizeW(stgCast(StgArrWords*,p));
92                 break;
93
94             case MUT_ARR_PTRS:
95             case MUT_ARR_PTRS_FROZEN:
96                 size = mut_arr_ptrs_sizeW((StgMutArrPtrs *)p);
97                 break;
98
99             case TSO:
100                 size = tso_sizeW((StgTSO *)p);
101                 break;
102
103             default:
104                 barf("heapCensus");
105             }
106             switch (RtsFlags.ProfFlags.doHeapProfile) {
107             case HEAP_BY_INFOPTR:
108               add_data((void *)(*p), size * sizeof(W_));
109               break;
110             case HEAP_BY_CLOSURE_TYPE:
111               closure_types[info->type] += size * sizeof(W_);
112               break;
113             }
114             p += size;
115         }
116         bd = bd->link;
117     }
118
119     switch (RtsFlags.ProfFlags.doHeapProfile) {
120     case HEAP_BY_INFOPTR:
121       fprint_data(prof_file);
122       break;
123     case HEAP_BY_CLOSURE_TYPE:
124       fprint_closure_types(prof_file);
125       break;
126     }
127     
128     fprintf(prof_file, "END_SAMPLE %0.2f\n", time);
129 }    
130
131 #endif
132