Tidy up file headers and copyrights; point to the wiki for docs
[ghc-hetmet.git] / includes / rts / Flags.h
1 /* -----------------------------------------------------------------------------
2  *
3  * (c) The GHC Team, 1998-2009
4  *
5  * Datatypes that holds the command-line flag settings.
6  *
7  * Do not #include this file directly: #include "Rts.h" instead.
8  *
9  * To understand the structure of the RTS headers, see the wiki:
10  *   http://hackage.haskell.org/trac/ghc/wiki/Commentary/SourceTree/Includes
11  *
12  * ---------------------------------------------------------------------------*/
13
14 #ifndef RTS_FLAGS_H
15 #define RTS_FLAGS_H
16
17 #include <stdio.h>
18
19 /* For defaults, see the @initRtsFlagsDefaults@ routine. */
20
21 struct GC_FLAGS {
22     FILE   *statsFile;
23     nat     giveStats;
24 #define NO_GC_STATS      0
25 #define COLLECT_GC_STATS 1
26 #define ONELINE_GC_STATS 2
27 #define SUMMARY_GC_STATS 3
28 #define VERBOSE_GC_STATS 4
29
30     nat     maxStkSize;         /* in *words* */
31     nat     initialStkSize;     /* in *words* */
32
33     nat     maxHeapSize;        /* in *blocks* */
34     nat     minAllocAreaSize;   /* in *blocks* */
35     nat     minOldGenSize;      /* in *blocks* */
36     nat     heapSizeSuggestion; /* in *blocks* */
37     double  oldGenFactor;
38     double  pcFreeHeap;
39
40     nat     generations;
41     nat     steps;
42     rtsBool squeezeUpdFrames;
43
44     rtsBool compact;            /* True <=> "compact all the time" */
45     double  compactThreshold;
46
47     rtsBool sweep;              /* use "mostly mark-sweep" instead of copying
48                                  * for the oldest generation */
49     rtsBool ringBell;
50     rtsBool frontpanel;
51
52     int idleGCDelayTime;        /* in milliseconds */
53
54     StgWord heapBase;           /* address to ask the OS for memory */
55 };
56
57 struct DEBUG_FLAGS {  
58     /* flags to control debugging output & extra checking in various subsystems */
59     rtsBool scheduler;      /* 's' */
60     rtsBool interpreter;    /* 'i' */
61     rtsBool weak;           /* 'w' */
62     rtsBool gccafs;         /* 'G' */
63     rtsBool gc;             /* 'g' */
64     rtsBool block_alloc;    /* 'b' */
65     rtsBool sanity;         /* 'S'   warning: might be expensive! */
66     rtsBool stable;         /* 't' */
67     rtsBool prof;           /* 'p' */
68     rtsBool eventlog;       /* 'e' */
69     rtsBool linker;         /* 'l'   the object linker */
70     rtsBool apply;          /* 'a' */
71     rtsBool stm;            /* 'm' */
72     rtsBool squeeze;        /* 'z'  stack squeezing & lazy blackholing */
73     rtsBool hpc;            /* 'c' coverage */
74     rtsBool timestamp;          /* add timestamps to traces */
75 };
76
77 struct COST_CENTRE_FLAGS {
78     unsigned int            doCostCentres;
79 # define COST_CENTRES_SUMMARY   1
80 # define COST_CENTRES_VERBOSE   2 /* incl. serial time profile */
81 # define COST_CENTRES_ALL       3
82 # define COST_CENTRES_XML       4
83
84     int     profilerTicks;   /* derived */
85     int     msecsPerTick;    /* derived */
86 };
87
88 struct PROFILING_FLAGS {
89     unsigned int        doHeapProfile;
90 # define NO_HEAP_PROFILING      0       /* N.B. Used as indexes into arrays */
91 # define HEAP_BY_CCS            1
92 # define HEAP_BY_MOD            2
93 # define HEAP_BY_DESCR          4
94 # define HEAP_BY_TYPE           5
95 # define HEAP_BY_RETAINER       6
96 # define HEAP_BY_LDV            7
97
98 # define HEAP_BY_CLOSURE_TYPE   8
99
100     nat                 profileInterval;      /* delta between samples (in ms) */
101     nat                 profileIntervalTicks; /* delta between samples (in 'ticks') */
102     rtsBool             includeTSOs;
103
104
105     rtsBool             showCCSOnException;
106
107     nat                 maxRetainerSetSize;
108
109     nat                 ccsLength;
110
111     char*               modSelector;
112     char*               descrSelector;
113     char*               typeSelector;
114     char*               ccSelector;
115     char*               ccsSelector;
116     char*               retainerSelector;
117     char*               bioSelector;
118
119 };
120
121 #ifdef EVENTLOG
122 struct EVENTLOG_FLAGS {
123   rtsBool doEventLogging;
124 };
125 #endif
126
127 struct CONCURRENT_FLAGS {
128     int ctxtSwitchTime;         /* in milliseconds */
129     int ctxtSwitchTicks;        /* derived */
130 };
131
132 struct MISC_FLAGS {
133     int tickInterval;     /* in milliseconds */
134     rtsBool install_signal_handlers;
135     rtsBool machineReadable;
136     StgWord linkerMemBase;       /* address to ask the OS for memory
137                                   * for the linker, NULL ==> off */
138 };
139
140 #ifdef THREADED_RTS
141 struct PAR_FLAGS {
142   nat            nNodes;         /* number of threads to run simultaneously */
143   rtsBool        migrate;        /* migrate threads between capabilities */
144   rtsBool        wakeupMigrate;  /* migrate a thread on wakeup */
145   unsigned int   maxLocalSparks;
146   rtsBool        parGcEnabled;   /* enable parallel GC */
147   rtsBool        parGcGen;       /* do parallel GC in this generation
148                                   * and higher only */
149   rtsBool        parGcLoadBalancing; /* do load-balancing in parallel GC */
150   rtsBool        setAffinity;    /* force thread affinity with CPUs */
151 };
152 #endif /* THREADED_RTS */
153
154 struct TICKY_FLAGS {
155     rtsBool showTickyStats;
156     FILE   *tickyFile;
157 };
158
159 #ifdef USE_PAPI
160 #define MAX_PAPI_USER_EVENTS 8
161
162 struct PAPI_FLAGS {
163     nat     eventType;          /* The type of events to count */
164     nat     numUserEvents;
165     char *  userEvents[MAX_PAPI_USER_EVENTS];
166 };
167
168 #define PAPI_FLAG_CACHE_L1 1
169 #define PAPI_FLAG_CACHE_L2 2
170 #define PAPI_FLAG_BRANCH 3
171 #define PAPI_FLAG_STALLS 4
172 #define PAPI_FLAG_CB_EVENTS 5
173 #define PAPI_USER_EVENTS 6
174
175 #endif
176
177 /* Put them together: */
178
179 typedef struct _RTS_FLAGS {
180     /* The first portion of RTS_FLAGS is invariant. */
181     struct GC_FLAGS          GcFlags;
182     struct CONCURRENT_FLAGS  ConcFlags;
183     struct MISC_FLAGS        MiscFlags;
184     struct DEBUG_FLAGS       DebugFlags;
185     struct COST_CENTRE_FLAGS CcFlags;
186     struct PROFILING_FLAGS   ProfFlags;
187 #ifdef EVENTLOG
188     struct EVENTLOG_FLAGS    EventLogFlags;
189 #endif
190     struct TICKY_FLAGS       TickyFlags;
191
192 #if defined(THREADED_RTS)
193     struct PAR_FLAGS    ParFlags;
194 #endif
195 #ifdef USE_PAPI
196     struct PAPI_FLAGS   PapiFlags;
197 #endif
198 } RTS_FLAGS;
199
200 #ifdef COMPILING_RTS_MAIN
201 extern DLLIMPORT RTS_FLAGS RtsFlags;
202 #elif IN_STG_CODE
203 /* Hack because the C code generator can't generate '&label'. */
204 extern RTS_FLAGS RtsFlags[];
205 #else
206 extern RTS_FLAGS RtsFlags;
207 #endif
208
209 /* Routines that operate-on/to-do-with RTS flags: */
210
211 extern void initRtsFlagsDefaults(void);
212 extern void setupRtsFlags(int *argc, char *argv[], int *rts_argc, char *rts_argv[]);
213 extern void setProgName(char *argv[]);
214
215
216 /*
217  * The printf formats are here, so we are less likely to make
218  * overly-long filenames (with disastrous results).  No more than 128
219  * chars, please!  
220  */
221
222 #define STATS_FILENAME_MAXLEN   128
223
224 #define GR_FILENAME_FMT         "%0.124s.gr"
225 #define GR_FILENAME_FMT_GUM     "%0.120s.%03d.%s"
226 #define HP_FILENAME_FMT         "%0.124s.hp"
227 #define LIFE_FILENAME_FMT       "%0.122s.life"
228 #define PROF_FILENAME_FMT       "%0.122s.prof"
229 #define PROF_FILENAME_FMT_GUM   "%0.118s.%03d.prof"
230 #define QP_FILENAME_FMT         "%0.124s.qp"
231 #define STAT_FILENAME_FMT       "%0.122s.stat"
232 #define TICKY_FILENAME_FMT      "%0.121s.ticky"
233 #define TIME_FILENAME_FMT       "%0.122s.time"
234 #define TIME_FILENAME_FMT_GUM   "%0.118s.%03d.time"
235
236 /* an "int" so as to match normal "argc" */
237 /* Now defined in Stg.h (lib/std/cbits need these too.)
238 extern int     prog_argc;
239 extern char  **prog_argv;
240 */
241 extern int     rts_argc;  /* ditto */
242 extern char   *rts_argv[];
243
244 #endif  /* RTS_FLAGS_H */