* src/vm/jit/alpha/patcher.c (patcher_wrapper): Added return address
[cacao.git] / src / vm / vm.c
index 02adac86a4e873f9fe335327568e164e2cea2e27..b2a8f9f58294ac770f3250939bb4538f9d08cd8c 100644 (file)
@@ -49,6 +49,7 @@
 # include "threads/native/threads.h"
 #endif
 
+#include "toolbox/util.h"
 #include "vm/classcache.h"
 #include "vm/exceptions.h"
 #include "vm/finalizer.h"
@@ -62,6 +63,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 +73,7 @@
 #include "native/jvmti/cacaodbg.h"
 #endif
 
+
 /* Invocation API variables ***************************************************/
 
 _Jv_JavaVM *_Jv_jvm;                    /* denotes a Java VM                  */
@@ -124,6 +129,9 @@ enum {
        OPT_HELP,
        OPT_X,
 
+       OPT_ESA,
+       OPT_DSA,
+
        /* Java non-standard options */
 
        OPT_JIT,
@@ -232,6 +240,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 },
@@ -347,7 +360,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,7 +373,7 @@ 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");
@@ -384,14 +402,17 @@ void usage(void)
        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");
+       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)");
@@ -486,7 +507,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");
@@ -558,6 +579,10 @@ bool vm_create(JavaVMInitArgs *vm_args)
        if (vms > 0)
                return false;
 
+       /* set the VM starttime */
+
+       _Jv_jvm->starttime = util_current_time_millis();
+
        /* get stuff from the environment *****************************************/
 
 #if defined(DISABLE_GC)
@@ -573,15 +598,15 @@ bool vm_create(JavaVMInitArgs *vm_args)
                strcpy(bootclasspath, cp);
 
        } else {
-               cplen = strlen(CACAO_VM_ZIP_PATH) +
+               cplen = 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);
+               strcat(bootclasspath, CACAO_VM_ZIP);
                strcat(bootclasspath, ":");
-               strcat(bootclasspath, CLASSPATH_GLIBJ_ZIP_PATH);
+               strcat(bootclasspath, CLASSPATH_GLIBJ_ZIP);
        }
 
        /* set the classpath */
@@ -665,7 +690,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 +698,7 @@ bool vm_create(JavaVMInitArgs *vm_args)
 
                        properties_add(opt_arg, "");
 
-               didit:
+               opt_d_done:
                        break;
 
                case OPT_BOOTCLASSPATH:
@@ -722,14 +747,14 @@ bool vm_create(JavaVMInitArgs *vm_args)
 
                        MFREE(bootclasspath, char, strlen(bootclasspath));
 
-                       cplen = strlen(CACAO_VM_ZIP_PATH) +
+                       cplen = strlen(CACAO_VM_ZIP) +
                                strlen(":") +
                                strlen(opt_arg) +
                                strlen("0");
 
                        bootclasspath = MNEW(char, cplen);
 
-                       strcpy(bootclasspath, CACAO_VM_ZIP_PATH);
+                       strcpy(bootclasspath, CACAO_VM_ZIP);
                        strcat(bootclasspath, ":");
                        strcat(bootclasspath, opt_arg);
                        break;
@@ -901,32 +926,42 @@ bool vm_create(JavaVMInitArgs *vm_args)
                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();
                                }
@@ -987,6 +1022,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 */
 
@@ -1237,16 +1280,30 @@ bool vm_create(JavaVMInitArgs *vm_args)
                throw_main_exception_exit();
 #endif
 
+       /* initialize recompilation */
+
+       if (!recompile_init())
+               throw_main_exception_exit();
+               
 #if defined(ENABLE_THREADS)
        /* 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)