1 /* src/vmcore/options.c - contains global options
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
8 This file is part of CACAO.
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.
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.
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
35 #if defined(HAVE_STRING_H)
41 #include "mm/memory.h"
43 #include "native/jni.h"
47 #include "vmcore/options.h"
50 /* command line option ********************************************************/
52 s4 opt_index = 0; /* index of processed arguments */
53 char *opt_arg; /* this one exports the option argument */
55 bool opt_foo = false; /* option for development */
59 #if defined(ENABLE_JIT)
60 bool opt_jit = true; /* JIT mode execution (default) */
61 bool opt_intrp = false; /* interpreter mode execution */
63 bool opt_jit = false; /* JIT mode execution */
64 bool opt_intrp = true; /* interpreter mode execution (default) */
69 s4 opt_heapmaxsize = 0; /* maximum heap size */
70 s4 opt_heapstartsize = 0; /* initial heap size */
71 s4 opt_stacksize = 0; /* thread stack size */
73 bool opt_verbose = false;
74 bool opt_debugcolor = false; /* use ANSI terminal sequences */
75 bool compileall = false;
77 bool loadverbose = false;
78 bool initverbose = false;
80 bool opt_verboseclass = false;
81 bool opt_verbosegc = false;
82 bool opt_verbosejni = false;
83 bool opt_verbosecall = false; /* trace all method invocation */
85 bool showmethods = false;
86 bool showconstantpool = false;
89 char *opt_method = NULL;
90 char *opt_signature = NULL;
92 bool compileverbose = false; /* trace compiler actions */
93 bool showstack = false;
95 bool opt_showdisassemble = false; /* generate disassembler listing */
96 bool opt_shownops = false;
97 bool opt_showddatasegment = false; /* generate data segment listing */
98 bool opt_showintermediate = false; /* generate intermediate code listing */
100 bool checkbounds = true; /* check array bounds */
101 bool opt_noieee = false; /* don't implement ieee compliant floats */
102 bool checksync = true; /* do synchronization */
103 #if defined(ENABLE_LOOP)
104 bool opt_loops = false; /* optimize array accesses in loops */
107 bool makeinitializations = true;
109 #if defined(ENABLE_STATISTICS)
110 bool opt_stat = false;
111 bool opt_getloadingtime = false; /* to measure the runtime */
112 bool opt_getcompilingtime = false; /* compute compile time */
114 #if defined(ENABLE_VERIFIER)
115 bool opt_verify = true; /* true if classfiles should be verified */
118 #if defined(ENABLE_PROFILING)
119 bool opt_prof = false;
120 bool opt_prof_bb = false;
124 /* inlining options ***********************************************************/
126 #if defined(ENABLE_INLINING)
127 bool opt_inlining = false;
128 #if defined(ENABLE_INLINING_DEBUG) || !defined(NDEBUG)
129 s4 opt_inline_debug_min_size = 0;
130 s4 opt_inline_debug_max_size = INT_MAX;
131 s4 opt_inline_debug_end_counter = INT_MAX;
132 bool opt_inline_debug_all = false;
133 #endif /* defined(ENABLE_INLINING_DEBUG) || !defined(NDEBUG) */
135 bool opt_inline_debug_log = false;
136 #endif /* !defined(NDEBUG) */
137 #endif /* defined(ENABLE_INLINING) */
140 /* optimization options *******************************************************/
142 #if defined(ENABLE_IFCONV)
143 bool opt_ifconv = false;
146 #if defined(ENABLE_LSRA) || defined(ENABLE_SSA)
147 bool opt_lsra = false;
149 #if defined(ENABLE_SSA)
150 bool opt_ssa_dce = false; /* enable dead code elemination */
151 bool opt_ssa_cp = false; /* enable copy propagation */
155 /* interpreter options ********************************************************/
157 #if defined(ENABLE_INTRP)
158 bool opt_no_dynamic = false; /* suppress dynamic superinstructions */
159 bool opt_no_replication = false; /* don't use replication in intrp */
160 bool opt_no_quicksuper = false; /* instructions for quickening cannot be
161 part of dynamic superinstructions */
163 s4 opt_static_supers = 0x7fffffff;
164 bool vm_debug = false; /* XXX this should be called `opt_trace' */
167 #if defined(ENABLE_DEBUG_FILTER)
168 const char *opt_filter_verbosecall_include = 0;
169 const char *opt_filter_verbosecall_exclude = 0;
170 const char *opt_filter_show_method = 0;
174 /* -XX options ****************************************************************/
176 /* NOTE: For better readability keep these alpha-sorted. */
178 int opt_DebugExceptions = 0;
179 int opt_DebugFinalizer = 0;
180 int opt_DebugLocalReferences = 0;
181 int opt_DebugLocks = 0;
182 int opt_DebugPackage = 0;
183 int opt_DebugPatcher = 0;
184 int opt_DebugProperties = 0;
185 int32_t opt_DebugStackFrameInfo = 0;
186 int opt_DebugStackTrace = 0;
187 int opt_DebugThreads = 0;
188 #if defined(ENABLE_DISASSEMBLER)
189 int opt_DisassembleStubs = 0;
191 #if defined(ENABLE_GC_CACAO)
192 int32_t opt_GCDebugRootSet = 0;
193 int32_t opt_GCStress = 0;
195 int32_t opt_MaxPermSize = 0;
196 int32_t opt_PermSize = 0;
197 int opt_PrintConfig = 0;
198 int32_t opt_ProfileGCMemoryUsage = 0;
199 int32_t opt_ProfileMemoryUsage = 0;
200 FILE *opt_ProfileMemoryUsageGNUPlot = NULL;
201 #if defined(ENABLE_REPLACEMENT)
202 int opt_TestReplacement = 0;
204 int32_t opt_ThreadStackSize = 0;
205 int opt_TraceCompilerCalls = 0;
206 int32_t opt_TraceExceptions = 0;
207 int32_t opt_TraceJavaCalls = 0;
208 int32_t opt_TraceJNICalls = 0;
209 int32_t opt_TraceJVMCalls = 0;
210 int32_t opt_TraceJVMCallsVerbose = 0;
211 int32_t opt_TraceLinkClass = 0;
212 #if defined(ENABLE_REPLACEMENT)
213 int32_t opt_TraceReplacement = 0;
225 OPT_DebugLocalReferences,
230 OPT_DebugStackFrameInfo,
233 OPT_DisassembleStubs,
239 OPT_ProfileGCMemoryUsage,
240 OPT_ProfileMemoryUsage,
241 OPT_ProfileMemoryUsageGNUPlot,
244 OPT_TraceCompilerCalls,
249 OPT_TraceJVMCallsVerbose,
255 option_t options_XX[] = {
256 { "DebugExceptions", OPT_DebugExceptions, OPT_TYPE_BOOLEAN, "debug exceptions" },
257 { "DebugFinalizer", OPT_DebugFinalizer, OPT_TYPE_BOOLEAN, "debug finalizer thread" },
258 { "DebugLocalReferences", OPT_DebugLocalReferences, OPT_TYPE_BOOLEAN, "print debug information for local reference tables" },
259 { "DebugLocks", OPT_DebugLocks, OPT_TYPE_BOOLEAN, "print debug information for locks" },
260 { "DebugPackage", OPT_DebugPackage, OPT_TYPE_BOOLEAN, "debug Java boot-packages" },
261 { "DebugPatcher", OPT_DebugPatcher, OPT_TYPE_BOOLEAN, "debug JIT code patching" },
262 { "DebugProperties", OPT_DebugProperties, OPT_TYPE_BOOLEAN, "print debug information for properties" },
263 { "DebugStackFrameInfo", OPT_DebugStackFrameInfo, OPT_TYPE_BOOLEAN, "TODO" },
264 { "DebugStackTrace", OPT_DebugStackTrace, OPT_TYPE_BOOLEAN, "debug stacktrace creation" },
265 { "DebugThreads", OPT_DebugThreads, OPT_TYPE_BOOLEAN, "print debug information for threads" },
266 #if defined(ENABLE_DISASSEMBLER)
267 { "DisassembleStubs", OPT_DisassembleStubs, OPT_TYPE_BOOLEAN, "disassemble builtin and native stubs when generated" },
269 #if defined(ENABLE_GC_CACAO)
270 { "GCDebugRootSet", OPT_GCDebugRootSet, OPT_TYPE_BOOLEAN, "GC: print root-set at collection" },
271 { "GCStress", OPT_GCStress, OPT_TYPE_BOOLEAN, "GC: forced collection at every allocation" },
273 { "MaxPermSize", OPT_MaxPermSize, OPT_TYPE_VALUE, "not implemented" },
274 { "PermSize", OPT_PermSize, OPT_TYPE_VALUE, "not implemented" },
275 { "PrintConfig", OPT_PrintConfig, OPT_TYPE_BOOLEAN, "print VM configuration" },
276 { "ProfileGCMemoryUsage", OPT_ProfileGCMemoryUsage, OPT_TYPE_VALUE, "profiles GC memory usage in the given interval, <value> is in seconds (default: 5)" },
277 { "ProfileMemoryUsage", OPT_ProfileMemoryUsage, OPT_TYPE_VALUE, "TODO" },
278 { "ProfileMemoryUsageGNUPlot", OPT_ProfileMemoryUsageGNUPlot, OPT_TYPE_VALUE, "TODO" },
279 #if defined(ENABLE_REPLACEMENT)
280 { "TestReplacement" , OPT_TestReplacement, OPT_TYPE_BOOLEAN, "activate all replacement points during code generation" },
282 { "ThreadStackSize", OPT_ThreadStackSize, OPT_TYPE_VALUE, "TODO" },
283 { "TraceCompilerCalls", OPT_TraceCompilerCalls, OPT_TYPE_BOOLEAN, "trace JIT compiler calls" },
284 { "TraceExceptions", OPT_TraceExceptions, OPT_TYPE_BOOLEAN, "trace Exception throwing" },
285 { "TraceJavaCalls", OPT_TraceJavaCalls, OPT_TYPE_BOOLEAN, "trace Java method calls" },
286 { "TraceJNICalls", OPT_TraceJNICalls, OPT_TYPE_BOOLEAN, "trace JNI method calls" },
287 { "TraceJVMCalls", OPT_TraceJVMCalls, OPT_TYPE_BOOLEAN, "trace JVM method calls but omit very frequent ones" },
288 { "TraceJVMCallsVerbose", OPT_TraceJVMCallsVerbose, OPT_TYPE_BOOLEAN, "trace all JVM method calls" },
289 { "TraceLinkClass", OPT_TraceLinkClass, OPT_TYPE_BOOLEAN, "trace class linking" },
290 #if defined(ENABLE_REPLACEMENT)
291 { "TraceReplacement", OPT_TraceReplacement, OPT_TYPE_VALUE, "trace on-stack replacement with the given verbosity level (default: 1)" },
296 { NULL, -1, -1, NULL }
300 /* options_get *****************************************************************
304 *******************************************************************************/
306 s4 options_get(opt_struct *opts, JavaVMInitArgs *vm_args)
311 if (opt_index >= vm_args->nOptions)
314 /* get the current option */
316 option = vm_args->options[opt_index].optionString;
318 if ((option == NULL) || (option[0] != '-'))
321 for (i = 0; opts[i].name; i++) {
323 /* boolean option found */
325 if (strcmp(option + 1, opts[i].name) == 0) {
327 return opts[i].value;
331 /* parameter option found */
333 /* with a space between */
335 if (strcmp(option + 1, opts[i].name) == 0) {
338 if (opt_index < vm_args->nOptions) {
340 #if defined(HAVE_STRDUP)
341 opt_arg = strdup(vm_args->options[opt_index].optionString);
347 return opts[i].value;
353 /* parameter and option have no space between */
355 /* FIXME: this assumption is plain wrong, hits you if there is a
356 * parameter with no argument starting with same letter as param with argument
357 * but named after that one, ouch! */
359 size_t l = strlen(opts[i].name);
361 if (strlen(option + 1) > l) {
362 if (memcmp(option + 1, opts[i].name, l) == 0) {
365 #if defined(HAVE_STRDUP)
366 opt_arg = strdup(option + 1 + l);
371 return opts[i].value;
382 /* options_xxusage *************************************************************
384 Print usage message for debugging options.
386 *******************************************************************************/
388 static void options_xxusage(void)
395 for (opt = options_XX; opt->name != NULL; opt++) {
399 case OPT_TYPE_BOOLEAN:
400 printf("+%s", opt->name);
401 length = strlen(" -XX:+") + strlen(opt->name);
404 printf("%s=<value>", opt->name);
405 length = strlen(" -XX:") + strlen(opt->name) + strlen("=<value>");
409 /* Check if the help fits into one 80-column line.
410 Documentation starts at column 29. */
412 if (length < (29 - 1)) {
413 /* Print missing spaces up to column 29. */
415 for (i = length; i < 29; i++)
420 printf(" "); /* 29 spaces */
423 /* Check documentation length. */
425 length = strlen(opt->doc);
427 if (length < (80 - 29)) {
428 printf("%s", opt->doc);
431 for (c = opt->doc, i = 29; *c != 0; c++, i++) {
432 /* If we are at the end of the line, break it. */
436 printf(" "); /* 29 spaces */
447 /* exit with error code */
453 /* options_xx ******************************************************************
457 *******************************************************************************/
459 void options_xx(JavaVMInitArgs *vm_args)
472 /* Iterate over all passed options. */
474 for (i = 0; i < vm_args->nOptions; i++) {
475 /* Get the current option. */
477 name = vm_args->options[i].optionString;
479 /* Check for help (-XX). */
481 if (strcmp(name, "-XX") == 0)
484 /* Check if the option start with -XX. */
486 start = strstr(name, "-XX:");
488 if ((start == NULL) || (start != name))
491 /* Check if the option is a boolean option. */
493 if (name[4] == '+') {
494 start = name + 4 + 1;
497 else if (name[4] == '-') {
498 start = name + 4 + 1;
506 /* Search for a '=' in the option name and get the option name
507 length and the value of the option. */
509 end = strchr(start, '=');
512 length = strlen(start);
516 length = end - start;
520 /* Search the option in the option array. */
522 for (opt = options_XX; opt->name != NULL; opt++) {
523 if (strncmp(opt->name, start, length) == 0) {
524 /* Check if the options passed fits to the type. */
527 case OPT_TYPE_BOOLEAN:
528 if ((enable == -1) || (value != NULL))
532 if ((enable != -1) || (value == NULL))
536 vm_abort("options_xx: unknown option type %d for option %s",
537 opt->type, opt->name);
544 /* Process the option. */
546 switch (opt->value) {
547 case OPT_DebugExceptions:
548 opt_DebugExceptions = enable;
551 case OPT_DebugFinalizer:
552 opt_DebugFinalizer = enable;
555 case OPT_DebugLocalReferences:
556 opt_DebugLocalReferences = enable;
560 opt_DebugLocks = enable;
563 case OPT_DebugPackage:
564 opt_DebugPackage = enable;
567 case OPT_DebugPatcher:
568 opt_DebugPatcher = enable;
571 case OPT_DebugProperties:
572 opt_DebugProperties = enable;
575 case OPT_DebugStackFrameInfo:
576 opt_DebugStackFrameInfo = enable;
579 case OPT_DebugStackTrace:
580 opt_DebugStackTrace = enable;
583 case OPT_DebugThreads:
584 opt_DebugThreads = enable;
587 #if defined(ENABLE_DISASSEMBLER)
588 case OPT_DisassembleStubs:
589 opt_DisassembleStubs = enable;
593 #if defined(ENABLE_GC_CACAO)
594 case OPT_GCDebugRootSet:
595 opt_GCDebugRootSet = enable;
599 opt_GCStress = enable;
603 case OPT_MaxPermSize:
604 /* currently ignored */
608 /* currently ignored */
611 case OPT_PrintConfig:
612 opt_PrintConfig = enable;
615 case OPT_ProfileGCMemoryUsage:
617 opt_ProfileGCMemoryUsage = 5;
619 opt_ProfileGCMemoryUsage = atoi(value);
622 case OPT_ProfileMemoryUsage:
624 opt_ProfileMemoryUsage = 5;
626 opt_ProfileMemoryUsage = atoi(value);
628 # if defined(ENABLE_STATISTICS)
629 /* we also need statistics */
635 case OPT_ProfileMemoryUsageGNUPlot:
637 filename = "profile.dat";
641 file = fopen(filename, "w");
644 vm_abort("options_xx: fopen failed: %s", strerror(errno));
646 opt_ProfileMemoryUsageGNUPlot = file;
649 #if defined(ENABLE_REPLACEMENT)
650 case OPT_TestReplacement:
651 opt_TestReplacement = enable;
655 case OPT_ThreadStackSize:
656 /* currently ignored */
659 case OPT_TraceCompilerCalls:
660 opt_TraceCompilerCalls = enable;
663 case OPT_TraceExceptions:
664 opt_TraceExceptions = enable;
667 case OPT_TraceJavaCalls:
668 opt_verbosecall = enable;
669 opt_TraceJavaCalls = enable;
672 case OPT_TraceJNICalls:
673 opt_TraceJNICalls = enable;
676 case OPT_TraceJVMCalls:
677 opt_TraceJVMCalls = enable;
680 case OPT_TraceJVMCallsVerbose:
681 opt_TraceJVMCallsVerbose = enable;
684 case OPT_TraceLinkClass:
685 opt_TraceLinkClass = enable;
688 #if defined(ENABLE_REPLACEMENT)
689 case OPT_TraceReplacement:
691 opt_TraceReplacement = 1;
693 opt_TraceReplacement = atoi(value);
698 printf("Unknown -XX option: %s\n", name);
706 * These are local overrides for various environment variables in Emacs.
707 * Please do not remove this and leave it at the end of the file, where
708 * Emacs will automagically detect them.
709 * ---------------------------------------------------------------------
712 * indent-tabs-mode: t