001 /*
002 * This file is part of the Jikes RVM project (http://jikesrvm.org).
003 *
004 * This file is licensed to You under the Eclipse Public License (EPL);
005 * You may not use this file except in compliance with the License. You
006 * may obtain a copy of the License at
007 *
008 * http://www.opensource.org/licenses/eclipse-1.0.php
009 *
010 * See the COPYRIGHT.txt file distributed with this work for information
011 * regarding copyright ownership.
012 */
013 package org.jikesrvm;
014
015 import org.vmmagic.pragma.*;
016
017 /**
018 * Class to handle command-line arguments and options meant
019 * for the core runtime system of the VM.
020 * <p>
021 * Note: This file is mechanically generated from Options.template.
022 * <p>
023 * Note: Boolean options are defined in /home/dgrove/rvm-trunk/rvm/src-generated/options/BooleanOptions.vm.dat
024 * All other options are defined in /home/dgrove/rvm-trunk/rvm/src-generated/options/ValueOptions.vm.dat
025 * (value, enumeration)
026 * <p>
027 * NOTE: This class does not support all of the types of
028 * options found in the other Jikes RVM options
029 * files. This is intentional and is done to enable
030 * -X:vm options to be processed very early in the
031 * booting process.
032 *
033 **/
034 @Uninterruptible public class Options extends Configuration {
035
036 // Begin template-specified options
037 public static boolean MeasureCompilation = false; // Time all compilations and report on exit
038 public static boolean MeasureCompilationPhases = false; // Time all compilation sub-phases and report on exit
039 public static boolean stackTraceFull = false; // Stack traces to consist of VM and application frames
040 public static boolean stackTraceAtExit = false; // Dump a stack trace (via VM.syswrite) upon exit
041 public static boolean TraceClassLoading = false; // More detailed tracing then -verbose:class
042 public static boolean ErrorsFatal = false; // Exit when non-fatal errors are detected; used for regression testing
043 public static boolean traceJNI = false; // Trace when calls into JNI happen
044 public static boolean countThreadTransitions = false; // Count, and report, the number of thread state transitions. This works better on IA32 than on PPC at the moment.
045 public static int maxSystemTroubleRecursionDepth = 3; // If we get deeper than this in one of the System Trouble functions, try to die.
046 public static int interruptQuantum = 4; // Timer interrupt scheduling quantum in ms
047 public static int schedulingMultiplier = 1; // Scheduling quantum = interruptQuantum * schedulingMultiplier
048 public static int TraceThreadScheduling = 0; // Trace actions taken by thread scheduling
049 public static int VerboseStackTracePeriod = 0; // Trace every nth time a stack trace is created
050 public static String EdgeCounterFile = null; // Input file of edge counter profile data
051 public static int CBSCallSamplesPerTick = 8; // How many CBS call samples (Prologue/Epilogue) should we take per time tick
052 public static int CBSCallSampleStride = 2; // Stride between each CBS call sample (Prologue/Epilogue) within a sampling window
053 public static int CBSMethodSamplesPerTick = 0; // How many CBS method samples (any yieldpoint) should we take per time tick
054 public static int CBSMethodSampleStride = 3; // Stride between each CBS method sample (any yieldpoint) within a sampling window
055 public static String TuningForkTraceFile = null; // Filename to use for TuningFork trace generation
056 public static int forceOneCPU = -1; // Force all threads to run on one CPU. The argument specifies which CPU (starting from 0).
057 // End template-specified options
058
059 // Begin generated support for "Enumeration" options
060 // End generated support for "Enumeration" options
061
062 /**
063 * Take a string (most likely a command-line argument) and try to proccess it
064 * as an option command. Return true if the string was understood, false
065 * otherwise.
066 *
067 * @param arg a String to try to process as an option command
068 * @return true if successful, false otherwise
069 */
070 @Interruptible
071 @NoOptCompile
072 public static boolean process(String arg) {
073
074 // First handle the "option commands"
075 if (arg.equals("help")) {
076 printHelp();
077 return true;
078 }
079 if (arg.equals("printOptions")) {
080 printOptions();
081 return true;
082 }
083 if (arg.length() == 0) {
084 printHelp();
085 return true;
086 }
087
088 // Required format of arg is 'name=value'
089 // Split into 'name' and 'value' strings
090 int split = arg.indexOf('=');
091 if (split == -1) {
092 VM.sysWrite(" Illegal option specification!\n \""+arg+
093 "\" must be specified as a name-value pair in the form of option=value\n");
094 return false;
095 }
096 String name = arg.substring(0,split);
097 String value = arg.substring(split+1);
098
099 // Begin generated command-line processing
100 if (name.equals("measureCompilation")) {
101 if (value.equals("true")) {
102 MeasureCompilation = true;
103 return true;
104 } else if (value.equals("false")) {
105 MeasureCompilation = false;
106 return true;
107 } else
108 return false;
109 }
110 if (name.equals("measureCompilationPhases")) {
111 if (value.equals("true")) {
112 MeasureCompilationPhases = true;
113 return true;
114 } else if (value.equals("false")) {
115 MeasureCompilationPhases = false;
116 return true;
117 } else
118 return false;
119 }
120 if (name.equals("stackTraceFull")) {
121 if (value.equals("true")) {
122 stackTraceFull = true;
123 return true;
124 } else if (value.equals("false")) {
125 stackTraceFull = false;
126 return true;
127 } else
128 return false;
129 }
130 if (name.equals("stackTraceAtExit")) {
131 if (value.equals("true")) {
132 stackTraceAtExit = true;
133 return true;
134 } else if (value.equals("false")) {
135 stackTraceAtExit = false;
136 return true;
137 } else
138 return false;
139 }
140 if (name.equals("verboseTraceClassLoading")) {
141 if (value.equals("true")) {
142 TraceClassLoading = true;
143 return true;
144 } else if (value.equals("false")) {
145 TraceClassLoading = false;
146 return true;
147 } else
148 return false;
149 }
150 if (name.equals("errorsFatal")) {
151 if (value.equals("true")) {
152 ErrorsFatal = true;
153 return true;
154 } else if (value.equals("false")) {
155 ErrorsFatal = false;
156 return true;
157 } else
158 return false;
159 }
160 if (name.equals("traceJNI")) {
161 if (value.equals("true")) {
162 traceJNI = true;
163 return true;
164 } else if (value.equals("false")) {
165 traceJNI = false;
166 return true;
167 } else
168 return false;
169 }
170 if (name.equals("countThreadTransitions")) {
171 if (value.equals("true")) {
172 countThreadTransitions = true;
173 return true;
174 } else if (value.equals("false")) {
175 countThreadTransitions = false;
176 return true;
177 } else
178 return false;
179 }
180 if (name.equals("maxSystemTroubleRecursionDepth")) {
181 maxSystemTroubleRecursionDepth = CommandLineArgs.primitiveParseInt(value);
182 return true;
183 }
184 if (name.equals("interruptQuantum")) {
185 interruptQuantum = CommandLineArgs.primitiveParseInt(value);
186 return true;
187 }
188 if (name.equals("schedulingMultiplier")) {
189 schedulingMultiplier = CommandLineArgs.primitiveParseInt(value);
190 return true;
191 }
192 if (name.equals("traceThreadScheduling")) {
193 TraceThreadScheduling = CommandLineArgs.primitiveParseInt(value);
194 return true;
195 }
196 if (name.equals("verboseStackTrace")) {
197 VerboseStackTracePeriod = CommandLineArgs.primitiveParseInt(value);
198 return true;
199 }
200 if (name.equals("edgeCounterFile")) {
201 EdgeCounterFile = value;
202 return true;
203 }
204 if (name.equals("CBSCallSamplesPerTick")) {
205 CBSCallSamplesPerTick = CommandLineArgs.primitiveParseInt(value);
206 return true;
207 }
208 if (name.equals("CBSCallSampleStride")) {
209 CBSCallSampleStride = CommandLineArgs.primitiveParseInt(value);
210 return true;
211 }
212 if (name.equals("CBSMethodSamplesPerTick")) {
213 CBSMethodSamplesPerTick = CommandLineArgs.primitiveParseInt(value);
214 return true;
215 }
216 if (name.equals("CBSMethodSampleStride")) {
217 CBSMethodSampleStride = CommandLineArgs.primitiveParseInt(value);
218 return true;
219 }
220 if (name.equals("tfTraceFile")) {
221 TuningForkTraceFile = value;
222 return true;
223 }
224 if (name.equals("forceOneCPU")) {
225 forceOneCPU = CommandLineArgs.primitiveParseInt(value);
226 return true;
227 }
228 //End generated command-line processing
229
230 // None of the above tests matched, so this wasn't an option
231 return false;
232 }
233
234 // Print a short description of every option
235 @Interruptible
236 public static void printHelp() {
237
238 VM.sysWrite("Commands\n");
239 VM.sysWrite("-X:vm[:help]\t\t\tPrint brief description of the core VM's command-line arguments\n");
240 VM.sysWrite("-X:vm:printOptions\t\tPrint the current values of the core VM's options\n");
241 VM.sysWrite("\n");
242
243 //Begin generated help messages
244 VM.sysWrite("Boolean Options (-X:vm:<option>=true or -X:vm:<option>=false)\n");
245 VM.sysWrite("Option Description\n");
246 VM.sysWrite("measureCompilation Time all compilations and report on exit\n");
247 VM.sysWrite("measureCompilationPhases Time all compilation sub-phases and report on exit\n");
248 VM.sysWrite("stackTraceFull Stack traces to consist of VM and application frames\n");
249 VM.sysWrite("stackTraceAtExit Dump a stack trace (via VM.syswrite) upon exit\n");
250 VM.sysWrite("verboseTraceClassLoading More detailed tracing then -verbose:class\n");
251 VM.sysWrite("errorsFatal Exit when non-fatal errors are detected; used for regression testing\n");
252 VM.sysWrite("traceJNI Trace when calls into JNI happen\n");
253 VM.sysWrite("countThreadTransitions Count, and report, the number of thread state transitions. This works better on IA32 than on PPC at the moment.\n");
254 VM.sysWrite("\nValue Options (-X:vm:<option>=<value>)\n");
255 VM.sysWrite("Option Type Description\n");
256 VM.sysWrite("maxSystemTroubleRecursionDepth int If we get deeper than this in one of the System Trouble functions, try to die.\n");
257 VM.sysWrite("interruptQuantum int Timer interrupt scheduling quantum in ms\n");
258 VM.sysWrite("schedulingMultiplier int Scheduling quantum = interruptQuantum * schedulingMultiplier\n");
259 VM.sysWrite("traceThreadScheduling int Trace actions taken by thread scheduling\n");
260 VM.sysWrite("verboseStackTrace int Trace every nth time a stack trace is created\n");
261 VM.sysWrite("edgeCounterFile String Input file of edge counter profile data\n");
262 VM.sysWrite("CBSCallSamplesPerTick int How many CBS call samples (Prologue/Epilogue) should we take per time tick\n");
263 VM.sysWrite("CBSCallSampleStride int Stride between each CBS call sample (Prologue/Epilogue) within a sampling window\n");
264 VM.sysWrite("CBSMethodSamplesPerTick int How many CBS method samples (any yieldpoint) should we take per time tick\n");
265 VM.sysWrite("CBSMethodSampleStride int Stride between each CBS method sample (any yieldpoint) within a sampling window\n");
266 VM.sysWrite("tfTraceFile String Filename to use for TuningFork trace generation\n");
267 VM.sysWrite("forceOneCPU int Force all threads to run on one CPU. The argument specifies which CPU (starting from 0).\n");
268 VM.sysWrite("\nSelection Options (set option to one of an enumeration of possible values)\n");
269
270 VM.sysExit(VM.EXIT_STATUS_PRINTED_HELP_MESSAGE);
271 }
272
273 // print the options values
274 @Interruptible
275 public static void printOptions() {
276 VM.sysWrite("Current value of VM options:\n");
277 //Begin generated option value printing
278 VM.sysWriteln("\tmeasureCompilation = ",MeasureCompilation);
279 VM.sysWriteln("\tmeasureCompilationPhases = ",MeasureCompilationPhases);
280 VM.sysWriteln("\tstackTraceFull = ",stackTraceFull);
281 VM.sysWriteln("\tstackTraceAtExit = ",stackTraceAtExit);
282 VM.sysWriteln("\tverboseTraceClassLoading = ",TraceClassLoading);
283 VM.sysWriteln("\terrorsFatal = ",ErrorsFatal);
284 VM.sysWriteln("\ttraceJNI = ",traceJNI);
285 VM.sysWriteln("\tcountThreadTransitions = ",countThreadTransitions);
286 VM.sysWriteln("\tmaxSystemTroubleRecursionDepth = ",maxSystemTroubleRecursionDepth);
287 VM.sysWriteln("\tinterruptQuantum = ",interruptQuantum);
288 VM.sysWriteln("\tschedulingMultiplier = ",schedulingMultiplier);
289 VM.sysWriteln("\ttraceThreadScheduling = ",TraceThreadScheduling);
290 VM.sysWriteln("\tverboseStackTrace = ",VerboseStackTracePeriod);
291 VM.sysWriteln("\tedgeCounterFile = ",EdgeCounterFile);
292 VM.sysWriteln("\tCBSCallSamplesPerTick = ",CBSCallSamplesPerTick);
293 VM.sysWriteln("\tCBSCallSampleStride = ",CBSCallSampleStride);
294 VM.sysWriteln("\tCBSMethodSamplesPerTick = ",CBSMethodSamplesPerTick);
295 VM.sysWriteln("\tCBSMethodSampleStride = ",CBSMethodSampleStride);
296 VM.sysWriteln("\ttfTraceFile = ",TuningForkTraceFile);
297 VM.sysWriteln("\tforceOneCPU = ",forceOneCPU);
298 //End generated option value printing
299 }
300 }