#include "vm/vm.h"
#include "vm/jit/jit.h"
#include "vm/jit/asmpart.h"
+
+#include "vm/jit/recompile.h"
+
#include "vm/jit/profile/profile.h"
#include "vm/rt-timing.h"
#include "native/jvmti/cacaodbg.h"
#endif
+
/* Invocation API variables ***************************************************/
_Jv_JavaVM *_Jv_jvm; /* denotes a Java VM */
/* define command line options ************************************************/
enum {
+ OPT_FOO,
+
/* Java options */
OPT_JAR,
OPT_HELP,
OPT_X,
+ OPT_ESA,
+ OPT_DSA,
+
/* Java non-standard options */
OPT_JIT,
OPT_LOG,
OPT_CHECK,
OPT_LOAD,
- OPT_METHOD,
- OPT_SIGNATURE,
OPT_SHOW,
+ OPT_DEBUGCOLOR,
+
+#if !defined(NDEBUG)
OPT_ALL,
+ OPT_METHOD,
+ OPT_SIGNATURE,
+#endif
#if defined(ENABLE_VERIFIER)
OPT_NOVERIFY,
OPT_IFCONV,
#endif
-#if defined(ENABLE_LSRA)
+#if defined(ENABLE_LSRA) || defined(ENABLE_SSA)
OPT_LSRA,
#endif
opt_struct opts[] = {
+ { "foo", false, OPT_FOO },
+
/* Java options */
{ "jar", false, OPT_JAR },
{ "?", false, OPT_HELP },
{ "X", false, OPT_X },
+ { "esa", false, OPT_ESA },
+ { "enablesystemassertions", false, OPT_ESA },
+ { "dsa", false, OPT_DSA },
+ { "disablesystemassertions", false, OPT_DSA },
+
{ "noasyncgc", false, OPT_IGNORE },
#if defined(ENABLE_VERIFIER)
{ "noverify", false, OPT_NOVERIFY },
{ "c", true, OPT_CHECK },
{ "l", false, OPT_LOAD },
{ "eager", false, OPT_EAGER },
- { "sig", true, OPT_SIGNATURE },
+
+#if !defined(NDEBUG)
{ "all", false, OPT_ALL },
+ { "sig", true, OPT_SIGNATURE },
+#endif
+
#if defined(ENABLE_LOOP)
{ "oloop", false, OPT_OLOOP },
#endif
#if defined(ENABLE_IFCONV)
{ "ifconv", false, OPT_IFCONV },
#endif
-#if defined(ENABLE_LSRA)
+#if defined(ENABLE_LSRA) || defined(ENABLE_SSA)
{ "lsra", false, OPT_LSRA },
#endif
#if defined(ENABLE_INLINING)
{ "i", true, OPT_INLINING },
#endif
+
+#if !defined(NDEBUG)
{ "m", true, OPT_METHOD },
+#endif
+
{ "s", true, OPT_SHOW },
+ { "debug-color", false, OPT_DEBUGCOLOR },
{ NULL, false, 0 }
};
puts(" -fullversion print jpackage-compatible product version and exit");
puts(" -showversion print product version and continue");
puts(" -help, -? print this help message");
- puts(" -X print help on non-standard Java options\n");
+ puts(" -X print help on non-standard Java options");
+ puts(" -esa | -enablesystemassertions");
+ puts(" enable system assertions");
+ puts(" -dsa | -disablesystemassertions");
+ puts(" disable system assertions");
+ puts("");
#ifdef ENABLE_JVMTI
puts(" -agentlib:<agent-lib-name>=<options> library to load containg JVMTI agent");
puts(" -agentpath:<path-to-agent>=<options> path to library containg JVMTI agent");
#endif
- puts("CACAO options:\n");
+ puts("CACAO options:");
puts(" -v write state-information");
puts(" -verbose[:call|exception|jit]");
puts(" enable specific verbose output");
+ puts(" -debug-color colored output for ANSI terms");
#ifdef TYPECHECK_VERBOSE
puts(" -verbosetc write debug messages while typechecking");
#endif
#endif
puts(" -l don't start the class after loading");
puts(" -eager perform eager class loading and linking");
+#if !defined(NDEBUG)
puts(" -all compile all methods, no execution");
puts(" -m compile only a specific method");
puts(" -sig specify signature for a specific method");
- puts(" -s(how)a(ssembler) show disassembled listing");
- puts(" c(onstants) show the constant pool");
- puts(" d(atasegment) show data segment listing");
- puts(" e(xceptionstubs) show disassembled exception stubs (only with -sa)");
- puts(" i(ntermediate) show intermediate representation");
- puts(" m(ethods) show class fields and methods");
- puts(" n(ative) show disassembled native stubs");
- puts(" u(tf) show the utf - hash");
+#endif
+
+ puts(" -s(how)... show...");
+ puts(" c(onstants) the constant pool");
+ puts(" m(ethods) class fields and methods");
+ puts(" u(tf) the utf - hash");
+ puts(" i(ntermediate) intermediate representation");
+#if defined(ENABLE_DISASSEMBLER)
+ puts(" a(ssembler) disassembled listing");
+ puts(" e(xceptionstubs) disassembled exception stubs (only with -sa)");
+ puts(" n(ative) disassembled native stubs");
+#endif
+ puts(" d(atasegment) data segment listing");
#if defined(ENABLE_INLINING)
puts(" -i n(line) activate inlining");
puts(" v(irtual) inline virtual methods (uses/turns rt option on)");
#if defined(ENABLE_LSRA)
puts(" -lsra use linear scan register allocation");
#endif
+#if defined(ENABLE_SSA)
+ puts(" -lsra use linear scan register allocation (with SSA)");
+#endif
/* exit with error code */
printf(" maximum heap size : %d\n", HEAP_MAXSIZE);
printf(" initial heap size : %d\n", HEAP_STARTSIZE);
printf(" stack size : %d\n", STACK_SIZE);
- puts(" java.boot.class.path: "CACAO_VM_ZIP_PATH":"CLASSPATH_GLIBJ_ZIP_PATH"");
+ puts(" java.boot.class.path: "CACAO_VM_ZIP":"CLASSPATH_GLIBJ_ZIP"");
puts(" java.library.path : "CLASSPATH_LIBRARY_PATH"\n");
puts("Runtime variables:\n");
bool vm_create(JavaVMInitArgs *vm_args)
{
char *cp;
- s4 cplen;
+ s4 len;
s4 opt;
s4 i, j, k;
bool opt_version;
if (vms > 0)
return false;
+ /* set the VM starttime */
+
+ _Jv_jvm->starttime = builtin_currenttimemillis();
+
/* get stuff from the environment *****************************************/
#if defined(DISABLE_GC)
strcpy(bootclasspath, cp);
} else {
- cplen = strlen(CACAO_VM_ZIP_PATH) +
+ len = strlen(CACAO_VM_ZIP) +
strlen(":") +
- strlen(CLASSPATH_GLIBJ_ZIP_PATH) +
+ strlen(CLASSPATH_GLIBJ_ZIP) +
strlen("0");
- bootclasspath = MNEW(char, cplen);
- strcat(bootclasspath, CACAO_VM_ZIP_PATH);
+ bootclasspath = MNEW(char, len);
+ strcat(bootclasspath, CACAO_VM_ZIP);
strcat(bootclasspath, ":");
- strcat(bootclasspath, CLASSPATH_GLIBJ_ZIP_PATH);
+ strcat(bootclasspath, CLASSPATH_GLIBJ_ZIP);
}
/* set the classpath */
while ((opt = options_get(opts, vm_args)) != OPT_DONE) {
switch (opt) {
+ case OPT_FOO:
+ opt_foo = true;
+ break;
+
case OPT_IGNORE:
break;
if (opt_arg[j] == '=') {
opt_arg[j] = '\0';
properties_add(opt_arg, opt_arg + j + 1);
- goto didit;
+ goto opt_d_done;
}
}
properties_add(opt_arg, "");
- didit:
+ opt_d_done:
break;
case OPT_BOOTCLASSPATH:
case OPT_BOOTCLASSPATH_A:
/* append to end of bootclasspath */
- cplen = strlen(bootclasspath);
+ len = strlen(bootclasspath);
bootclasspath = MREALLOC(bootclasspath,
char,
- cplen,
- cplen + strlen(":") +
+ len,
+ len + strlen(":") +
strlen(opt_arg) + strlen("0"));
strcat(bootclasspath, ":");
/* prepend in front of bootclasspath */
cp = bootclasspath;
- cplen = strlen(cp);
+ len = strlen(cp);
bootclasspath = MNEW(char, strlen(opt_arg) + strlen(":") +
- cplen + strlen("0"));
+ len + strlen("0"));
strcpy(bootclasspath, opt_arg);
strcat(bootclasspath, ":");
strcat(bootclasspath, cp);
- MFREE(cp, char, cplen);
+ MFREE(cp, char, len);
break;
case OPT_GLIBJ:
MFREE(bootclasspath, char, strlen(bootclasspath));
- cplen = strlen(CACAO_VM_ZIP_PATH) +
+ len = strlen(CACAO_VM_ZIP) +
strlen(":") +
strlen(opt_arg) +
strlen("0");
- bootclasspath = MNEW(char, cplen);
+ bootclasspath = MNEW(char, len);
- strcpy(bootclasspath, CACAO_VM_ZIP_PATH);
+ strcpy(bootclasspath, CACAO_VM_ZIP);
strcat(bootclasspath, ":");
strcat(bootclasspath, opt_arg);
break;
case OPT_DEBUG:
/* this option exists only for compatibility reasons */
break;
+
case OPT_NOAGENT:
/* I don't know yet what Xnoagent should do. This is only for
compatiblity with eclipse - motse */
break;
+
case OPT_XRUNJDWP:
- agentbypath=jvmti=jdwp=true;
- i = strlen(opt_arg)+33;
- agentarg = MNEW(char,i);
- /* XXX how can I get the <prefix>/lib directory ? */
- snprintf(agentarg,i,"/usr/local/cacao/lib/libjdwp.so=%s",&opt_arg[1]);
+ agentbypath = true;
+ jvmti = true;
+ jdwp = true;
+
+ len =
+ strlen(CACAO_LIBDIR) +
+ strlen("/libjdwp.so=") +
+ strlen(opt_arg) +
+ strlen("0");
+
+ agentarg = MNEW(char, len);
+
+ strcpy(agentarg, CACAO_LIBDIR);
+ strcat(agentarg, "/libjdwp.so=");
+ strcat(agentarg, &opt_arg[1]);
break;
+
case OPT_AGENTPATH:
agentbypath = true;
+
case OPT_AGENTLIB:
- jvmti=true;
+ jvmti = true;
agentarg = opt_arg;
break;
#endif
else if (strcmp("exception", opt_arg) == 0)
opt_verboseexception = true;
break;
+ case OPT_DEBUGCOLOR:
+ opt_debugcolor = true;
+ break;
#if defined(ENABLE_VERIFIER) && defined(TYPECHECK_VERBOSE)
case OPT_VERBOSETC:
opt_eager = true;
break;
+#if !defined(NDEBUG)
+ case OPT_ALL:
+ compileall = true;
+ opt_run = false;
+ makeinitializations = false;
+ break;
+
case OPT_METHOD:
opt_run = false;
opt_method = opt_arg;
makeinitializations = false;
break;
-
+
case OPT_SIGNATURE:
opt_signature = opt_arg;
break;
-
- case OPT_ALL:
- compileall = true;
- opt_run = false;
- makeinitializations = false;
- break;
-
+#endif
+
case OPT_SHOW: /* Display options */
for (j = 0; j < strlen(opt_arg); j++) {
switch (opt_arg[j]) {
- case 'a':
- opt_showdisassemble = true;
- compileverbose = true;
- break;
case 'c':
showconstantpool = true;
break;
- case 'd':
- opt_showddatasegment = true;
+
+ case 'u':
+ showutf = true;
break;
- case 'e':
- opt_showexceptionstubs = true;
+
+ case 'm':
+ showmethods = true;
break;
+
case 'i':
opt_showintermediate = true;
compileverbose = true;
break;
- case 'm':
- showmethods = true;
+
+#if defined(ENABLE_DISASSEMBLER)
+ case 'a':
+ opt_showdisassemble = true;
+ compileverbose = true;
break;
+
+ case 'e':
+ opt_showexceptionstubs = true;
+ break;
+
case 'n':
opt_shownativestub = true;
break;
- case 'u':
- showutf = true;
+#endif
+
+ case 'd':
+ opt_showddatasegment = true;
break;
+
default:
usage();
}
break;
#endif
-#if defined(ENABLE_LSRA)
+#if defined(ENABLE_LSRA) || defined(ENABLE_SSA)
case OPT_LSRA:
opt_lsra = true;
break;
Xusage();
break;
+ case OPT_ESA:
+ _Jv_jvm->Java_java_lang_VMClassLoader_defaultAssertionStatus = true;
+ break;
+
+ case OPT_DSA:
+ _Jv_jvm->Java_java_lang_VMClassLoader_defaultAssertionStatus = false;
+ break;
+
case OPT_PROF_OPTION:
/* use <= to get the last \0 too */
if (jvmti) {
jvmti_set_phase(JVMTI_PHASE_ONLOAD);
jvmti_agentload(agentarg, agentbypath, &handle, &libname);
- if (jdwp) MFREE(agentarg,char,strlen(agentarg));
+
+ if (jdwp)
+ MFREE(agentarg, char, strlen(agentarg));
+
jvmti_set_phase(JVMTI_PHASE_PRIMORDIAL);
}
#endif
#if defined(ENABLE_THREADS)
+ /* initialize recompilation */
+
+ if (!recompile_init())
+ throw_main_exception_exit();
+
/* finally, start the finalizer thread */
if (!finalizer_start_thread())
throw_main_exception_exit();
+ /* start the recompilation thread (must be done before the
+ profiling thread) */
+
+ if (!recompile_start_thread())
+ throw_main_exception_exit();
+
+# if defined(ENABLE_PROFILING)
/* start the profile sampling thread */
-/* if (!profile_start_thread()) */
-/* throw_main_exception_exit(); */
+ if (opt_prof)
+ if (!profile_start_thread())
+ throw_main_exception_exit();
+# endif
#endif
#if defined(ENABLE_JVMTI)