* src/vm/jit/stack.c (new_stack_analyse): Add a third move at the
[cacao.git] / src / vm / vm.c
index 02adac86a4e873f9fe335327568e164e2cea2e27..3b98ce35386a81e5c41da48ff28b1dfc9034458f 100644 (file)
@@ -62,6 +62,9 @@
 #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"
 
@@ -69,6 +72,7 @@
 #include "native/jvmti/cacaodbg.h"
 #endif
 
+
 /* Invocation API variables ***************************************************/
 
 _Jv_JavaVM *_Jv_jvm;                    /* denotes a Java VM                  */
@@ -105,6 +109,8 @@ bool startit = true;
 /* define command line options ************************************************/
 
 enum {
+       OPT_FOO,
+
        /* Java options */
 
        OPT_JAR,
@@ -124,6 +130,9 @@ enum {
        OPT_HELP,
        OPT_X,
 
+       OPT_ESA,
+       OPT_DSA,
+
        /* Java non-standard options */
 
        OPT_JIT,
@@ -155,10 +164,14 @@ enum {
        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,
@@ -178,7 +191,7 @@ enum {
        OPT_IFCONV,
 #endif
 
-#if defined(ENABLE_LSRA)
+#if defined(ENABLE_LSRA) || defined(ENABLE_SSA)
        OPT_LSRA,
 #endif
 
@@ -211,6 +224,8 @@ enum {
 
 
 opt_struct opts[] = {
+       { "foo",               false, OPT_FOO },
+
        /* Java options */
 
        { "jar",               false, OPT_JAR },
@@ -232,6 +247,11 @@ opt_struct opts[] = {
        { "?",                 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 },
@@ -254,15 +274,19 @@ opt_struct opts[] = {
        { "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
 
@@ -311,8 +335,13 @@ opt_struct opts[] = {
 #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 }
 };
@@ -347,7 +376,12 @@ void usage(void)
        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");
@@ -355,10 +389,11 @@ void usage(void)
        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
@@ -381,17 +416,23 @@ void usage(void)
 #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)");
@@ -405,6 +446,9 @@ void usage(void)
 #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 */
 
@@ -486,7 +530,7 @@ static void version(bool opt_exit)
        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");
@@ -528,7 +572,7 @@ static void fullversion(void)
 bool vm_create(JavaVMInitArgs *vm_args)
 {
        char *cp;
-       s4    cplen;
+       s4    len;
        s4    opt;
        s4    i, j, k;
        bool  opt_version;
@@ -558,6 +602,10 @@ bool vm_create(JavaVMInitArgs *vm_args)
        if (vms > 0)
                return false;
 
+       /* set the VM starttime */
+
+       _Jv_jvm->starttime = builtin_currenttimemillis();
+
        /* get stuff from the environment *****************************************/
 
 #if defined(DISABLE_GC)
@@ -573,15 +621,15 @@ bool vm_create(JavaVMInitArgs *vm_args)
                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 */
@@ -631,6 +679,10 @@ bool vm_create(JavaVMInitArgs *vm_args)
 
        while ((opt = options_get(opts, vm_args)) != OPT_DONE) {
                switch (opt) {
+               case OPT_FOO:
+                       opt_foo = true;
+                       break;
+
                case OPT_IGNORE:
                        break;
                        
@@ -665,7 +717,7 @@ bool vm_create(JavaVMInitArgs *vm_args)
                                if (opt_arg[j] == '=') {
                                        opt_arg[j] = '\0';
                                        properties_add(opt_arg, opt_arg + j + 1);
-                                       goto didit;
+                                       goto opt_d_done;
                                }
                        }
 
@@ -673,7 +725,7 @@ bool vm_create(JavaVMInitArgs *vm_args)
 
                        properties_add(opt_arg, "");
 
-               didit:
+               opt_d_done:
                        break;
 
                case OPT_BOOTCLASSPATH:
@@ -689,12 +741,12 @@ bool vm_create(JavaVMInitArgs *vm_args)
                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, ":");
@@ -705,16 +757,16 @@ bool vm_create(JavaVMInitArgs *vm_args)
                        /* 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:
@@ -722,14 +774,14 @@ bool vm_create(JavaVMInitArgs *vm_args)
 
                        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;
@@ -738,21 +790,35 @@ bool vm_create(JavaVMInitArgs *vm_args)
                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
@@ -809,6 +875,9 @@ bool vm_create(JavaVMInitArgs *vm_args)
                        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:
@@ -882,51 +951,63 @@ bool vm_create(JavaVMInitArgs *vm_args)
                        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();
                                }
@@ -973,7 +1054,7 @@ bool vm_create(JavaVMInitArgs *vm_args)
                        break;
 #endif
 
-#if defined(ENABLE_LSRA)
+#if defined(ENABLE_LSRA) || defined(ENABLE_SSA)
                case OPT_LSRA:
                        opt_lsra = true;
                        break;
@@ -987,6 +1068,14 @@ bool vm_create(JavaVMInitArgs *vm_args)
                        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 */
 
@@ -1100,7 +1189,10 @@ bool vm_create(JavaVMInitArgs *vm_args)
        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);
        }
 
@@ -1238,15 +1330,29 @@ bool vm_create(JavaVMInitArgs *vm_args)
 #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)