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