d9e3be97de0a8ffb566adb572ef70b2eb991542b
[ghc.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 void initRtsFlagsDefaults(void);
212 void setupRtsFlags(int *argc, char *argv[], int *rts_argc, char *rts_argv[]);
213 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 */