* src/vmcore/options.c (opt_verboseexception): Removed.
[cacao.git] / src / vmcore / options.c
1 /* src/vmcore/options.c - contains global options
2
3    Copyright (C) 1996-2005, 2006, 2007 R. Grafl, A. Krall, C. Kruegel,
4    C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5    E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6    J. Wenninger, Institut f. Computersprachen - TU Wien
7
8    This file is part of CACAO.
9
10    This program is free software; you can redistribute it and/or
11    modify it under the terms of the GNU General Public License as
12    published by the Free Software Foundation; either version 2, or (at
13    your option) any later version.
14
15    This program is distributed in the hope that it will be useful, but
16    WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18    General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
23    02110-1301, USA.
24
25    $Id: options.c 8120 2007-06-20 22:11:24Z twisti $
26
27 */
28
29
30 #include "config.h"
31
32 #include <errno.h>
33 #include <stdint.h>
34 #include <stdio.h>
35 #include <stdlib.h>
36
37 #if defined(HAVE_STRING_H)
38 # include <string.h>
39 #endif
40
41 #include <limits.h>
42
43 #include "mm/memory.h"
44
45 #include "native/jni.h"
46
47 #include "vm/vm.h"
48
49 #include "vmcore/options.h"
50
51
52 /* command line option ********************************************************/
53
54 s4    opt_index = 0;            /* index of processed arguments               */
55 char *opt_arg;                  /* this one exports the option argument       */
56
57 bool opt_foo = false;           /* option for development                     */
58
59 bool opt_jar = false;
60
61 #if defined(ENABLE_JIT)
62 bool opt_jit = true;            /* JIT mode execution (default)               */
63 bool opt_intrp = false;         /* interpreter mode execution                 */
64 #else
65 bool opt_jit = false;           /* JIT mode execution                         */
66 bool opt_intrp = true;          /* interpreter mode execution (default)       */
67 #endif
68
69 bool opt_run = true;
70
71 s4   opt_heapmaxsize   = 0;     /* maximum heap size                          */
72 s4   opt_heapstartsize = 0;     /* initial heap size                          */
73 s4   opt_stacksize     = 0;     /* thread stack size                          */
74
75 bool opt_verbose = false;
76 bool opt_debugcolor = false;    /* use ANSI terminal sequences                */
77 bool compileall = false;
78
79 bool loadverbose = false;
80 bool linkverbose = false;
81 bool initverbose = false;
82
83 bool opt_verboseclass     = false;
84 bool opt_verbosegc        = false;
85 bool opt_verbosejni       = false;
86 bool opt_verbosecall      = false;      /* trace all method invocation        */
87 bool opt_verbosethreads   = false;
88
89 bool showmethods = false;
90 bool showconstantpool = false;
91 bool showutf = false;
92
93 char *opt_method = NULL;
94 char *opt_signature = NULL;
95
96 bool compileverbose =  false;           /* trace compiler actions             */
97 bool showstack = false;
98
99 bool opt_showdisassemble    = false;    /* generate disassembler listing      */
100 bool opt_shownops           = false;
101 bool opt_showddatasegment   = false;    /* generate data segment listing      */
102 bool opt_showintermediate   = false;    /* generate intermediate code listing */
103 bool opt_showexceptionstubs = false;
104 bool opt_shownativestub     = false;
105
106 bool checkbounds = true;       /* check array bounds                         */
107 bool opt_noieee = false;       /* don't implement ieee compliant floats      */
108 bool checksync = true;         /* do synchronization                         */
109 #if defined(ENABLE_LOOP)
110 bool opt_loops = false;        /* optimize array accesses in loops           */
111 #endif
112
113 bool makeinitializations = true;
114
115 #if defined(ENABLE_STATISTICS)
116 bool opt_stat    = false;
117 bool opt_getloadingtime = false;   /* to measure the runtime                 */
118 bool opt_getcompilingtime = false; /* compute compile time                   */
119 #endif
120 #if defined(ENABLE_VERIFIER)
121 bool opt_verify  = true;       /* true if classfiles should be verified      */
122 #endif
123 bool opt_eager   = false;
124
125 #if defined(ENABLE_PROFILING)
126 bool opt_prof    = false;
127 bool opt_prof_bb = false;
128 #endif
129
130
131 /* inlining options ***********************************************************/
132
133 #if defined(ENABLE_INLINING)
134 bool opt_inlining = false;
135 #if defined(ENABLE_INLINING_DEBUG) || !defined(NDEBUG)
136 s4 opt_replace_verbose = 0;
137 s4 opt_inline_debug_min_size = 0;
138 s4 opt_inline_debug_max_size = INT_MAX;
139 s4 opt_inline_debug_end_counter = INT_MAX;
140 bool opt_inline_debug_all = false;
141 #endif /* defined(ENABLE_INLINING_DEBUG) || !defined(NDEBUG) */
142 #if !defined(NDEBUG)
143 bool opt_inline_debug_log = false;
144 #endif /* !defined(NDEBUG) */
145 #endif /* defined(ENABLE_INLINING) */
146
147
148 /* optimization options *******************************************************/
149
150 #if defined(ENABLE_IFCONV)
151 bool opt_ifconv = false;
152 #endif
153
154 #if defined(ENABLE_LSRA) || defined(ENABLE_SSA)
155 bool opt_lsra = false;
156 #endif
157
158
159 /* interpreter options ********************************************************/
160
161 #if defined(ENABLE_INTRP)
162 bool opt_no_dynamic = false;            /* suppress dynamic superinstructions */
163 bool opt_no_replication = false;        /* don't use replication in intrp     */
164 bool opt_no_quicksuper = false;         /* instructions for quickening cannot be
165                                                                                    part of dynamic superinstructions */
166
167 s4   opt_static_supers = 0x7fffffff;
168 bool vm_debug = false;          /* XXX this should be called `opt_trace'      */
169 #endif
170
171 #if defined(ENABLE_DEBUG_FILTER)
172 const char *opt_filter_verbosecall_include = 0;
173 const char *opt_filter_verbosecall_exclude = 0;
174 const char *opt_filter_show_method = 0;
175 #endif
176
177
178 /* -XX options ****************************************************************/
179
180 /* NOTE: For better readability keep these alpha-sorted. */
181
182 int32_t  opt_ProfileGCMemoryUsage      = 0;
183 int32_t  opt_ProfileMemoryUsage        = 0;
184 FILE    *opt_ProfileMemoryUsageGNUPlot = NULL;
185 int32_t  opt_TraceExceptions           = 0;
186
187
188 enum {
189         OPT_ProfileGCMemoryUsage,
190         OPT_ProfileMemoryUsage,
191         OPT_ProfileMemoryUsageGNUPlot,
192         OPT_TraceExceptions
193 };
194
195
196 option_t options_XX[] = {
197         { "ProfileGCMemoryUsage",      OPT_ProfileGCMemoryUsage,      "" },
198         { "ProfileMemoryUsage",        OPT_ProfileMemoryUsage,        "" },
199         { "ProfileMemoryUsageGNUPlot", OPT_ProfileMemoryUsageGNUPlot, "" },
200         { "TraceExceptions",           OPT_TraceExceptions,           "" },
201 };
202
203
204 /* options_get *****************************************************************
205
206    DOCUMENT ME!!!
207
208 *******************************************************************************/
209
210 s4 options_get(opt_struct *opts, JavaVMInitArgs *vm_args)
211 {
212         char *option;
213         s4    i;
214
215         if (opt_index >= vm_args->nOptions)
216                 return OPT_DONE;
217
218         /* get the current option */
219
220         option = vm_args->options[opt_index].optionString;
221
222         if ((option == NULL) || (option[0] != '-'))
223                 return OPT_DONE;
224
225         for (i = 0; opts[i].name; i++) {
226                 if (!opts[i].arg) {
227                         /* boolean option found */
228
229                         if (strcmp(option + 1, opts[i].name) == 0) {
230                                 opt_index++;
231                                 return opts[i].value;
232                         }
233
234                 } else {
235                         /* parameter option found */
236
237                         /* with a space between */
238
239                         if (strcmp(option + 1, opts[i].name) == 0) {
240                                 opt_index++;
241
242                                 if (opt_index < vm_args->nOptions) {
243
244 #if defined(HAVE_STRDUP)
245                                         opt_arg = strdup(vm_args->options[opt_index].optionString);
246 #else
247 # error !HAVE_STRDUP
248 #endif
249
250                                         opt_index++;
251                                         return opts[i].value;
252                                 }
253
254                                 return OPT_ERROR;
255
256                         } else {
257                                 /* parameter and option have no space between */
258
259                                 /* FIXME: this assumption is plain wrong, hits you if there is a
260                                  * parameter with no argument starting with same letter as param with argument
261                                  * but named after that one, ouch! */
262
263                                 size_t l = strlen(opts[i].name);
264
265                                 if (strlen(option + 1) > l) {
266                                         if (memcmp(option + 1, opts[i].name, l) == 0) {
267                                                 opt_index++;
268
269 #if defined(HAVE_STRDUP)
270                                                 opt_arg = strdup(option + 1 + l);
271 #else
272 # error !HAVE_STRDUP
273 #endif
274
275                                                 return opts[i].value;
276                                         }
277                                 }
278                         }
279                 }
280         }
281
282         return OPT_ERROR;
283 }
284
285
286 /* options_xx ******************************************************************
287
288    Handle -XX: options.
289
290 *******************************************************************************/
291
292 void options_xx(const char *name)
293 {
294         char    *end;
295         int32_t  length;
296         char    *value;
297         int32_t  option;
298         char    *filename;
299         FILE    *file;
300         int32_t  i;
301
302         log_println("name: %s", name);
303
304         /* Search for a ':' in the option name and get the option name
305            length and the value of the option. */
306
307         end = strchr(name, ':');
308
309         if (end == NULL) {
310                 length = strlen(name);
311                 value  = NULL;
312         }
313         else {
314                 length = end - name;
315                 value  = end + 1;
316         }
317
318         /* search the option in the option array */
319
320         option = OPT_ERROR;
321
322         for (i = 0; options_XX[i].name != NULL; i++) {
323                 if (strncmp(options_XX[i].name, name, length) == 0) {
324                         option = options_XX[i].option;
325                         break;
326                 }
327         }
328
329         /* process the option */
330
331         switch (option) {
332         case OPT_ProfileGCMemoryUsage:
333                 if (value == NULL)
334                         opt_ProfileGCMemoryUsage = 5;
335                 else
336                         opt_ProfileGCMemoryUsage = atoi(value);
337                 break;
338
339         case OPT_ProfileMemoryUsage:
340                 if (value == NULL)
341                         opt_ProfileMemoryUsage = 5;
342                 else
343                         opt_ProfileMemoryUsage = atoi(value);
344
345 # if defined(ENABLE_STATISTICS)
346                 /* we also need statistics */
347
348                 opt_stat = true;
349 # endif
350                 break;
351
352         case OPT_ProfileMemoryUsageGNUPlot:
353                 if (value == NULL)
354                         filename = "profile.dat";
355                 else
356                         filename = value;
357
358                 file = fopen(filename, "w");
359
360                 if (file == NULL)
361                         vm_abort("options_xx: fopen failed: %s", strerror(errno));
362
363                 opt_ProfileMemoryUsageGNUPlot = file;
364                 break;
365
366         case OPT_TraceExceptions:
367                 opt_TraceExceptions = true;
368                 break;
369
370         default:
371                 printf("Unknown option: -XX:%s\n", name);
372                 break;
373         }
374 }
375
376
377 /*
378  * These are local overrides for various environment variables in Emacs.
379  * Please do not remove this and leave it at the end of the file, where
380  * Emacs will automagically detect them.
381  * ---------------------------------------------------------------------
382  * Local variables:
383  * mode: c
384  * indent-tabs-mode: t
385  * c-basic-offset: 4
386  * tab-width: 4
387  * End:
388  */