* merged with tip (040f180a056b)
[cacao.git] / src / vm / options.c
1 /* src/vm/options.c - contains global options
2
3    Copyright (C) 1996-2005, 2006, 2007, 2008
4    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
5
6    This file is part of CACAO.
7
8    This program is free software; you can redistribute it and/or
9    modify it under the terms of the GNU General Public License as
10    published by the Free Software Foundation; either version 2, or (at
11    your option) any later version.
12
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301, USA.
22
23 */
24
25
26 #include "config.h"
27
28 #include <limits.h>
29 #include <stdint.h>
30 #include <stdio.h>
31 #include <stdlib.h>
32
33 #include "mm/memory.h"
34
35 #include "native/jni.h"
36
37 #include "vm/options.h"
38 #include "vm/os.hpp"
39 #include "vm/vm.hpp"
40
41
42 /* command line option ********************************************************/
43
44 s4    opt_index = 0;            /* index of processed arguments               */
45 char *opt_arg;                  /* this one exports the option argument       */
46
47 bool opt_foo = false;           /* option for development                     */
48
49 bool opt_jar = false;
50
51 #if defined(ENABLE_JIT)
52 bool opt_jit = true;            /* JIT mode execution (default)               */
53 bool opt_intrp = false;         /* interpreter mode execution                 */
54 #else
55 bool opt_jit = false;           /* JIT mode execution                         */
56 bool opt_intrp = true;          /* interpreter mode execution (default)       */
57 #endif
58
59 bool opt_run = true;
60
61 s4   opt_heapmaxsize   = 0;     /* maximum heap size                          */
62 s4   opt_heapstartsize = 0;     /* initial heap size                          */
63 s4   opt_stacksize     = 0;     /* thread stack size                          */
64
65 bool opt_verbose = false;
66 bool opt_debugcolor = false;    /* use ANSI terminal sequences                */
67 bool compileall = false;
68
69 bool loadverbose = false;
70 bool initverbose = false;
71
72 bool opt_verboseclass     = false;
73 bool opt_verbosegc        = false;
74 bool opt_verbosejni       = false;
75 bool opt_verbosecall      = false;      /* trace all method invocation        */
76
77 bool showmethods = false;
78 bool showconstantpool = false;
79 bool showutf = false;
80
81 char *opt_method = NULL;
82 char *opt_signature = NULL;
83
84 bool compileverbose =  false;           /* trace compiler actions             */
85 bool showstack = false;
86
87 bool opt_showdisassemble    = false;    /* generate disassembler listing      */
88 bool opt_shownops           = false;
89 bool opt_showddatasegment   = false;    /* generate data segment listing      */
90 bool opt_showintermediate   = false;    /* generate intermediate code listing */
91
92 bool checkbounds = true;       /* check array bounds                         */
93 bool opt_noieee = false;       /* don't implement ieee compliant floats      */
94 bool checksync = true;         /* do synchronization                         */
95 #if defined(ENABLE_LOOP)
96 bool opt_loops = false;        /* optimize array accesses in loops           */
97 #endif
98
99 bool makeinitializations = true;
100
101 #if defined(ENABLE_STATISTICS)
102 bool opt_stat    = false;
103 bool opt_getloadingtime = false;   /* to measure the runtime                 */
104 bool opt_getcompilingtime = false; /* compute compile time                   */
105 #endif
106 #if defined(ENABLE_VERIFIER)
107 bool opt_verify  = true;       /* true if classfiles should be verified      */
108 #endif
109
110 #if defined(ENABLE_PROFILING)
111 bool opt_prof    = false;
112 bool opt_prof_bb = false;
113 #endif
114
115 #if defined(ENABLE_OPAGENT)
116 bool opt_opagent = false;
117 #endif
118
119 /* optimization options *******************************************************/
120
121 #if defined(ENABLE_IFCONV)
122 bool opt_ifconv = false;
123 #endif
124
125 #if defined(ENABLE_LSRA) || defined(ENABLE_SSA)
126 bool opt_lsra = false;
127 #endif
128 #if defined(ENABLE_SSA)
129 bool opt_ssa_dce = false;          /* enable dead code elemination */
130 bool opt_ssa_cp = false;           /* enable copy propagation      */
131 #endif
132
133
134 /* interpreter options ********************************************************/
135
136 #if defined(ENABLE_INTRP)
137 bool opt_no_dynamic = false;            /* suppress dynamic superinstructions */
138 bool opt_no_replication = false;        /* don't use replication in intrp     */
139 bool opt_no_quicksuper = false;         /* instructions for quickening cannot be
140                                                                                    part of dynamic superinstructions */
141
142 s4   opt_static_supers = 0x7fffffff;
143 bool vm_debug = false;          /* XXX this should be called `opt_trace'      */
144 #endif
145
146 #if defined(ENABLE_DEBUG_FILTER)
147 const char *opt_filter_verbosecall_include = 0;
148 const char *opt_filter_verbosecall_exclude = 0;
149 const char *opt_filter_show_method = 0;
150 #endif
151
152
153 /* -XX options ****************************************************************/
154
155 /* NOTE: For better readability keep these alpha-sorted. */
156
157 /* Options which must always be available (production options in
158    HotSpot). */
159
160 int64_t  opt_MaxDirectMemorySize          = -1;
161 int      opt_MaxPermSize                  = 0;
162 int      opt_PermSize                     = 0;
163 int      opt_ThreadStackSize              = 0;
164
165 /* Debugging options which can be turned off. */
166
167 int      opt_DebugExceptions              = 0;
168 int      opt_DebugFinalizer               = 0;
169 #if defined(ENABLE_JITCACHE)
170 int      opt_DebugJitCache                = 0;
171 #endif
172 int      opt_DebugLocalReferences         = 0;
173 int      opt_DebugLocks                   = 0;
174 int      opt_DebugPackage                 = 0;
175 int      opt_DebugPatcher                 = 0;
176 int      opt_DebugProperties              = 0;
177 int      opt_DebugStackFrameInfo          = 0;
178 int      opt_DebugStackTrace              = 0;
179 int      opt_DebugThreads                 = 0;
180 #if defined(ENABLE_DISASSEMBLER)
181 int      opt_DisassembleStubs             = 0;
182 #endif
183 #if defined(ENABLE_OPAGENT)
184 int      opt_EnableOpagent                = 0;
185 #endif
186 #if defined(ENABLE_GC_CACAO)
187 int      opt_GCDebugRootSet               = 0;
188 int      opt_GCStress                     = 0;
189 #endif
190 #if defined(ENABLE_INLINING)
191 int      opt_Inline                       = 0;
192 #if defined(ENABLE_INLINING_DEBUG) || !defined(NDEBUG)
193 int      opt_InlineAll                    = 0;
194 int      opt_InlineCount                  = INT_MAX;
195 int      opt_InlineMaxSize                = INT_MAX;
196 int      opt_InlineMinSize                = 0;
197 #endif
198 #endif
199 int      opt_PrintConfig                  = 0;
200 int      opt_ProfileGCMemoryUsage         = 0;
201 int      opt_ProfileMemoryUsage           = 0;
202 FILE    *opt_ProfileMemoryUsageGNUPlot    = NULL;
203 #if defined(ENABLE_REPLACEMENT)
204 int      opt_TestReplacement              = 0;
205 #endif
206 int      opt_TraceCompilerCalls           = 0;
207 int      opt_TraceExceptions              = 0;
208 int      opt_TraceHPI                     = 0;
209 #if defined(ENABLE_INLINING) && !defined(NDEBUG)
210 int      opt_TraceInlining                = 0;
211 #endif
212 int      opt_TraceJavaCalls               = 0;
213 int      opt_TraceJNICalls                = 0;
214 int      opt_TraceJVMCalls                = 0;
215 int      opt_TraceJVMCallsVerbose         = 0;
216 int      opt_TraceLinkClass               = 0;
217 #if defined(ENABLE_REPLACEMENT)
218 int      opt_TraceReplacement             = 0;
219 #endif
220 int      opt_TraceSubsystemInitialization = 0;
221 int      opt_TraceTraps                   = 0;
222
223
224 enum {
225         OPT_TYPE_BOOLEAN,
226         OPT_TYPE_VALUE
227 };
228
229 enum {
230         /* Options which must always be available (production options in
231            HotSpot). */
232
233         OPT_MaxDirectMemorySize,
234         OPT_MaxPermSize,
235         OPT_PermSize,
236         OPT_ThreadStackSize,
237
238         /* Debugging options which can be turned off. */
239
240         OPT_DebugExceptions,
241         OPT_DebugFinalizer,
242   OPT_DebugJitCache,
243         OPT_DebugLocalReferences,
244         OPT_DebugLocks,
245         OPT_DebugPackage,
246         OPT_DebugPatcher,
247         OPT_DebugProperties,
248         OPT_DebugStackFrameInfo,
249         OPT_DebugStackTrace,
250         OPT_DebugThreads,
251         OPT_DisassembleStubs,
252         OPT_EnableOpagent,
253         OPT_GCDebugRootSet,
254         OPT_GCStress,
255         OPT_Inline,
256         OPT_InlineAll,
257         OPT_InlineCount,
258         OPT_InlineMaxSize,
259         OPT_InlineMinSize,
260         OPT_PrintConfig,
261         OPT_ProfileGCMemoryUsage,
262         OPT_ProfileMemoryUsage,
263         OPT_ProfileMemoryUsageGNUPlot,
264         OPT_TestReplacement,
265         OPT_TraceCompilerCalls,
266         OPT_TraceExceptions,
267         OPT_TraceHPI,
268         OPT_TraceInlining,
269         OPT_TraceJavaCalls,
270         OPT_TraceJNICalls,
271         OPT_TraceJVMCalls,
272         OPT_TraceJVMCallsVerbose,
273         OPT_TraceLinkClass,
274         OPT_TraceReplacement,
275         OPT_TraceSubsystemInitialization,
276         OPT_TraceTraps,
277         OPT_Vmlog,
278         OPT_VmlogStrings,
279         OPT_VmlogIgnore
280 };
281
282
283 option_t options_XX[] = {
284         /* Options which must always be available (production options in
285            HotSpot). */
286
287         { "MaxDirectMemorySize",          OPT_MaxDirectMemorySize,          OPT_TYPE_VALUE,   "Maximum total size of NIO direct-buffer allocations" },
288         { "MaxPermSize",                  OPT_MaxPermSize,                  OPT_TYPE_VALUE,   "not implemented" },
289         { "PermSize",                     OPT_PermSize,                     OPT_TYPE_VALUE,   "not implemented" },
290         { "ThreadStackSize",              OPT_ThreadStackSize,              OPT_TYPE_VALUE,   "TODO" },
291
292         /* Debugging options which can be turned off. */
293
294         { "DebugExceptions",              OPT_DebugExceptions,              OPT_TYPE_BOOLEAN, "debug exceptions" },
295         { "DebugFinalizer",               OPT_DebugFinalizer,               OPT_TYPE_BOOLEAN, "debug finalizer thread" },
296 #if defined (ENABLE_JITCACHE)
297   { "DebugJitCache",                OPT_DebugJitCache,                OPT_TYPE_BOOLEAN, "debug JIT cache actions" },
298 #endif
299         { "DebugLocalReferences",         OPT_DebugLocalReferences,         OPT_TYPE_BOOLEAN, "print debug information for local reference tables" },
300         { "DebugLocks",                   OPT_DebugLocks,                   OPT_TYPE_BOOLEAN, "print debug information for locks" },
301         { "DebugPackage",                 OPT_DebugPackage,                 OPT_TYPE_BOOLEAN, "debug Java boot-packages" },
302         { "DebugPatcher",                 OPT_DebugPatcher,                 OPT_TYPE_BOOLEAN, "debug JIT code patching" },
303         { "DebugProperties",              OPT_DebugProperties,              OPT_TYPE_BOOLEAN, "print debug information for properties" },
304         { "DebugStackFrameInfo",          OPT_DebugStackFrameInfo,          OPT_TYPE_BOOLEAN, "TODO" },
305         { "DebugStackTrace",              OPT_DebugStackTrace,              OPT_TYPE_BOOLEAN, "debug stacktrace creation" },
306         { "DebugThreads",                 OPT_DebugThreads,                 OPT_TYPE_BOOLEAN, "print debug information for threads" },
307 #if defined(ENABLE_DISASSEMBLER)
308         { "DisassembleStubs",             OPT_DisassembleStubs,             OPT_TYPE_BOOLEAN, "disassemble builtin and native stubs when generated" },
309 #endif
310 #if defined(ENABLE_OPAGENT)
311         { "EnableOpagent",                OPT_EnableOpagent,                OPT_TYPE_BOOLEAN, "enable providing JIT output to Oprofile" },
312 #endif
313 #if defined(ENABLE_GC_CACAO)
314         { "GCDebugRootSet",               OPT_GCDebugRootSet,               OPT_TYPE_BOOLEAN, "GC: print root-set at collection" },
315         { "GCStress",                     OPT_GCStress,                     OPT_TYPE_BOOLEAN, "GC: forced collection at every allocation" },
316 #endif
317 #if defined(ENABLE_INLINING)
318         { "Inline",                       OPT_Inline,                       OPT_TYPE_BOOLEAN, "enable method inlining" },
319 #if defined(ENABLE_INLINING_DEBUG) || !defined(NDEBUG)
320         { "InlineAll",                    OPT_InlineAll,                    OPT_TYPE_BOOLEAN, "use inlining in all compilations" },
321         { "InlineCount",                  OPT_InlineCount,                  OPT_TYPE_VALUE,   "stop inlining after the given number of roots" },
322         { "InlineMaxSize",                OPT_InlineMaxSize,                OPT_TYPE_VALUE,   "maximum size for inlined result" },
323         { "InlineMinSize",                OPT_InlineMinSize,                OPT_TYPE_VALUE,   "minimum size for inlined result" },
324 #endif
325 #endif
326         { "PrintConfig",                  OPT_PrintConfig,                  OPT_TYPE_BOOLEAN, "print VM configuration" },
327         { "ProfileGCMemoryUsage",         OPT_ProfileGCMemoryUsage,         OPT_TYPE_VALUE,   "profiles GC memory usage in the given interval, <value> is in seconds (default: 5)" },
328         { "ProfileMemoryUsage",           OPT_ProfileMemoryUsage,           OPT_TYPE_VALUE,   "TODO" },
329         { "ProfileMemoryUsageGNUPlot",    OPT_ProfileMemoryUsageGNUPlot,    OPT_TYPE_VALUE,   "TODO" },
330 #if defined(ENABLE_REPLACEMENT)
331         { "TestReplacement",              OPT_TestReplacement,              OPT_TYPE_BOOLEAN, "activate all replacement points during code generation" },
332 #endif
333         { "TraceCompilerCalls",           OPT_TraceCompilerCalls,           OPT_TYPE_BOOLEAN, "trace JIT compiler calls" },
334         { "TraceExceptions",              OPT_TraceExceptions,              OPT_TYPE_BOOLEAN, "trace Exception throwing" },
335         { "TraceHPI",                     OPT_TraceHPI,                     OPT_TYPE_BOOLEAN, "Trace Host Porting Interface (HPI)" },
336 #if defined(ENABLE_INLINING) && !defined(NDEBUG)
337         { "TraceInlining",                OPT_TraceInlining,                OPT_TYPE_VALUE,   "trace method inlining with the given verbosity level (default: 1)" },
338 #endif
339 #if !defined(ENABLE_VMLOG)
340         { "TraceJavaCalls",               OPT_TraceJavaCalls,               OPT_TYPE_BOOLEAN, "trace Java method calls" },
341 #endif
342         { "TraceJNICalls",                OPT_TraceJNICalls,                OPT_TYPE_BOOLEAN, "trace JNI method calls" },
343         { "TraceJVMCalls",                OPT_TraceJVMCalls,                OPT_TYPE_BOOLEAN, "trace JVM method calls but omit very frequent ones" },
344         { "TraceJVMCallsVerbose",         OPT_TraceJVMCallsVerbose,         OPT_TYPE_BOOLEAN, "trace all JVM method calls" },
345         { "TraceLinkClass",               OPT_TraceLinkClass,               OPT_TYPE_BOOLEAN, "trace class linking" },
346 #if defined(ENABLE_REPLACEMENT)
347         { "TraceReplacement",             OPT_TraceReplacement,             OPT_TYPE_VALUE,   "trace on-stack replacement with the given verbosity level (default: 1)" },
348 #endif
349         { "TraceSubsystemInitialization", OPT_TraceSubsystemInitialization, OPT_TYPE_BOOLEAN, "trace initialization of subsystems" },
350         { "TraceTraps",                   OPT_TraceTraps,                   OPT_TYPE_BOOLEAN, "trace traps generated by JIT code" },
351 #if defined(ENABLE_VMLOG)
352         { "Vmlog",                        OPT_Vmlog,                        OPT_TYPE_VALUE,   "prefix for vmlog trace files (enables vmlog)" },
353         { "VmlogStrings",                 OPT_VmlogStrings,                 OPT_TYPE_VALUE,   "prefix of vmlog string file to load" },
354         { "VmlogIgnore",                  OPT_VmlogIgnore,                  OPT_TYPE_VALUE,   "prefix of vmlog ignore file to load" },
355 #endif
356
357         /* end marker */
358
359         { NULL,                           -1,                               -1,               NULL }
360 };
361
362
363 /* options_get *****************************************************************
364
365    DOCUMENT ME!!!
366
367 *******************************************************************************/
368
369 int options_get(opt_struct *opts, JavaVMInitArgs *vm_args)
370 {
371         char *option;
372         int   i;
373
374         if (opt_index >= vm_args->nOptions)
375                 return OPT_DONE;
376
377         /* get the current option */
378
379         option = vm_args->options[opt_index].optionString;
380
381         if ((option == NULL) || (option[0] != '-'))
382                 return OPT_DONE;
383
384         for (i = 0; opts[i].name; i++) {
385                 if (!opts[i].arg) {
386                         /* boolean option found */
387
388                         if (strcmp(option + 1, opts[i].name) == 0) {
389                                 opt_index++;
390                                 return opts[i].value;
391                         }
392
393                 } else {
394                         /* parameter option found */
395
396                         /* with a space between */
397
398                         if (strcmp(option + 1, opts[i].name) == 0) {
399                                 opt_index++;
400
401                                 if (opt_index < vm_args->nOptions) {
402                                         opt_arg = os_strdup(vm_args->options[opt_index].optionString);
403                                         opt_index++;
404                                         return opts[i].value;
405                                 }
406
407                                 return OPT_ERROR;
408
409                         } else {
410                                 /* parameter and option have no space between */
411
412                                 /* FIXME: this assumption is plain wrong, hits you if there is a
413                                  * parameter with no argument starting with same letter as param with argument
414                                  * but named after that one, ouch! */
415
416                                 size_t l = os_strlen(opts[i].name);
417
418                                 if (os_strlen(option + 1) > l) {
419                                         if (memcmp(option + 1, opts[i].name, l) == 0) {
420                                                 opt_index++;
421                                                 opt_arg = os_strdup(option + 1 + l);
422                                                 return opts[i].value;
423                                         }
424                                 }
425                         }
426                 }
427         }
428
429         return OPT_ERROR;
430 }
431
432
433 /* options_xxusage *************************************************************
434
435    Print usage message for debugging options.
436
437 *******************************************************************************/
438
439 static void options_xxusage(void)
440 {
441         option_t   *opt;
442         int         length;
443         int         i;
444         const char *c;
445
446         /* Prevent compiler warning. */
447
448         length = 0;
449
450         for (opt = options_XX; opt->name != NULL; opt++) {
451                 printf("    -XX:");
452
453                 switch (opt->type) {
454                 case OPT_TYPE_BOOLEAN:
455                         printf("+%s", opt->name);
456                         length = os_strlen("    -XX:+") + os_strlen(opt->name);
457                         break;
458
459                 case OPT_TYPE_VALUE:
460                         printf("%s=<value>", opt->name);
461                         length = os_strlen("    -XX:") + os_strlen(opt->name) +
462                                 os_strlen("=<value>");
463                         break;
464
465                 default:
466                         vm_abort("options_xxusage: unkown option type %d", opt->type);
467                 }
468
469                 /* Check if the help fits into one 80-column line.
470                    Documentation starts at column 29. */
471
472                 if (length < (29 - 1)) {
473                         /* Print missing spaces up to column 29. */
474
475                         for (i = length; i < 29; i++)
476                                 printf(" ");
477                 }
478                 else {
479                         printf("\n");
480                         printf("                             "); /* 29 spaces */
481                 }
482
483                 /* Check documentation length. */
484
485                 length = os_strlen(opt->doc);
486
487                 if (length < (80 - 29)) {
488                         printf("%s", opt->doc);
489                 }
490                 else {
491                         for (c = opt->doc, i = 29; *c != 0; c++, i++) {
492                                 /* If we are at the end of the line, break it. */
493
494                                 if (i == 80) {
495                                         printf("\n");
496                                         printf("                             "); /* 29 spaces */
497                                         i = 29;
498                                 }
499
500                                 printf("%c", *c);
501                         }
502                 }
503
504                 printf("\n");
505         }
506
507         /* exit with error code */
508
509         exit(1);
510 }
511
512
513 /* options_xx ******************************************************************
514
515    Handle -XX: options.
516
517 *******************************************************************************/
518
519 void options_xx(JavaVMInitArgs *vm_args)
520 {
521         const char *name;
522         const char *start;
523         char       *end;
524         int         length;
525         int         enable;
526         char       *value;
527         option_t   *opt;
528         char       *filename;
529         FILE       *file;
530         int         i;
531
532         /* Iterate over all passed options. */
533
534         for (i = 0; i < vm_args->nOptions; i++) {
535                 /* Get the current option. */
536
537                 name = vm_args->options[i].optionString;
538
539                 /* Check for help (-XX). */
540
541                 if (strcmp(name, "-XX") == 0)
542                         options_xxusage();
543
544                 /* Check if the option start with -XX. */
545
546                 start = strstr(name, "-XX:");
547
548                 if ((start == NULL) || (start != name))
549                         continue;
550
551                 /* Check if the option is a boolean option. */
552
553                 if (name[4] == '+') {
554                         start  = name + 4 + 1;
555                         enable = 1;
556                 }
557                 else if (name[4] == '-') {
558                         start  = name + 4 + 1;
559                         enable = 0;
560                 }
561                 else {
562                         start  = name + 4;
563                         enable = -1;
564                 }
565
566                 /* Search for a '=' in the option name and get the option name
567                    length and the value of the option. */
568
569                 end = strchr(start, '=');
570
571                 if (end == NULL) {
572                         length = os_strlen(start);
573                         value  = NULL;
574                 }
575                 else {
576                         length = end - start;
577                         value  = end + 1;
578                 }
579
580                 /* Search the option in the option array. */
581
582                 for (opt = options_XX; opt->name != NULL; opt++) {
583                         if (strncmp(opt->name, start, length) == 0) {
584                                 /* Check if the options passed fits to the type. */
585
586                                 switch (opt->type) {
587                                 case OPT_TYPE_BOOLEAN:
588                                         if ((enable == -1) || (value != NULL))
589                                                 options_xxusage();
590                                         break;
591                                 case OPT_TYPE_VALUE:
592                                         if ((enable != -1) || (value == NULL))
593                                                 options_xxusage();
594                                         break;
595                                 default:
596                                         vm_abort("options_xx: unknown option type %d for option %s",
597                                                          opt->type, opt->name);
598                                 }
599
600                                 break;
601                         }
602                 }
603
604                 /* Process the option. */
605
606                 switch (opt->value) {
607
608                 /* Options which must always be available (production options
609                    in HotSpot). */
610
611                 case OPT_MaxDirectMemorySize:
612                         opt_MaxDirectMemorySize = os_atoi(value);
613                         break;
614
615                 case OPT_MaxPermSize:
616                         /* Currently ignored. */
617                         break;
618
619                 case OPT_PermSize:
620                         /* Currently ignored. */
621                         break;
622
623                 case OPT_ThreadStackSize:
624                         /* currently ignored */
625                         break;
626
627                 /* Debugging options which can be turned off. */
628
629                 case OPT_DebugExceptions:
630                         opt_DebugExceptions = enable;
631                         break;
632
633                 case OPT_DebugFinalizer:
634                         opt_DebugFinalizer = enable;
635                         break;
636
637 #if defined(ENABLE_JITCACHE)
638     case OPT_DebugJitCache:
639       opt_DebugJitCache = enable;
640       break;
641 #endif
642
643                 case OPT_DebugLocalReferences:
644                         opt_DebugLocalReferences = enable;
645                         break;
646
647                 case OPT_DebugLocks:
648                         opt_DebugLocks = enable;
649                         break;
650
651                 case OPT_DebugPackage:
652                         opt_DebugPackage = enable;
653                         break;
654
655                 case OPT_DebugPatcher:
656                         opt_DebugPatcher = enable;
657                         break;
658
659                 case OPT_DebugProperties:
660                         opt_DebugProperties = enable;
661                         break;
662
663                 case OPT_DebugStackFrameInfo:
664                         opt_DebugStackFrameInfo = enable;
665                         break;
666
667                 case OPT_DebugStackTrace:
668                         opt_DebugStackTrace = enable;
669                         break;
670
671                 case OPT_DebugThreads:
672                         opt_DebugThreads = enable;
673                         break;
674
675 #if defined(ENABLE_DISASSEMBLER)
676                 case OPT_DisassembleStubs:
677                         opt_DisassembleStubs = enable;
678                         break;
679 #endif
680
681 #if defined(ENABLE_OPAGENT)
682                 case OPT_EnableOpagent:
683                         opt_EnableOpagent = enable;
684                         break;
685 #endif
686
687 #if defined(ENABLE_GC_CACAO)
688                 case OPT_GCDebugRootSet:
689                         opt_GCDebugRootSet = enable;
690                         break;
691
692                 case OPT_GCStress:
693                         opt_GCStress = enable;
694                         break;
695 #endif
696
697 #if defined(ENABLE_INLINING)
698                 case OPT_Inline:
699                         opt_Inline = enable;
700                         break;
701 #if defined(ENABLE_INLINING_DEBUG) || !defined(NDEBUG)
702                 case OPT_InlineAll:
703                         opt_InlineAll = enable;
704                         break;
705
706                 case OPT_InlineCount:
707                         if (value != NULL)
708                                 opt_InlineCount = os_atoi(value);
709                         break;
710
711                 case OPT_InlineMaxSize:
712                         if (value != NULL)
713                                 opt_InlineMaxSize = os_atoi(value);
714                         break;
715
716                 case OPT_InlineMinSize:
717                         if (value != NULL)
718                                 opt_InlineMinSize = os_atoi(value);
719                         break;
720 #endif
721 #endif
722
723                 case OPT_PrintConfig:
724                         opt_PrintConfig = enable;
725                         break;
726
727                 case OPT_ProfileGCMemoryUsage:
728                         if (value == NULL)
729                                 opt_ProfileGCMemoryUsage = 5;
730                         else
731                                 opt_ProfileGCMemoryUsage = os_atoi(value);
732                         break;
733
734                 case OPT_ProfileMemoryUsage:
735                         if (value == NULL)
736                                 opt_ProfileMemoryUsage = 5;
737                         else
738                                 opt_ProfileMemoryUsage = os_atoi(value);
739
740 # if defined(ENABLE_STATISTICS)
741                         /* we also need statistics */
742
743                         opt_stat = true;
744 # endif
745                         break;
746
747                 case OPT_ProfileMemoryUsageGNUPlot:
748                         if (value == NULL)
749                                 filename = "profile.dat";
750                         else
751                                 filename = value;
752
753                         file = fopen(filename, "w");
754
755                         if (file == NULL)
756                                 vm_abort_errno("options_xx: fopen failed");
757
758                         opt_ProfileMemoryUsageGNUPlot = file;
759                         break;
760
761 #if defined(ENABLE_REPLACEMENT)
762                 case OPT_TestReplacement:
763                         opt_TestReplacement = enable;
764                         break;
765 #endif
766
767                 case OPT_TraceCompilerCalls:
768                         opt_TraceCompilerCalls = enable;
769                         break;
770
771                 case OPT_TraceExceptions:
772                         opt_TraceExceptions = enable;
773                         break;
774
775                 case OPT_TraceHPI:
776                         opt_TraceHPI = enable;
777                         break;
778
779 #if defined(ENABLE_INLINING) && !defined(NDEBUG)
780                 case OPT_TraceInlining:
781                         if (value == NULL)
782                                 opt_TraceInlining = 1;
783                         else
784                                 opt_TraceInlining = os_atoi(value);
785                         break;
786 #endif
787
788                 case OPT_TraceJavaCalls:
789                         opt_verbosecall = enable;
790                         opt_TraceJavaCalls = enable;
791                         break;
792
793                 case OPT_TraceJNICalls:
794                         opt_TraceJNICalls = enable;
795                         break;
796
797                 case OPT_TraceJVMCalls:
798                         opt_TraceJVMCalls = enable;
799                         break;
800
801                 case OPT_TraceJVMCallsVerbose:
802                         opt_TraceJVMCallsVerbose = enable;
803                         break;
804
805                 case OPT_TraceLinkClass:
806                         opt_TraceLinkClass = enable;
807                         break;
808
809 #if defined(ENABLE_REPLACEMENT)
810                 case OPT_TraceReplacement:
811                         if (value == NULL)
812                                 opt_TraceReplacement = 1;
813                         else
814                                 opt_TraceReplacement = os_atoi(value);
815                         break;
816 #endif
817
818                 case OPT_TraceSubsystemInitialization:
819                         opt_TraceSubsystemInitialization = enable;
820                         break;
821
822                 case OPT_TraceTraps:
823                         opt_TraceTraps = enable;
824                         break;
825
826 #if defined(ENABLE_VMLOG)
827                 case OPT_Vmlog:
828                         if (value == NULL)
829                                 vmlog_cacao_set_prefix("vmlog");
830                         else
831                                 vmlog_cacao_set_prefix(value);
832                         opt_verbosecall = 1;
833                         opt_TraceJavaCalls = 1;
834                         break;
835
836                 case OPT_VmlogStrings:
837                         if (value != NULL)
838                                 vmlog_cacao_set_stringprefix(value);
839                         break;
840
841                 case OPT_VmlogIgnore:
842                         if (value != NULL)
843                                 vmlog_cacao_set_ignoreprefix(value);
844                         break;
845 #endif
846
847                 default:
848                         printf("Unknown -XX option: %s\n", name);
849                         break;
850                 }
851         }
852 }
853
854
855 /*
856  * These are local overrides for various environment variables in Emacs.
857  * Please do not remove this and leave it at the end of the file, where
858  * Emacs will automagically detect them.
859  * ---------------------------------------------------------------------
860  * Local variables:
861  * mode: c
862  * indent-tabs-mode: t
863  * c-basic-offset: 4
864  * tab-width: 4
865  * End:
866  */