/* src/vm/vm.cpp - VM startup and shutdown functions
- Copyright (C) 1996-2005, 2006, 2007, 2008
+ Copyright (C) 1996-2005, 2006, 2007, 2008, 2009, 2010
CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
This file is part of CACAO.
#include "vm/jit/abi-asm.h"
#include "mm/codememory.h"
+#include "mm/dumpmemory.hpp"
#include "mm/gc.hpp"
-#include "mm/memory.h"
+#include "mm/memory.hpp"
-#include "native/jni.h"
+#include "native/jni.hpp"
#include "native/llni.h"
-#include "native/localref.h"
-#include "native/native.h"
+#include "native/localref.hpp"
+#include "native/native.hpp"
-#include "native/include/java_lang_Object.h" /* required by j.l.C */
-#include "native/include/java_lang_String.h" /* required by j.l.C */
+#include "native/vm/nativevm.hpp"
-#if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
-# include "native/include/java_nio_ByteBuffer.h" /* required by j.l.CL */
-# include "native/include/java_lang_ClassLoader.h" /* required by j.l.C */
-#endif
-
-#include "native/include/java_lang_Class.h"
-
-#include "native/vm/nativevm.h"
+#include "threads/lock.hpp"
+#include "threads/thread.hpp"
-#include "threads/lock-common.h"
-#include "threads/threadlist.h"
-#include "threads/thread.h"
+#include "toolbox/logging.hpp"
-#include "toolbox/logging.h"
-
-#include "vm/array.h"
+#include "vm/array.hpp"
#if defined(ENABLE_ASSERTION)
-#include "vm/assertion.h"
+#include "vm/assertion.hpp"
#endif
-#include "vm/builtin.h"
-#include "vm/exceptions.h"
-#include "vm/finalizer.h"
+#include "vm/jit/builtin.hpp"
+#include "vm/classcache.hpp"
+#include "vm/exceptions.hpp"
+#include "vm/finalizer.hpp"
#include "vm/global.h"
-#include "vm/initialize.h"
-#include "vm/package.hpp"
+#include "vm/globals.hpp"
+#include "vm/hook.hpp"
+#include "vm/initialize.hpp"
+#include "vm/options.h"
+#include "vm/os.hpp"
#include "vm/primitive.hpp"
-#include "vm/properties.h"
-#include "vm/signallocal.h"
-#include "vm/stringlocal.h"
+#include "vm/properties.hpp"
+#include "vm/signallocal.hpp"
+#include "vm/statistics.h"
+#include "vm/string.hpp"
+#include "vm/suck.hpp"
#include "vm/vm.hpp"
-#include "vm/jit/argument.h"
+#include "vm/jit/argument.hpp"
#include "vm/jit/asmpart.h"
-#include "vm/jit/code.h"
+#include "vm/jit/code.hpp"
#if defined(ENABLE_DISASSEMBLER)
# include "vm/jit/disass.h"
#endif
-#include "vm/jit/jit.h"
+#include "vm/jit/jit.hpp"
#include "vm/jit/methodtree.h"
-#if defined(ENABLE_PROFILING)
-# include "vm/jit/optimizing/profile.h"
-#endif
-
-#include "vm/jit/optimizing/recompile.h"
+#include "vm/jit/optimizing/profile.hpp"
+#include "vm/jit/optimizing/recompiler.hpp"
#if defined(ENABLE_PYTHON)
# include "vm/jit/python.h"
#endif
-#include "vm/jit/trap.h"
-
-#include "vmcore/classcache.h"
-#include "vmcore/options.h"
-#include "vmcore/statistics.h"
-#include "vmcore/suck.h"
-#include "vmcore/system.h"
-
-#if defined(ENABLE_JVMTI)
-# include "native/jvmti/cacaodbg.h"
-#endif
+#include "vm/jit/trap.hpp"
#if defined(ENABLE_VMLOG)
#include <vmlog_cacao.h>
/**
- * This is _the_ instance of the VM.
+ * This is _the_ VM instance.
*/
-VM* vm;
+VM* VM::_vm = NULL;
/* global variables ***********************************************************/
OPT_MS,
OPT_MX,
+ OPT_XCHECK_JNI,
+
/* CACAO options */
OPT_VERBOSE1,
- OPT_NOIEEE,
#if defined(ENABLE_STATISTICS)
OPT_TIME,
OPT_SHOW,
OPT_DEBUGCOLOR,
-#if !defined(NDEBUG)
- OPT_ALL,
- OPT_METHOD,
- OPT_SIGNATURE,
-#endif
-
#if defined(ENABLE_VERIFIER)
OPT_NOVERIFY,
+ OPT_XVERIFY_ALL,
+ OPT_XVERIFY_NONE,
#if defined(TYPECHECK_VERBOSE)
OPT_VERBOSETC,
#endif
OPT_SS,
-#ifdef ENABLE_JVMTI
- OPT_DEBUG,
- OPT_XRUNJDWP,
- OPT_NOAGENT,
+#if defined(ENABLE_JVMTI)
OPT_AGENTLIB,
OPT_AGENTPATH,
+ OPT_RUN,
#endif
#if defined(ENABLE_DEBUG_FILTER)
{ "noasyncgc", false, OPT_IGNORE },
#if defined(ENABLE_VERIFIER)
{ "noverify", false, OPT_NOVERIFY },
- { "Xverify:none", false, OPT_NOVERIFY },
+ { "Xverify:all", false, OPT_XVERIFY_ALL },
+ { "Xverify:none", false, OPT_XVERIFY_NONE },
#endif
{ "v", false, OPT_VERBOSE1 },
{ "verbose:", true, OPT_VERBOSE },
#if defined(ENABLE_VERIFIER) && defined(TYPECHECK_VERBOSE)
{ "verbosetc", false, OPT_VERBOSETC },
#endif
-#if defined(__ALPHA__)
- { "noieee", false, OPT_NOIEEE },
-#endif
#if defined(ENABLE_STATISTICS)
{ "time", false, OPT_TIME },
{ "stat", false, OPT_STAT },
{ "c", true, OPT_CHECK },
{ "l", false, OPT_LOAD },
-#if !defined(NDEBUG)
- { "all", false, OPT_ALL },
- { "sig", true, OPT_SIGNATURE },
-#endif
-
#if defined(ENABLE_LOOP)
{ "oloop", false, OPT_OLOOP },
#endif
#endif
/* JVMTI Agent Command Line Options */
-#ifdef ENABLE_JVMTI
+#if defined(ENABLE_JVMTI)
{ "agentlib:", true, OPT_AGENTLIB },
{ "agentpath:", true, OPT_AGENTPATH },
#endif
{ "Xbootclasspath/p:", true, OPT_BOOTCLASSPATH_P },
{ "Xbootclasspath/c:", true, OPT_BOOTCLASSPATH_C },
-#ifdef ENABLE_JVMTI
- { "Xdebug", false, OPT_DEBUG },
- { "Xnoagent", false, OPT_NOAGENT },
- { "Xrunjdwp", true, OPT_XRUNJDWP },
-#endif
+#if defined(ENABLE_JVMTI)
+ { "Xdebug", false, OPT_IGNORE },
+ { "Xnoagent", false, OPT_IGNORE },
+ { "Xrun", true, OPT_RUN },
+#endif
{ "Xms", true, OPT_MS },
{ "ms", true, OPT_MS },
{ "Xss", true, OPT_SS },
{ "ss", true, OPT_SS },
+ { "Xcheck:jni", false, OPT_XCHECK_JNI },
+
#if defined(ENABLE_PROFILING)
{ "Xprof:", true, OPT_PROF_OPTION },
{ "Xprof", false, OPT_PROF },
/* keep these at the end of the list */
-#if !defined(NDEBUG)
- { "m", true, OPT_METHOD },
-#endif
-
{ "s", true, OPT_SHOW },
{ "debug-color", false, OPT_DEBUGCOLOR },
*******************************************************************************/
-void usage(void)
+static void usage(void)
{
puts("Usage: cacao [-options] classname [arguments]");
puts(" (to run a class file)");
puts(" -dsa | -disablesystemassertions");
puts(" disable system assertions");
-#ifdef ENABLE_JVMTI
- puts(" -agentlib:<agent-lib-name>=<options> library to load containg JVMTI agent");
- puts (" for jdwp help use: -agentlib:jdwp=help");
- puts(" -agentpath:<path-to-agent>=<options> path to library containg JVMTI agent");
+#if defined(ENABLE_JVMTI)
+ puts(" -agentlib:<agent-lib-name>=<options>");
+ puts(" load native agent library by library name");
+ puts(" for additional help use: -agentlib:jdwp=help");
+ puts(" -agentpath:<path-to-agent>=<options>");
+ puts(" load native agent library by full pathname");
#endif
/* exit with error code */
exit(1);
-}
+}
static void Xusage(void)
puts(" -Xprof[:bb] collect and print profiling data");
#endif
-#if defined(ENABLE_JVMTI)
- /* -Xdebug option depend on gnu classpath JDWP options. options:
- transport=dt_socket,address=<hostname:port>,server=(y|n),suspend(y|n) */
- puts(" -Xdebug enable remote debugging\n");
- puts(" -Xrunjdwp transport=[dt_socket|...],address=<hostname:port>,server=[y|n],suspend=[y|n]\n");
- puts(" enable remote debugging\n");
-#endif
-
/* exit with error code */
exit(1);
#ifdef TYPECHECK_VERBOSE
puts(" -verbosetc write debug messages while typechecking");
#endif
-#if defined(__ALPHA__)
- puts(" -noieee don't use ieee compliant arithmetic");
-#endif
#if defined(ENABLE_VERIFIER)
puts(" -noverify don't verify classfiles");
#endif
puts(" -oloop optimize array accesses in loops");
#endif
puts(" -l don't start the class after loading");
-#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");
-#endif
puts(" -s... show...");
puts(" (c)onstants the constant pool");
static void version(bool opt_exit)
{
puts("java version \""JAVA_VERSION"\"");
- puts("CACAO version "VERSION"\n");
+ puts("CACAO version "VERSION_FULL"\n");
- puts("Copyright (C) 1996-2005, 2006, 2007, 2008");
+ puts("Copyright (C) 1996-2005, 2006, 2007, 2008, 2009, 2010");
puts("CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO");
puts("This is free software; see the source for copying conditions. There is NO");
puts("warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.");
}
-static void vm_printconfig(void)
-{
- puts("Configure/Build options:\n");
- puts(" ./configure: "VERSION_CONFIGURE_ARGS"");
-#if defined(__VERSION__)
- puts(" CC : "VERSION_CC" ("__VERSION__")");
-#else
- puts(" CC : "VERSION_CC"");
-#endif
- puts(" CFLAGS : "VERSION_CFLAGS"\n");
-
- puts("Default variables:\n");
- printf(" maximum heap size : %d\n", HEAP_MAXSIZE);
- printf(" initial heap size : %d\n", HEAP_STARTSIZE);
- printf(" stack size : %d\n", STACK_SIZE);
-
-#if defined(ENABLE_JRE_LAYOUT)
- /* When we're building with JRE-layout, the default paths are the
- same as the runtime paths. */
-#else
-# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
- puts(" gnu.classpath.boot.library.path: "JAVA_RUNTIME_LIBRARY_LIBDIR);
- puts(" java.boot.class.path : "CACAO_VM_ZIP":"JAVA_RUNTIME_LIBRARY_CLASSES"");
-# elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
- puts(" sun.boot.library.path : "JAVA_RUNTIME_LIBRARY_LIBDIR);
- puts(" java.boot.class.path : "JAVA_RUNTIME_LIBRARY_CLASSES);
-# endif
-#endif
-
- puts("");
-
- puts("Runtime variables:\n");
- printf(" maximum heap size : %d\n", opt_heapmaxsize);
- printf(" initial heap size : %d\n", opt_heapstartsize);
- printf(" stack size : %d\n", opt_stacksize);
-
-#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
- printf(" gnu.classpath.boot.library.path: %s\n", properties_get("gnu.classpath.boot.library.path"));
-#elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
- printf(" sun.boot.library.path : %s\n", properties_get("sun.boot.library.path"));
-#endif
-
- printf(" java.boot.class.path : %s\n", properties_get("java.boot.class.path"));
- printf(" java.class.path : %s\n", properties_get("java.class.path"));
-}
-
-
/* forward declarations *******************************************************/
static char *vm_get_mainclass_from_jar(char *mainstring);
// Instantiate a new VM.
try {
- vm = new VM(_vm_args);
+ _vm = new VM(_vm_args);
}
catch (std::exception e) {
// FIXME How can we delete the resources allocated?
// FREE(env, _Jv_JNIEnv);
// FREE(vm, _Jv_JavaVM);
- vm = NULL;
+ _vm = NULL;
return false;
}
// Return the values.
- *p_vm = vm->get_javavm();
- *p_env = vm->get_jnienv();
+ *p_vm = _vm->get_javavm();
+ *p_env = _vm->get_jnienv();
return true;
}
// Make ourself globally visible.
// XXX Is this a good idea?
- vm = this;
+ _vm = this;
/* create and fill a JavaVM structure */
bool opt_version;
bool opt_exit;
-#if defined(ENABLE_JVMTI)
- lt_dlhandle handle;
- char *libname, *agentarg;
- bool jdwp,agentbypath;
- jdwp = agentbypath = false;
-#endif
-
#if defined(ENABLE_JNI)
/* Check the JNI version requested. */
/* Install the exit handler. */
if (atexit(vm_exit_handler))
- vm_abort("atexit failed: %s\n", strerror(errno));
+ os::abort("atexit failed: %s\n", strerror(errno));
/* Set some options. */
opt_version = false;
opt_exit = false;
- opt_noieee = false;
-
opt_heapmaxsize = HEAP_MAXSIZE;
opt_heapstartsize = HEAP_STARTSIZE;
opt_stacksize = STACK_SIZE;
- /* Initialize the properties list before command-line handling.
- Otherwise -XX:+PrintConfig crashes. */
-
- properties_init();
-
- /* First of all, parse the -XX options. */
+ // First of all, parse the -XX options.
#if defined(ENABLE_VMLOG)
vmlog_cacao_init_options();
options_xx(vm_args);
+ // After -XX options are parsed, print the build-time
+ // configuration, if requested.
+ if (opt_PrintConfig)
+ print_build_time_config();
+
#if defined(ENABLE_VMLOG)
vmlog_cacao_init();
#endif
/* We need to check if the actual size of a java.lang.Class object
is smaller or equal than the assumption made in
- src/vmcore/class.h. */
+ src/vm/class.hpp. */
- if (sizeof(java_lang_Class) > sizeof(dummy_java_lang_Class))
- vm_abort("vm_create: java_lang_Class structure is bigger than classinfo.object (%d > %d)", sizeof(java_lang_Class), sizeof(dummy_java_lang_Class));
+// FIXME We need to check the size of java.lang.Class!!!
+// if (sizeof(java_lang_Class) > sizeof(dummy_java_lang_Class))
+// vm_abort("vm_create: java_lang_Class structure is bigger than classinfo.object (%d > %d)", sizeof(java_lang_Class), sizeof(dummy_java_lang_Class));
/* set the VM starttime */
_starttime = builtin_currenttimemillis();
-#if defined(ENABLE_JVMTI)
- /* initialize JVMTI related **********************************************/
- jvmti = false;
-#endif
-
- /* Fill the properties before command-line handling. */
-
- properties_set();
-
/* iterate over all passed options */
while ((opt = options_get(opts, vm_args)) != OPT_DONE) {
/* Forget old classpath and set the argument as new
classpath. */
- class_path = properties_get("java.class.path");
+ // FIXME Make class_path const char*.
+ class_path = (char*) _properties.get("java.class.path");
p = MNEW(char, strlen(opt_arg) + strlen("0"));
strcpy(p, opt_arg);
#if defined(ENABLE_JAVASE)
- properties_add("java.class.path", p);
+ _properties.put("java.class.path", p);
#endif
MFREE(class_path, char, strlen(class_path));
for (unsigned int i = 0; i < strlen(opt_arg); i++) {
if (opt_arg[i] == '=') {
opt_arg[i] = '\0';
- properties_add(opt_arg, opt_arg + i + 1);
+ _properties.put(opt_arg, opt_arg + i + 1);
goto opt_d_done;
}
}
/* if no '=' is given, just create an empty property */
- properties_add(opt_arg, "");
+ _properties.put(opt_arg, "");
opt_d_done:
break;
/* Forget default bootclasspath and set the argument as
new boot classpath. */
- boot_class_path = properties_get("sun.boot.class.path");
+ // FIXME Make boot_class_path const char*.
+ boot_class_path = (char*) _properties.get("sun.boot.class.path");
p = MNEW(char, strlen(opt_arg) + strlen("0"));
strcpy(p, opt_arg);
- properties_add("sun.boot.class.path", p);
- properties_add("java.boot.class.path", p);
+ _properties.put("sun.boot.class.path", p);
+ _properties.put("java.boot.class.path", p);
MFREE(boot_class_path, char, strlen(boot_class_path));
break;
case OPT_BOOTCLASSPATH_A:
/* Append to bootclasspath. */
- boot_class_path = properties_get("sun.boot.class.path");
+ // FIXME Make boot_class_path const char*.
+ boot_class_path = (char*) _properties.get("sun.boot.class.path");
len = strlen(boot_class_path);
strcat(p, ":");
strcat(p, opt_arg);
- properties_add("sun.boot.class.path", p);
- properties_add("java.boot.class.path", p);
+ _properties.put("sun.boot.class.path", p);
+ _properties.put("java.boot.class.path", p);
break;
case OPT_BOOTCLASSPATH_P:
/* Prepend to bootclasspath. */
- boot_class_path = properties_get("sun.boot.class.path");
+ // FIXME Make boot_class_path const char*.
+ boot_class_path = (char*) _properties.get("sun.boot.class.path");
len = strlen(boot_class_path);
strcat(p, ":");
strcat(p, boot_class_path);
- properties_add("sun.boot.class.path", p);
- properties_add("java.boot.class.path", p);
+ _properties.put("sun.boot.class.path", p);
+ _properties.put("java.boot.class.path", p);
MFREE(boot_class_path, char, len);
break;
/* Use as Java core library, but prepend VM interface
classes. */
- boot_class_path = properties_get("sun.boot.class.path");
+ // FIXME Make boot_class_path const char*.
+ boot_class_path = (char*) _properties.get("sun.boot.class.path");
len =
strlen(CACAO_VM_ZIP) +
strcat(p, ":");
strcat(p, opt_arg);
- properties_add("sun.boot.class.path", p);
- properties_add("java.boot.class.path", p);
+ _properties.put("sun.boot.class.path", p);
+ _properties.put("java.boot.class.path", p);
MFREE(boot_class_path, char, strlen(boot_class_path));
break;
#if defined(ENABLE_JVMTI)
- case OPT_DEBUG:
- /* this option exists only for compatibility reasons */
- break;
+ case OPT_AGENTLIB:
+ // Parse option argument.
+ p = strchr(opt_arg, '=');
+ if (p != NULL)
+ *(p++) = '\0';
- case OPT_NOAGENT:
- /* I don't know yet what Xnoagent should do. This is only for
- compatiblity with eclipse - motse */
+ _nativeagents.register_agent_library(opt_arg, p);
break;
- case OPT_XRUNJDWP:
- agentbypath = true;
- jvmti = true;
- jdwp = true;
-
- len =
- strlen(CACAO_LIBDIR) +
- strlen("/libjdwp.so=") +
- strlen(opt_arg) +
- strlen("0");
-
- agentarg = MNEW(char, len);
+ case OPT_AGENTPATH:
+ // Parse option argument.
+ p = strchr(opt_arg, '=');
+ if (p != NULL)
+ *(p++) = '\0';
- strcpy(agentarg, CACAO_LIBDIR);
- strcat(agentarg, "/libjdwp.so=");
- strcat(agentarg, &opt_arg[1]);
+ _nativeagents.register_agent_path(opt_arg, p);
break;
- case OPT_AGENTPATH:
- agentbypath = true;
+ case OPT_RUN:
+ // Parse option argument.
+ p = strchr(opt_arg, ':');
+ if (p != NULL)
+ *(p++) = '\0';
- case OPT_AGENTLIB:
- jvmti = true;
- agentarg = opt_arg;
+ _nativeagents.register_agent_library(opt_arg, p);
break;
#endif
-
+
case OPT_MX:
case OPT_MS:
case OPT_SS:
}
break;
+ case OPT_XCHECK_JNI:
+ // HotSpot compatibility option.
+ break;
+
case OPT_VERBOSE1:
opt_verbose = true;
break;
opt_version = true;
break;
- case OPT_NOIEEE:
- opt_noieee = true;
+#if defined(ENABLE_VERIFIER)
+ case OPT_XVERIFY_ALL:
+ opt_verify = true;
break;
-#if defined(ENABLE_VERIFIER)
case OPT_NOVERIFY:
+ case OPT_XVERIFY_NONE:
opt_verify = false;
break;
#endif
makeinitializations = false;
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;
-#endif
-
case OPT_SHOW: /* Display options */
for (unsigned int i = 0; i < strlen(opt_arg); i++) {
switch (opt_arg[i]) {
opt_showdisassemble = true;
compileverbose = true;
break;
-
- case 'o':
- opt_shownops = true;
- break;
#endif
case 'd':
#if defined(ENABLE_SSA)
case OPT_LSRA:
opt_lsra = true;
- for (i = 0; i < strlen(opt_arg); i++) {
+ for (unsigned int i = 0; i < strlen(opt_arg); i++) {
switch (opt_arg[i]) {
case 'c':
opt_ssa_cp = true;
}
}
-#if defined(ENABLE_JVMTI)
- if (jvmti) {
- jvmti_set_phase(JVMTI_PHASE_ONLOAD);
- jvmti_agentload(agentarg, agentbypath, &handle, &libname);
-
- if (jdwp)
- MFREE(agentarg, char, strlen(agentarg));
-
- jvmti_set_phase(JVMTI_PHASE_PRIMORDIAL);
- }
-#endif
+ // Print the preliminary run-time VM configuration after options
+ // are parsed.
+ if (opt_PrintConfig)
+ print_run_time_config();
/* initialize the garbage collector */
gc_init(opt_heapmaxsize, opt_heapstartsize);
#if defined(ENABLE_THREADS)
- /* BEFORE: threads_preinit */
-
- threadlist_init();
-
/* AFTER: gc_init */
threads_preinit();
/* install architecture dependent signal handlers */
if (!signal_init())
- vm_abort("vm_create: signal_init failed");
+ os::abort("vm_create: signal_init failed");
#if defined(ENABLE_INTRP)
/* Allocate main thread stack on the Java heap. */
/* AFTER: threads_preinit */
if (!string_init())
- vm_abort("vm_create: string_init failed");
+ os::abort("vm_create: string_init failed");
/* AFTER: threads_preinit */
utf8_init();
- /* AFTER: thread_preinit */
+ // Hook point before the VM is initialized.
+ Hook::vm_preinit();
- if (!suck_init())
- vm_abort("vm_create: suck_init failed");
+#if defined(ENABLE_JVMTI)
+ // AFTER: utf8_init
+ if (!_nativeagents.load_agents())
+ os::abort("vm_create: load_agents failed");
+#endif
+
+ /* AFTER: thread_preinit */
- suck_add_from_property("java.endorsed.dirs");
+ _suckclasspath.add_from_property("java.endorsed.dirs");
/* Now we have all options handled and we can print the version
information.
/* AFTER: utf8_init */
- boot_class_path = properties_get("sun.boot.class.path");
- suck_add(boot_class_path);
+ // FIXME Make boot_class_path const char*.
+ boot_class_path = (char*) _properties.get("sun.boot.class.path");
+ _suckclasspath.add(boot_class_path);
/* initialize the classcache hashtable stuff: lock, hashtable
(must be done _after_ threads_preinit) */
if (!classcache_init())
- vm_abort("vm_create: classcache_init failed");
+ os::abort("vm_create: classcache_init failed");
/* Initialize the code memory management. */
/* AFTER: threads_preinit */
threads_preinit) */
if (!finalizer_init())
- vm_abort("vm_create: finalizer_init failed");
+ os::abort("vm_create: finalizer_init failed");
/* Initialize the JIT compiler. */
pythonpass_init();
#endif
- /* BEFORE: loader_preinit */
-
- Package::initialize();
-
/* AFTER: utf8_init, classcache_init */
loader_preinit();
linker_preinit();
- /* AFTER: loader_preinit, linker_preinit */
-
- primitive_init();
+ // AFTER: loader_preinit, linker_preinit
+ Primitive::initialize_table();
loader_init();
linker_init();
- /* AFTER: loader_init, linker_init */
-
- primitive_postinit();
+ // AFTER: loader_init, linker_init
+ Primitive::post_initialize_table();
method_init();
#if defined(ENABLE_JIT)
#endif
if (!builtin_init())
- vm_abort("vm_create: builtin_init failed");
-
- /* Initialize the native subsystem. */
- /* BEFORE: threads_init */
-
- if (!native_init())
- vm_abort("vm_create: native_init failed");
+ os::abort("vm_create: builtin_init failed");
/* Register the native methods implemented in the VM. */
/* BEFORE: threads_init */
(e.g. NewGlobalRef). */
if (!jni_init())
- vm_abort("vm_create: jni_init failed");
+ os::abort("vm_create: jni_init failed");
#endif
#if defined(ENABLE_JNI) || defined(ENABLE_HANDLES)
/* BEFORE: threads_init */
if (!localref_table_init())
- vm_abort("vm_create: localref_table_init failed");
+ os::abort("vm_create: localref_table_init failed");
#endif
/* Iinitialize some important system classes. */
/* Initialize the native VM subsystem. */
/* AFTER: threads_init (at least for SUN's classes) */
- nativevm_init();
+ if (!nativevm_init())
+ os::abort("vm_create: nativevm_init failed");
#if defined(ENABLE_PROFILING)
/* initialize profiling */
if (!profile_init())
- vm_abort("vm_create: profile_init failed");
+ os::abort("vm_create: profile_init failed");
#endif
#if defined(ENABLE_THREADS)
- /* initialize recompilation */
-
- if (!recompile_init())
- vm_abort("vm_create: recompile_init failed");
-
/* start the signal handler thread */
#if defined(__LINUX__)
if (threads_pthreads_implementation_nptl)
#endif
if (!signal_start_thread())
- vm_abort("vm_create: signal_start_thread failed");
+ os::abort("vm_create: signal_start_thread failed");
/* finally, start the finalizer thread */
if (!finalizer_start_thread())
- vm_abort("vm_create: finalizer_start_thread failed");
+ os::abort("vm_create: finalizer_start_thread failed");
# if !defined(NDEBUG)
/* start the memory profiling thread */
if (opt_ProfileMemoryUsage || opt_ProfileGCMemoryUsage)
if (!memory_start_thread())
- vm_abort("vm_create: memory_start_thread failed");
+ os::abort("vm_create: memory_start_thread failed");
# endif
- /* start the recompilation thread (must be done before the
- profiling thread) */
-
- if (!recompile_start_thread())
- vm_abort("vm_create: recompile_start_thread failed");
+ // Start the recompilation thread (must be done before the
+ // profiling thread).
+ // FIXME Only works for one recompiler.
+ _recompiler.start();
# if defined(ENABLE_PROFILING)
/* start the profile sampling thread */
/* if (opt_prof) */
/* if (!profile_start_thread()) */
-/* vm_abort("vm_create: profile_start_thread failed"); */
+/* os::abort("vm_create: profile_start_thread failed"); */
# endif
#endif
-#if defined(ENABLE_JVMTI)
-# if defined(ENABLE_GC_CACAO)
- /* XXX this will not work with the new indirection cells for classloaders!!! */
- assert(0);
-# endif
- if (jvmti) {
- /* add agent library to native library hashtable */
- native_hashtable_library_add(utf_new_char(libname), class_java_lang_Object->classloader, handle);
- }
-#endif
-
/* Increment the number of VMs. */
vms++;
// Initialization is done, VM is created.
_created = true;
_initializing = false;
-
- /* Print the VM configuration after all stuff is set and the VM is
- initialized. */
+ // Set the VM inittime.
+ _inittime = builtin_currenttimemillis();
+
+ // Hook point after the VM is initialized.
+ Hook::vm_init();
+
+ // Print the run-time VM configuration after all stuff is set and
+ // the VM is initialized.
if (opt_PrintConfig)
- vm_printconfig();
+ print_run_time_config();
+
+ // Start runtime agents after the VM is created.
+ if (!start_runtime_agents())
+ os::abort("vm_create: start_runtime_agents failed");
+}
+
+
+/**
+ * Print build-time (default) VM configuration.
+ */
+void VM::print_build_time_config(void)
+{
+ puts("CACAO "VERSION_FULL" configure/build options:");
+ puts("");
+ puts(" ./configure: "VERSION_CONFIGURE_ARGS"");
+#if defined(__VERSION__)
+ puts(" CC : "VERSION_CC" ("__VERSION__")");
+ puts(" CXX : "VERSION_CXX" ("__VERSION__")");
+#else
+ puts(" CC : "VERSION_CC"");
+ puts(" CXX : "VERSION_CXX"");
+#endif
+ puts(" CFLAGS : "VERSION_CFLAGS"");
+ puts(" CXXFLAGS : "VERSION_CXXFLAGS"");
+
+ puts("");
+
+ puts("Build-time (default) variables:\n");
+ printf(" maximum heap size : %d\n", HEAP_MAXSIZE);
+ printf(" initial heap size : %d\n", HEAP_STARTSIZE);
+ printf(" stack size : %d\n", STACK_SIZE);
+
+#if defined(ENABLE_JRE_LAYOUT)
+ // When we're building with JRE-layout, the default paths are the
+ // same as the runtime paths.
+#else
+# if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
+ puts(" gnu.classpath.boot.library.path: "JAVA_RUNTIME_LIBRARY_LIBDIR);
+ puts(" java.boot.class.path : "CACAO_VM_ZIP":"JAVA_RUNTIME_LIBRARY_CLASSES"");
+# elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
+ puts(" sun.boot.library.path : "JAVA_RUNTIME_LIBRARY_LIBDIR);
+ puts(" java.boot.class.path : "JAVA_RUNTIME_LIBRARY_CLASSES);
+# endif
+#endif
+
+ puts("");
+}
+
+
+/**
+ * Print run-time VM configuration.
+ */
+void VM::print_run_time_config()
+{
+ puts("Run-time variables:\n");
+ printf(" maximum heap size : %d\n", opt_heapmaxsize);
+ printf(" initial heap size : %d\n", opt_heapstartsize);
+ printf(" stack size : %d\n", opt_stacksize);
+
+#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
+ printf(" gnu.classpath.boot.library.path: %s\n", _properties.get("gnu.classpath.boot.library.path"));
+#elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
+ printf(" sun.boot.library.path : %s\n", _properties.get("sun.boot.library.path"));
+#endif
+
+ printf(" java.boot.class.path : %s\n", _properties.get("java.boot.class.path"));
+ printf(" java.class.path : %s\n", _properties.get("java.class.path"));
+
+ puts("");
+}
+
+
+/**
+ * Start runtime agents which are provided by the JRE but need to be
+ * started explicitly by the VM.
+ */
+bool VM::start_runtime_agents()
+{
+#if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
+
+ // Nothing to do.
+
+#elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
+
+ // Check whether the management agent should be loaded.
+ if ((_properties.get("com.sun.management.jmxremote") != NULL) ||
+ (_properties.get("com.sun.management.snmp") != NULL))
+ {
+
+ // Load the management agent class.
+ classinfo* class_sun_management_Agent;
+ if (!(class_sun_management_Agent = load_class_from_sysloader(utf_new_char("sun/management/Agent"))))
+ return false;
+
+ // Link the management agent class.
+ if (!link_class(class_sun_management_Agent))
+ return false;
+
+ // Actually start the management agent.
+ methodinfo* m = class_resolveclassmethod(class_sun_management_Agent,
+ utf_new_char("startAgent"),
+ utf_void__void,
+ class_java_lang_Object,
+ false);
+
+ if (m == NULL)
+ return false;
+
+ (void) vm_call_method(m, NULL);
+
+ if (exceptions_get_exception() != NULL)
+ return false;
+ }
+
+#elif defined(WITH_JAVA_RUNTIME_LIBRARY_CLDC1_1)
+
+ // Nothing to do.
+
+#else
+# error unknown classpath configuration
+#endif
+
+ return true;
}
void vm_run(JavaVM *vm, JavaVMInitArgs *vm_args)
{
- char* option;
- char* mainname;
- char* p;
- utf *mainutf;
- classinfo *mainclass;
- java_handle_t *e;
- methodinfo *m;
- java_handle_objectarray_t *oa;
- s4 oalength;
- utf *u;
- java_handle_t *s;
- int status;
-
- // Prevent compiler warnings.
- oa = NULL;
+ methodinfo* m;
+ int status;
#if !defined(NDEBUG)
- if (compileall) {
+ if (opt_CompileAll) {
vm_compile_all();
return;
}
#endif
- /* Get the main class plus it's arguments. */
+ /* Get the main class or jar file argument. */
- mainname = NULL;
+ char* mainname = NULL;
if (opt_index < vm_args->nOptions) {
/* Get main-class argument. */
classpath. */
if (opt_jar == true) {
- p = MNEW(char, strlen(mainname) + strlen("0"));
+ char* p = MNEW(char, strlen(mainname) + strlen("0"));
strcpy(p, mainname);
#if defined(ENABLE_JAVASE)
- properties_add("java.class.path", p);
+ VM::get_current()->get_properties().put("java.class.path", p);
#endif
}
else {
mainname[i] = '/';
}
- /* Build argument array. Move index to first argument. */
+ /* Move index to first argument. */
opt_index++;
-
- oalength = vm_args->nOptions - opt_index;
-
- oa = builtin_anewarray(oalength, class_java_lang_String);
-
- for (int i = 0; i < oalength; i++) {
- option = vm_args->options[opt_index + i].optionString;
-
- u = utf_new_char(option);
- s = javastring_new(u);
-
- array_objectarray_element_set(oa, i, s);
- }
}
/* Do we have a main-class argument? */
usage();
#if !defined(NDEBUG)
- if (opt_method != NULL) {
+ if (opt_CompileMethod != NULL) {
vm_compile_method(mainname);
return;
}
#endif
+ /* Build argument array. */
+
+ int32_t oalength = vm_args->nOptions - opt_index;
+
+ ObjectArray oa(oalength, class_java_lang_String);
+
+ if (oa.is_null())
+ vm_exit(1);
+
+ for (int i = 0; i < oalength; i++) {
+ char* option = vm_args->options[opt_index + i].optionString;
+
+ utf* u = utf_new_char(option);
+ java_handle_t* s = javastring_new(u);
+
+ oa.set_element(i, s);
+ }
+
/* set return value to OK */
status = 0;
/* load the main class */
- mainutf = utf_new_char(mainname);
+ utf* mainutf = utf_new_char(mainname);
#if defined(ENABLE_JAVAME_CLDC1_1)
- mainclass = load_class_bootstrap(mainutf);
+ classinfo* mainclass = load_class_bootstrap(mainutf);
#else
- mainclass = load_class_from_sysloader(mainutf);
+ classinfo* mainclass = load_class_from_sysloader(mainutf);
#endif
/* error loading class */
- e = exceptions_get_and_clear_exception();
+ java_handle_t* e = exceptions_get_and_clear_exception();
if ((e != NULL) || (mainclass == NULL)) {
exceptions_throw_noclassdeffounderror_cause(e);
typeinfo_test();
#endif
-#if defined(ENABLE_JVMTI)
- jvmti_set_phase(JVMTI_PHASE_LIVE);
-#endif
-
- /* set ThreadMXBean variables */
-
-// _Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount++;
-// _Jv_jvm->java_lang_management_ThreadMXBean_TotalStartedThreadCount++;
-
-// if (_Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount >
-// _Jv_jvm->java_lang_management_ThreadMXBean_PeakThreadCount)
-// _Jv_jvm->java_lang_management_ThreadMXBean_PeakThreadCount =
-// _Jv_jvm->java_lang_management_ThreadMXBean_ThreadCount;
-#warning Move to C++
-
/* start the main thread */
- (void) vm_call_method(m, NULL, oa);
+ (void) vm_call_method(m, NULL, oa.get_handle());
/* exception occurred? */
the application's main method exits. */
if (!thread_detach_current_thread())
- vm_abort("vm_run: Could not detach main thread.");
+ os::abort("vm_run: Could not detach main thread.");
#endif
/* Destroy the JavaVM. */
JavaVMAttachArgs args;
- args.name = "DestroyJavaVM";
+ args.name = (char*) "DestroyJavaVM";
args.group = NULL;
if (!thread_attach_current_thread(&args, false))
threads_join_all_threads();
#endif
+ // Hook point before the VM is actually destroyed.
+ Hook::vm_shutdown();
+
/* VM is gone. */
// _created = false;
-#warning Move to C++
/* Everything is ok. */
/* signal that we are exiting */
// _exiting = true;
-#warning Move to C++
assert(class_java_lang_System);
assert(class_java_lang_System->state & CLASS_LOADED);
}
-/* vm_abort ********************************************************************
-
- Prints an error message and aborts the VM.
-
- IN:
- text ... error message to print
-
-*******************************************************************************/
-
-void vm_abort(const char *text, ...)
-{
- va_list ap;
-
- /* Print the log message. */
-
- log_start();
-
- va_start(ap, text);
- log_vprint(text, ap);
- va_end(ap);
-
- log_finish();
-
- /* Now abort the VM. */
-
- system_abort();
-}
-
-
-/* vm_abort_errnum *************************************************************
-
- Prints an error message, appends ":" plus the strerror-message of
- errnum and aborts the VM.
-
- IN:
- errnum ... error number
- text ..... error message to print
-
-*******************************************************************************/
-
-void vm_abort_errnum(int errnum, const char *text, ...)
-{
- va_list ap;
-
- /* Print the log message. */
-
- log_start();
-
- va_start(ap, text);
- log_vprint(text, ap);
- va_end(ap);
-
- /* Print the strerror-message of errnum. */
-
- log_print(": %s", system_strerror(errnum));
-
- log_finish();
-
- /* Now abort the VM. */
-
- system_abort();
-}
-
-
-/* vm_abort_errno **************************************************************
-
- Equal to vm_abort_errnum, but uses errno to get the error number.
-
- IN:
- text ... error message to print
-
-*******************************************************************************/
-
-void vm_abort_errno(const char *text, ...)
-{
- va_list ap;
-
- va_start(ap, text);
- vm_abort_errnum(errno, text, ap);
- va_end(ap);
-}
-
-
/* vm_abort_disassemble ********************************************************
Prints an error message, disassemble the given code range (if
/* Disassemble the given number of instructions. */
for (i = 0; i < count; i++)
- pc = disassinstr(pc);
+ // FIXME disassinstr should use void*.
+ pc = disassinstr((u1*) pc);
#endif
- vm_abort("Aborting...");
+ os::abort("Aborting...");
}
methodinfo *m;
java_handle_t *s;
+#if defined(ENABLE_JAVAME_CLDC1_1)
+ c = load_class_bootstrap(utf_new_char("java/util/jar/JarFile"));
+#else
c = load_class_from_sysloader(utf_new_char("java/util/jar/JarFile"));
+#endif
if (c == NULL) {
exceptions_print_stacktrace();
if (!link_class(mainclass))
exceptions_print_stacktrace();
- if (opt_signature != NULL) {
+ if (opt_CompileSignature != NULL) {
m = class_resolveclassmethod(mainclass,
- utf_new_char(opt_method),
- utf_new_char(opt_signature),
+ utf_new_char(opt_CompileMethod),
+ utf_new_char(opt_CompileSignature),
mainclass,
false);
}
else {
m = class_resolveclassmethod(mainclass,
- utf_new_char(opt_method),
+ utf_new_char(opt_CompileMethod),
NULL,
mainclass,
false);
}
if (m == NULL)
- vm_abort("vm_compile_method: java.lang.NoSuchMethodException: %s.%s",
- opt_method, opt_signature ? opt_signature : "");
+ os::abort("vm_compile_method: java.lang.NoSuchMethodException: %s.%s",
+ opt_CompileMethod, opt_CompileSignature ? opt_CompileSignature : "");
jit_compile(m);
}
{ \
uint64_t *array; \
type value; \
- int32_t dumpmarker; \
\
if (m->code == NULL) \
if (!jit_compile(m)) \
return 0; \
\
THREAD_NATIVEWORLD_EXIT; \
- DMARKER; \
+ \
+ DumpMemoryArea dma; \
\
array = argument_vmarray_from_valist(m, o, ap); \
value = vm_call##name##_array(m, array); \
\
- DRELEASE; \
THREAD_NATIVEWORLD_ENTER; \
\
return value; \
{ \
uint64_t *array; \
type value; \
- int32_t dumpmarker; \
\
if (m->code == NULL) \
if (!jit_compile(m)) \
return 0; \
\
THREAD_NATIVEWORLD_EXIT; \
- DMARKER; \
+ \
+ DumpMemoryArea dma; \
\
array = argument_vmarray_from_jvalue(m, o, args); \
value = vm_call##name##_array(m, array); \
\
- DRELEASE; \
THREAD_NATIVEWORLD_ENTER; \
\
return value; \
java_handle_t *xptr;
java_handle_t *ro;
imm_union value;
- int32_t dumpmarker;
/* Prevent compiler warnings. */
THREAD_NATIVEWORLD_EXIT;
- /* mark start of dump memory area */
-
- DMARKER;
+ // Create new dump memory area.
+ DumpMemoryArea dma;
/* Fill the argument array from a object-array. */
array = argument_vmarray_from_objectarray(m, o, params);
if (array == NULL) {
- /* release dump area */
-
- DRELEASE;
-
/* enter the nativeworld again */
THREAD_NATIVEWORLD_ENTER;
return NULL;
}
- switch (m->parseddesc->returntype.decltype) {
+ switch (m->parseddesc->returntype.primitivetype) {
case PRIMITIVETYPE_VOID:
value.a = vm_call_array(m, array);
break;
break;
default:
- vm_abort("vm_call_method_objectarray: invalid return type %d", m->parseddesc->returntype.decltype);
+ os::abort("vm_call_method_objectarray: invalid return type %d", m->parseddesc->returntype.primitivetype);
}
- /* release dump area */
-
- DRELEASE;
-
/* enter the nativeworld again */
THREAD_NATIVEWORLD_ENTER;
/* box the return value if necesarry */
- if (m->parseddesc->returntype.decltype != TYPE_ADR)
- ro = Primitive::box(m->parseddesc->returntype.decltype, value);
+ if (m->parseddesc->returntype.primitivetype != TYPE_ADR)
+ ro = Primitive::box(m->parseddesc->returntype.primitivetype, value);
/* check for an exception */
extern "C" {
-JavaVM* VM_get_javavm() { return vm->get_javavm(); }
-JNIEnv* VM_get_jnienv() { return vm->get_jnienv(); }
-bool VM_is_initializing() { return vm->is_initializing(); }
-bool VM_is_created() { return vm->is_created(); }
-int64_t VM_get_starttime() { return vm->get_starttime(); }
+JNIEnv* VM_get_jnienv() { return VM::get_current()->get_jnienv(); }
+
+void vm_abort(const char* text, ...)
+{
+ va_list ap;
+
+ log_println("vm_abort: WARNING, port me to C++ and use os::abort() instead.");
+
+ // Print the log message.
+ log_start();
+
+ va_start(ap, text);
+ log_vprint(text, ap);
+ va_end(ap);
+
+ log_finish();
+
+ // Print a backtrace.
+ os::print_backtrace();
+
+ // Now abort the VM.
+ os::abort();
+}
}