* src/vm/jit/allocator/simplereg.c (new_allocate_scratch_registers):
[cacao.git] / src / vm / vm.c
index ed3c16cddd8a424ed2b46403fdb0a05645bf892f..f52cea54fa7fa18ef672731354ee0d143fdf0c5f 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,
@@ -133,6 +141,8 @@ enum {
        OPT_BOOTCLASSPATH_A,
        OPT_BOOTCLASSPATH_P,
 
+       OPT_GLIBJ,
+
        OPT_PROF,
        OPT_PROF_OPTION,
 
@@ -230,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 },
@@ -287,11 +302,14 @@ opt_struct opts[] = {
        { "Xbootclasspath:",   true,  OPT_BOOTCLASSPATH },
        { "Xbootclasspath/a:", true,  OPT_BOOTCLASSPATH_A },
        { "Xbootclasspath/p:", true,  OPT_BOOTCLASSPATH_P },
+       { "Xglibj:",           true,  OPT_GLIBJ },
+
 #ifdef ENABLE_JVMTI
        { "Xdebug",            false, OPT_DEBUG },
        { "Xnoagent",          false, OPT_NOAGENT },
        { "Xrunjdwp",          true,  OPT_XRUNJDWP },
 #endif 
+
        { "Xms",               true,  OPT_MS },
        { "ms",                true,  OPT_MS },
        { "Xmx",               true,  OPT_MX },
@@ -342,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");
@@ -350,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");
@@ -379,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)");
@@ -421,6 +447,9 @@ static void Xusage(void)
        puts("                             value is appended to the bootstrap class path");
        puts("    -Xbootclasspath/p:<zip/jar files and directories separated by :>");
        puts("                             value is prepended to the bootstrap class path");
+       puts("    -Xglibj:<zip/jar files and directories separated by :>");
+       puts("                             value is used as Java core library, but the");
+       puts("                             hardcoded VM interface classes are prepended");
        printf("    -Xms<size>               set the initial size of the heap (default: %dMB)\n", HEAP_STARTSIZE / 1024 / 1024);
        printf("    -Xmx<size>               set the maximum size of the heap (default: %dMB)\n", HEAP_MAXSIZE / 1024 / 1024);
        printf("    -Xss<size>               set the thread stack size (default: %dkB)\n", STACK_SIZE / 1024);
@@ -445,7 +474,7 @@ static void Xusage(void)
 
 *******************************************************************************/
 
-static void version(void)
+static void version(bool opt_exit)
 {
        puts("java version \""JAVA_VERSION"\"");
        puts("CACAO version "VERSION"");
@@ -478,7 +507,7 @@ static void version(void)
        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");
@@ -486,6 +515,11 @@ static void version(void)
        printf("  initial heap size   : %d\n", opt_heapstartsize);
        printf("  stack size          : %d\n", opt_stacksize);
        printf("  java.boot.class.path: %s\n", bootclasspath);
+
+       /* exit normally, if requested */
+
+       if (opt_exit)
+               exit(0);
 }
 
 
@@ -518,7 +552,8 @@ bool vm_create(JavaVMInitArgs *vm_args)
        s4    cplen;
        s4    opt;
        s4    i, j, k;
-
+       bool  opt_version;
+       bool  opt_exit;
 
 #if defined(ENABLE_JVMTI)
        lt_dlhandle  handle;
@@ -526,8 +561,6 @@ bool vm_create(JavaVMInitArgs *vm_args)
        bool jdwp,agentbypath;
        jdwp = agentbypath = false;
 #endif
-       
-
 
        /* check the JNI version requested */
 
@@ -546,6 +579,9 @@ 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 *****************************************/
 
@@ -553,7 +589,6 @@ bool vm_create(JavaVMInitArgs *vm_args)
        nogc_init(HEAP_MAXSIZE, HEAP_STARTSIZE);
 #endif
 
-
        /* set the bootclasspath */
 
        cp = getenv("BOOTCLASSPATH");
@@ -563,18 +598,17 @@ 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 */
 
        cp = getenv("CLASSPATH");
@@ -590,9 +624,12 @@ bool vm_create(JavaVMInitArgs *vm_args)
 
 
        /* interpret the options **************************************************/
-   
-       checknull  = false;
-       opt_noieee = false;
+
+       opt_version       = false;
+       opt_exit          = false;
+
+       checknull         = false;
+       opt_noieee        = false;
 
        opt_heapmaxsize   = HEAP_MAXSIZE;
        opt_heapstartsize = HEAP_STARTSIZE;
@@ -653,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;
                                }
                        }
 
@@ -661,12 +698,13 @@ bool vm_create(JavaVMInitArgs *vm_args)
 
                        properties_add(opt_arg, "");
 
-               didit:
+               opt_d_done:
                        break;
 
                case OPT_BOOTCLASSPATH:
                        /* Forget default bootclasspath and set the argument as
                           new boot classpath. */
+
                        MFREE(bootclasspath, char, strlen(bootclasspath));
 
                        bootclasspath = MNEW(char, strlen(opt_arg) + strlen("0"));
@@ -675,6 +713,7 @@ bool vm_create(JavaVMInitArgs *vm_args)
 
                case OPT_BOOTCLASSPATH_A:
                        /* append to end of bootclasspath */
+
                        cplen = strlen(bootclasspath);
 
                        bootclasspath = MREALLOC(bootclasspath,
@@ -689,6 +728,7 @@ bool vm_create(JavaVMInitArgs *vm_args)
 
                case OPT_BOOTCLASSPATH_P:
                        /* prepend in front of bootclasspath */
+
                        cp = bootclasspath;
                        cplen = strlen(cp);
 
@@ -702,6 +742,23 @@ bool vm_create(JavaVMInitArgs *vm_args)
                        MFREE(cp, char, cplen);
                        break;
 
+               case OPT_GLIBJ:
+                       /* use as Java core library, but prepend VM interface classes */
+
+                       MFREE(bootclasspath, char, strlen(bootclasspath));
+
+                       cplen = strlen(CACAO_VM_ZIP) +
+                               strlen(":") +
+                               strlen(opt_arg) +
+                               strlen("0");
+
+                       bootclasspath = MNEW(char, cplen);
+
+                       strcpy(bootclasspath, CACAO_VM_ZIP);
+                       strcat(bootclasspath, ":");
+                       strcat(bootclasspath, opt_arg);
+                       break;
+
 #if defined(ENABLE_JVMTI)
                case OPT_DEBUG:
                        /* this option exists only for compatibility reasons */
@@ -785,8 +842,8 @@ bool vm_create(JavaVMInitArgs *vm_args)
 #endif
                                
                case OPT_VERSION:
-                       version();
-                       exit(0);
+                       opt_version = true;
+                       opt_exit    = true;
                        break;
 
                case OPT_FULLVERSION:
@@ -794,7 +851,7 @@ bool vm_create(JavaVMInitArgs *vm_args)
                        break;
 
                case OPT_SHOWVERSION:
-                       version();
+                       opt_version = true;
                        break;
 
                case OPT_NOIEEE:
@@ -869,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();
                                }
@@ -955,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 */
 
@@ -1030,6 +1105,13 @@ bool vm_create(JavaVMInitArgs *vm_args)
        }
 
 
+       /* Now we have all options handled and we can print the version
+          information. */
+
+       if (opt_version)
+               version(opt_exit);
+
+
        /* get the main class *****************************************************/
 
        if (opt_index < vm_args->nOptions) {
@@ -1199,15 +1281,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)