1 /* src/vm/finalizer.c - finalizer linked list and thread
3 Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
4 C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5 E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6 J. Wenninger, Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 Contact: cacao@cacaojvm.org
27 Authors: Christian Thalinger
29 Changes: Martin Platter
31 $Id: finalizer.c 4357 2006-01-22 23:33:38Z twisti $
44 #include "mm/memory.h"
45 #include "native/jni.h"
46 #include "native/native.h"
48 #if defined(ENABLE_THREADS)
49 # include "threads/native/threads.h"
52 #include "vm/classcache.h"
53 #include "vm/exceptions.h"
54 #include "vm/finalizer.h"
55 #include "vm/global.h"
56 #include "vm/initialize.h"
57 #include "vm/options.h"
58 #include "vm/properties.h"
59 #include "vm/signallocal.h"
60 #include "vm/stringlocal.h"
63 #include "vm/jit/jit.h"
64 #include "vm/jit/asmpart.h"
65 #include "vm/jit/profile/profile.h"
66 #include "vm/rt-timing.h"
68 #if defined(ENABLE_JVMTI)
69 #include "native/jvmti/cacaodbg.h"
72 /* Invocation API variables ***************************************************/
74 _Jv_JavaVM *_Jv_jvm; /* denotes a Java VM */
75 _Jv_JNIEnv *_Jv_env; /* pointer to native method interface */
78 /* global variables ***********************************************************/
80 s4 vms = 0; /* number of VMs created */
82 bool vm_initializing = false;
83 bool vm_exiting = false;
85 #if defined(ENABLE_INTRP)
86 u1 *intrp_main_stack = NULL;
89 char *mainstring = NULL;
90 classinfo *mainclass = NULL;
92 char *specificmethodname = NULL;
93 char *specificsignature = NULL;
98 /* define heap sizes **********************************************************/
100 #define HEAP_MAXSIZE 64 * 1024 * 1024 /* default 64MB */
101 #define HEAP_STARTSIZE 2 * 1024 * 1024 /* default 2MB */
102 #define STACK_SIZE 128 * 1024 /* default 128kB */
105 /* define command line options ************************************************/
127 /* Java non-standard options */
148 #if defined(ENABLE_STATISTICS)
161 #if defined(ENABLE_VERIFIER)
163 #if defined(TYPECHECK_VERBOSE)
166 #endif /* defined(ENABLE_VERIFIER) */
169 /* optimization options */
171 #if defined(ENABLE_LOOP)
175 #if defined(ENABLE_IFCONV)
179 #if defined(ENABLE_LSRA)
183 #if defined(ENABLE_INLINING)
187 #if defined(ENABLE_INTRP)
188 /* interpreter options */
211 opt_struct opts[] = {
214 { "jar", false, OPT_JAR },
216 { "d32", false, OPT_D32 },
217 { "d64", false, OPT_D64 },
218 { "client", false, OPT_IGNORE },
219 { "server", false, OPT_IGNORE },
220 { "hotspot", false, OPT_IGNORE },
222 { "classpath", true, OPT_CLASSPATH },
223 { "cp", true, OPT_CLASSPATH },
224 { "D", true, OPT_D },
225 { "version", false, OPT_VERSION },
226 { "showversion", false, OPT_SHOWVERSION },
227 { "fullversion", false, OPT_FULLVERSION },
228 { "help", false, OPT_HELP },
229 { "?", false, OPT_HELP },
230 { "X", false, OPT_X },
232 { "noasyncgc", false, OPT_IGNORE },
233 #if defined(ENABLE_VERIFIER)
234 { "noverify", false, OPT_NOVERIFY },
236 { "v", false, OPT_VERBOSE1 },
237 { "verbose:", true, OPT_VERBOSE },
239 #if defined(ENABLE_VERIFIER) && defined(TYPECHECK_VERBOSE)
240 { "verbosetc", false, OPT_VERBOSETC },
242 #if defined(__ALPHA__)
243 { "noieee", false, OPT_NOIEEE },
245 { "softnull", false, OPT_SOFTNULL },
246 #if defined(ENABLE_STATISTICS)
247 { "time", false, OPT_TIME },
248 { "stat", false, OPT_STAT },
250 { "log", true, OPT_LOG },
251 { "c", true, OPT_CHECK },
252 { "l", false, OPT_LOAD },
253 { "eager", false, OPT_EAGER },
254 { "sig", true, OPT_SIGNATURE },
255 { "all", false, OPT_ALL },
256 #if defined(ENABLE_LOOP)
257 { "oloop", false, OPT_OLOOP },
259 #if defined(ENABLE_IFCONV)
260 { "ifconv", false, OPT_IFCONV },
262 #if defined(ENABLE_LSRA)
263 { "lsra", false, OPT_LSRA },
266 #if defined(ENABLE_INTRP)
267 /* interpreter options */
269 { "trace", false, OPT_TRACE },
270 { "static-supers", true, OPT_STATIC_SUPERS },
271 { "no-dynamic", false, OPT_NO_DYNAMIC },
272 { "no-replication", false, OPT_NO_REPLICATION },
273 { "no-quicksuper", false, OPT_NO_QUICKSUPER },
276 /* JVMTI Agent Command Line Options */
278 { "agentlib:", true, OPT_AGENTLIB },
279 { "agentpath:", true, OPT_AGENTPATH },
282 /* Java non-standard options */
284 { "Xjit", false, OPT_JIT },
285 { "Xint", false, OPT_INTRP },
286 { "Xbootclasspath:", true, OPT_BOOTCLASSPATH },
287 { "Xbootclasspath/a:", true, OPT_BOOTCLASSPATH_A },
288 { "Xbootclasspath/p:", true, OPT_BOOTCLASSPATH_P },
290 { "Xdebug", false, OPT_DEBUG },
291 { "Xnoagent", false, OPT_NOAGENT },
292 { "Xrunjdwp", true, OPT_XRUNJDWP },
294 { "Xms", true, OPT_MS },
295 { "ms", true, OPT_MS },
296 { "Xmx", true, OPT_MX },
297 { "mx", true, OPT_MX },
298 { "Xss", true, OPT_SS },
299 { "ss", true, OPT_SS },
300 { "Xprof:", true, OPT_PROF_OPTION },
301 { "Xprof", false, OPT_PROF },
303 /* keep these at the end of the list */
305 #if defined(ENABLE_INLINING)
306 { "i", true, OPT_INLINING },
308 { "m", true, OPT_METHOD },
309 { "s", true, OPT_SHOW },
315 /* usage ***********************************************************************
317 Prints the correct usage syntax to stdout.
319 *******************************************************************************/
323 puts("Usage: cacao [-options] classname [arguments]");
324 puts(" (to run a class file)");
325 puts(" or cacao [-options] -jar jarfile [arguments]");
326 puts(" (to run a standalone jar file)\n");
328 puts("Java options:");
329 puts(" -d32 use 32-bit data model if available");
330 puts(" -d64 use 64-bit data model if available");
331 puts(" -client compatibility (currently ignored)");
332 puts(" -server compatibility (currently ignored)");
333 puts(" -hotspot compatibility (currently ignored)\n");
335 puts(" -cp <path> specify a path to look for classes");
336 puts(" -classpath <path> specify a path to look for classes");
337 puts(" -D<name>=<value> add an entry to the property list");
338 puts(" -verbose[:class|gc|jni] enable specific verbose output");
339 puts(" -version print product version and exit");
340 puts(" -fullversion print jpackage-compatible product version and exit");
341 puts(" -showversion print product version and continue");
342 puts(" -help, -? print this help message");
343 puts(" -X print help on non-standard Java options\n");
346 puts(" -agentlib:<agent-lib-name>=<options> library to load containg JVMTI agent");
347 puts(" -agentpath:<path-to-agent>=<options> path to library containg JVMTI agent");
350 puts("CACAO options:\n");
351 puts(" -v write state-information");
352 puts(" -verbose[:call|exception]enable specific verbose output");
353 #ifdef TYPECHECK_VERBOSE
354 puts(" -verbosetc write debug messages while typechecking");
356 #if defined(__ALPHA__)
357 puts(" -noieee don't use ieee compliant arithmetic");
359 #if defined(ENABLE_VERIFIER)
360 puts(" -noverify don't verify classfiles");
362 puts(" -softnull use software nullpointer check");
363 #if defined(ENABLE_STATISTICS)
364 puts(" -time measure the runtime");
365 puts(" -stat detailed compiler statistics");
367 puts(" -log logfile specify a name for the logfile");
368 puts(" -c(heck)b(ounds) don't check array bounds");
369 puts(" s(ync) don't check for synchronization");
370 #if defined(ENABLE_LOOP)
371 puts(" -oloop optimize array accesses in loops");
373 puts(" -l don't start the class after loading");
374 puts(" -eager perform eager class loading and linking");
375 puts(" -all compile all methods, no execution");
376 puts(" -m compile only a specific method");
377 puts(" -sig specify signature for a specific method");
378 puts(" -s(how)a(ssembler) show disassembled listing");
379 puts(" c(onstants) show the constant pool");
380 puts(" d(atasegment) show data segment listing");
381 puts(" e(xceptionstubs) show disassembled exception stubs (only with -sa)");
382 puts(" i(ntermediate) show intermediate representation");
383 puts(" m(ethods) show class fields and methods");
384 puts(" n(ative) show disassembled native stubs");
385 puts(" u(tf) show the utf - hash");
386 #if defined(ENABLE_INLINING)
387 puts(" -i n(line) activate inlining");
388 puts(" v(irtual) inline virtual methods (uses/turns rt option on)");
389 puts(" e(exception) inline methods with exceptions");
390 puts(" p(aramopt) optimize argument renaming");
391 puts(" o(utsiders) inline methods of foreign classes");
392 #endif /* defined(ENABLE_INLINING) */
393 #if defined(ENABLE_IFCONV)
394 puts(" -ifconv use if-conversion");
396 #if defined(ENABLE_LSRA)
397 puts(" -lsra use linear scan register allocation");
400 /* exit with error code */
406 static void Xusage(void)
408 #if defined(ENABLE_JIT)
409 puts(" -Xjit JIT mode execution (default)");
411 #if defined(ENABLE_INTRP)
412 puts(" -Xint interpreter mode execution");
414 puts(" -Xbootclasspath:<zip/jar files and directories separated by :>");
415 puts(" value is set as bootstrap class path");
416 puts(" -Xbootclasspath/a:<zip/jar files and directories separated by :>");
417 puts(" value is appended to the bootstrap class path");
418 puts(" -Xbootclasspath/p:<zip/jar files and directories separated by :>");
419 puts(" value is prepended to the bootstrap class path");
420 puts(" -Xms<size> set the initial size of the heap (default: 2MB)");
421 puts(" -Xmx<size> set the maximum size of the heap (default: 64MB)");
422 puts(" -Xss<size> set the thread stack size (default: 128kB)");
423 puts(" -Xprof[:bb] collect and print profiling data");
424 #if defined(ENABLE_JVMTI)
425 /* -Xdebug option depend on gnu classpath JDWP options. options:
426 transport=dt_socket,address=<hostname:port>,server=(y|n),suspend(y|n) */
427 puts(" -Xdebug enable remote debugging\n");
428 puts(" -Xrunjdwp transport=[dt_socket|...],address=<hostname:port>,server=[y|n],suspend=[y|n]\n");
429 puts(" enable remote debugging\n");
432 /* exit with error code */
438 /* version *********************************************************************
440 Only prints cacao version information.
442 *******************************************************************************/
444 static void version(void)
446 puts("java version \""JAVA_VERSION"\"");
447 puts("CACAO version "VERSION"");
449 puts("Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,");
450 puts("C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,");
451 puts("E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,");
452 puts("J. Wenninger, Institut f. Computersprachen - TU Wien\n");
454 puts("This program is free software; you can redistribute it and/or");
455 puts("modify it under the terms of the GNU General Public License as");
456 puts("published by the Free Software Foundation; either version 2, or (at");
457 puts("your option) any later version.\n");
459 puts("This program is distributed in the hope that it will be useful, but");
460 puts("WITHOUT ANY WARRANTY; without even the implied warranty of");
461 puts("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU");
462 puts("General Public License for more details.\n");
464 puts("Configure/Build options:\n");
465 puts(" ./configure: "VERSION_CONFIGURE_ARGS"");
466 #if defined(__VERSION__)
467 puts(" CC : "VERSION_CC" ("__VERSION__")");
469 puts(" CC : "VERSION_CC"");
471 puts(" CFLAGS : "VERSION_CFLAGS"");
475 /* fullversion *****************************************************************
477 Prints a Sun compatible version information (required e.g. by
478 jpackage, www.jpackage.org).
480 *******************************************************************************/
482 static void fullversion(void)
484 puts("java full version \"cacao-"JAVA_VERSION"\"");
492 /* vm_create *******************************************************************
494 Creates a JVM. Called by JNI_CreateJavaVM.
496 *******************************************************************************/
498 bool vm_create(JavaVMInitArgs *vm_args)
508 #if defined(ENABLE_JVMTI)
511 bool agentbypath = false;;
516 /* check the JNI version requested */
518 switch (vm_args->version) {
519 case JNI_VERSION_1_1:
521 case JNI_VERSION_1_2:
522 case JNI_VERSION_1_4:
528 /* we only support 1 JVM instance */
534 /* get stuff from the environment *****************************************/
536 #if defined(DISABLE_GC)
537 nogc_init(HEAP_MAXSIZE, HEAP_STARTSIZE);
541 /* set the bootclasspath */
543 cp = getenv("BOOTCLASSPATH");
546 bootclasspath = MNEW(char, strlen(cp) + strlen("0"));
547 strcpy(bootclasspath, cp);
550 cplen = strlen(CACAO_VM_ZIP_PATH) +
552 strlen(CLASSPATH_GLIBJ_ZIP_PATH) +
555 bootclasspath = MNEW(char, cplen);
556 strcat(bootclasspath, CACAO_VM_ZIP_PATH);
557 strcat(bootclasspath, ":");
558 strcat(bootclasspath, CLASSPATH_GLIBJ_ZIP_PATH);
562 /* set the classpath */
564 cp = getenv("CLASSPATH");
567 classpath = MNEW(char, strlen(cp) + strlen("0"));
568 strcat(classpath, cp);
571 classpath = MNEW(char, strlen(".") + strlen("0"));
572 strcpy(classpath, ".");
576 /* interpret the options **************************************************/
581 heapmaxsize = HEAP_MAXSIZE;
582 heapstartsize = HEAP_STARTSIZE;
583 opt_stacksize = STACK_SIZE;
586 #if defined(ENABLE_JVMTI)
587 /* initialize JVMTI related **********************************************/
588 jdwp = jvmti = false;
591 /* initialize properties before commandline handling */
593 if (!properties_init())
594 throw_cacao_exception_exit(string_java_lang_InternalError,
595 "Unable to init properties");
597 /* iterate over all passed options */
599 while ((opt = options_get(opts, vm_args)) != OPT_DONE) {
609 #if SIZEOF_VOID_P == 8
610 puts("Running a 32-bit JVM is not supported on this platform.");
616 #if SIZEOF_VOID_P == 4
617 puts("Running a 64-bit JVM is not supported on this platform.");
623 /* forget old classpath and set the argument as new classpath */
624 MFREE(classpath, char, strlen(classpath));
626 classpath = MNEW(char, strlen(opt_arg) + strlen("0"));
627 strcpy(classpath, opt_arg);
631 for (j = 0; j < strlen(opt_arg); j++) {
632 if (opt_arg[j] == '=') {
634 properties_add(opt_arg, opt_arg + j + 1);
639 /* if no '=' is given, just create an empty property */
641 properties_add(opt_arg, "");
646 case OPT_BOOTCLASSPATH:
647 /* Forget default bootclasspath and set the argument as
648 new boot classpath. */
649 MFREE(bootclasspath, char, strlen(bootclasspath));
651 bootclasspath = MNEW(char, strlen(opt_arg) + strlen("0"));
652 strcpy(bootclasspath, opt_arg);
655 case OPT_BOOTCLASSPATH_A:
656 /* append to end of bootclasspath */
657 cplen = strlen(bootclasspath);
659 bootclasspath = MREALLOC(bootclasspath,
662 cplen + strlen(":") +
663 strlen(opt_arg) + strlen("0"));
665 strcat(bootclasspath, ":");
666 strcat(bootclasspath, opt_arg);
669 case OPT_BOOTCLASSPATH_P:
670 /* prepend in front of bootclasspath */
674 bootclasspath = MNEW(char, strlen(opt_arg) + strlen(":") +
675 cplen + strlen("0"));
677 strcpy(bootclasspath, opt_arg);
678 strcat(bootclasspath, ":");
679 strcat(bootclasspath, cp);
681 MFREE(cp, char, cplen);
684 #if defined(ENABLE_JVMTI)
689 /* I don't know yet what Xnoagent should do. This is only for
690 compatiblity with eclipse - motse */
695 while (transport[j]!='=') j++;
697 while (j<strlen(transport)) {
698 if (strncmp("suspend=",&transport[j],8)==0) {
699 if ((j+8)>=strlen(transport) ||
700 (transport[j+8]!= 'y' && transport[j+8]!= 'n')) {
701 printf("bad Xrunjdwp option: -Xrunjdwp%s\n",transport);
706 suspend = transport[j+8] == 'y';
710 while (transport[j]!=',') j++;
729 c = opt_arg[strlen(opt_arg) - 1];
731 if ((c == 'k') || (c == 'K')) {
732 j = atoi(opt_arg) * 1024;
734 } else if ((c == 'm') || (c == 'M')) {
735 j = atoi(opt_arg) * 1024 * 1024;
742 else if (opt == OPT_MS)
754 if (strcmp("class", opt_arg) == 0)
755 opt_verboseclass = true;
757 else if (strcmp("gc", opt_arg) == 0)
758 opt_verbosegc = true;
760 else if (strcmp("jni", opt_arg) == 0)
761 opt_verbosejni = true;
763 else if (strcmp("call", opt_arg) == 0)
764 opt_verbosecall = true;
766 else if (strcmp("jit", opt_arg) == 0) {
771 compileverbose = true;
773 else if (strcmp("exception", opt_arg) == 0)
774 opt_verboseexception = true;
777 #if defined(ENABLE_VERIFIER) && defined(TYPECHECK_VERBOSE)
779 opt_typecheckverbose = true;
788 case OPT_FULLVERSION:
792 case OPT_SHOWVERSION:
800 #if defined(ENABLE_VERIFIER)
810 #if defined(ENABLE_STATISTICS)
812 opt_getcompilingtime = true;
813 opt_getloadingtime = true;
826 for (j = 0; j < strlen(opt_arg); j++) {
827 switch (opt_arg[j]) {
842 makeinitializations = false;
851 opt_method = opt_arg;
852 makeinitializations = false;
856 opt_signature = opt_arg;
862 makeinitializations = false;
865 case OPT_SHOW: /* Display options */
866 for (j = 0; j < strlen(opt_arg); j++) {
867 switch (opt_arg[j]) {
869 opt_showdisassemble = true;
870 compileverbose = true;
873 showconstantpool = true;
876 opt_showddatasegment = true;
879 opt_showexceptionstubs = true;
882 opt_showintermediate = true;
883 compileverbose = true;
889 opt_shownativestub = true;
900 #if defined(ENABLE_LOOP)
906 #if defined(ENABLE_INLINING)
908 for (j = 0; j < strlen(opt_arg); j++) {
909 switch (opt_arg[j]) {
911 /* define in options.h; Used in main.c, jit.c
912 & inline.c inlining is currently
916 inlinevirtuals = true;
919 inlineexceptions = true;
922 inlineparamopt = true;
925 inlineoutsiders = true;
932 #endif /* defined(ENABLE_INLINING) */
934 #if defined(ENABLE_IFCONV)
940 #if defined(ENABLE_LSRA)
954 case OPT_PROF_OPTION:
955 /* use <= to get the last \0 too */
957 for (j = 0, k = 0; j <= strlen(opt_arg); j++) {
958 if (opt_arg[j] == ',')
961 if (opt_arg[j] == '\0') {
962 if (strcmp("bb", opt_arg + k) == 0)
966 printf("Unknown option: -Xprof:%s\n", opt_arg + k);
970 /* set k to next char */
982 #if defined(ENABLE_JIT)
985 printf("-Xjit option not enabled.\n");
991 #if defined(ENABLE_INTRP)
994 printf("-Xint option not enabled.\n");
999 #if defined(ENABLE_INTRP)
1000 case OPT_STATIC_SUPERS:
1001 opt_static_supers = atoi(opt_arg);
1004 case OPT_NO_DYNAMIC:
1005 opt_no_dynamic = true;
1008 case OPT_NO_REPLICATION:
1009 opt_no_replication = true;
1012 case OPT_NO_QUICKSUPER:
1013 opt_no_quicksuper = true;
1022 printf("Unknown option: %s\n",
1023 vm_args->options[opt_index].optionString);
1029 /* get the main class *****************************************************/
1031 if (opt_index < vm_args->nOptions) {
1032 mainstring = vm_args->options[opt_index++].optionString;
1034 /* Put the jar file into the classpath (if any). */
1036 if (opt_jar == true) {
1037 /* free old classpath */
1039 MFREE(classpath, char, strlen(classpath));
1041 /* put jarfile into classpath */
1043 classpath = MNEW(char, strlen(mainstring) + strlen("0"));
1045 strcpy(classpath, mainstring);
1048 /* replace .'s with /'s in classname */
1050 for (i = strlen(mainstring) - 1; i >= 0; i--)
1051 if (mainstring[i] == '.')
1052 mainstring[i] = '/';
1056 #if defined(ENABLE_JVMTI)
1058 set_jvmti_phase(JVMTI_PHASE_ONLOAD);
1059 agentload(agentarg, agentbypath, &handle, &libname);
1061 set_jvmti_phase(JVMTI_PHASE_PRIMORDIAL);
1065 /* initialize this JVM ****************************************************/
1067 vm_initializing = true;
1069 /* initialize the garbage collector */
1071 gc_init(heapmaxsize, heapstartsize);
1073 #if defined(ENABLE_INTRP)
1074 /* Allocate main thread stack on the Java heap. */
1077 intrp_main_stack = GCMNEW(u1, opt_stacksize);
1078 MSET(intrp_main_stack, 0, u1, opt_stacksize);
1082 #if defined(ENABLE_THREADS)
1086 /* initialize the string hashtable stuff: lock (must be done
1087 _after_ threads_preinit) */
1090 throw_main_exception_exit();
1092 /* initialize the utf8 hashtable stuff: lock, often used utf8
1093 strings (must be done _after_ threads_preinit) */
1096 throw_main_exception_exit();
1098 /* initialize the classcache hashtable stuff: lock, hashtable
1099 (must be done _after_ threads_preinit) */
1101 if (!classcache_init())
1102 throw_main_exception_exit();
1104 /* initialize the loader with bootclasspath (must be done _after_
1108 throw_main_exception_exit();
1110 suck_add_from_property("java.endorsed.dirs");
1111 suck_add(bootclasspath);
1113 /* initialize the memory subsystem (must be done _after_
1117 throw_main_exception_exit();
1119 /* initialize the finalizer stuff (must be done _after_
1122 if (!finalizer_init())
1123 throw_main_exception_exit();
1125 /* install architecture dependent signal handler used for exceptions */
1129 /* initialize the codegen subsystems */
1133 /* initializes jit compiler */
1137 /* machine dependent initialization */
1139 #if defined(ENABLE_JIT)
1140 # if defined(ENABLE_INTRP)
1150 /* initialize the loader subsystems (must be done _after_
1154 throw_main_exception_exit();
1157 throw_main_exception_exit();
1160 throw_main_exception_exit();
1162 if (!exceptions_init())
1163 throw_main_exception_exit();
1165 if (!builtin_init())
1166 throw_main_exception_exit();
1168 /* Initialize the JNI subsystem (must be done _before_
1169 threads_init, as threads_init can call JNI methods
1170 (e.g. NewGlobalRef). */
1173 throw_main_exception_exit();
1175 #if defined(ENABLE_THREADS)
1176 if (!threads_init())
1177 throw_main_exception_exit();
1180 /* That's important, otherwise we get into trouble, if the Runtime
1181 static initializer is called before (circular dependency. This
1182 is with classpath 0.09. Another important thing is, that this
1183 has to happen after initThreads!!! */
1185 if (!initialize_class(class_java_lang_System))
1186 throw_main_exception_exit();
1188 #if defined(ENABLE_PROFILING)
1189 /* initialize profiling */
1191 if (!profile_init())
1192 throw_main_exception_exit();
1195 #if defined(ENABLE_THREADS)
1196 /* finally, start the finalizer thread */
1198 if (!finalizer_start_thread())
1199 throw_main_exception_exit();
1201 /* start the profile sampling thread */
1203 /* if (!profile_start_thread()) */
1204 /* throw_main_exception_exit(); */
1207 #if defined(ENABLE_JVMTI)
1209 /* add agent library to native library hashtable */
1210 native_hashtable_library_add(utf_new_char(libname), class_java_lang_Object->classloader, handle);
1214 /* increment the number of VMs */
1218 /* initialization is done */
1220 vm_initializing = false;
1222 /* everything's ok */
1228 /* vm_destroy ******************************************************************
1230 Unloads a Java VM and reclaims its resources.
1232 *******************************************************************************/
1234 s4 vm_destroy(JavaVM *vm)
1236 #if defined(ENABLE_THREADS)
1237 threads_join_all_threads();
1240 /* everything's ok */
1246 /* vm_exit *********************************************************************
1248 Calls java.lang.System.exit(I)V to exit the JavaVM correctly.
1250 *******************************************************************************/
1252 void vm_exit(s4 status)
1256 /* signal that we are exiting */
1260 assert(class_java_lang_System);
1261 assert(class_java_lang_System->state & CLASS_LOADED);
1263 #if defined(ENABLE_JVMTI)
1264 set_jvmti_phase(JVMTI_PHASE_DEAD);
1265 if (jvmti) agentunload();
1268 if (!link_class(class_java_lang_System))
1269 throw_main_exception_exit();
1271 /* call java.lang.System.exit(I)V */
1273 m = class_resolveclassmethod(class_java_lang_System,
1274 utf_new_char("exit"),
1276 class_java_lang_Object,
1280 throw_main_exception_exit();
1282 /* call the exit function with passed exit status */
1284 (void) vm_call_method(m, NULL, status);
1286 /* If we had an exception, just ignore the exception and exit with
1289 vm_shutdown(status);
1293 /* vm_shutdown *****************************************************************
1295 Terminates the system immediately without freeing memory explicitly
1296 (to be used only for abnormal termination).
1298 *******************************************************************************/
1300 void vm_shutdown(s4 status)
1303 #if defined(ENABLE_STATISTICS)
1304 || opt_getcompilingtime || opt_stat
1308 log_text("CACAO terminated by shutdown");
1309 dolog("Exit status: %d\n", (s4) status);
1316 /* vm_exit_handler *************************************************************
1318 The exit_handler function is called upon program termination.
1320 ATTENTION: Don't free system resources here! Some threads may still
1321 be running as this is called from VMRuntime.exit(). The OS does the
1324 *******************************************************************************/
1326 void vm_exit_handler(void)
1328 #if !defined(NDEBUG)
1330 class_showmethods(mainclass);
1332 if (showconstantpool)
1333 class_showconstantpool(mainclass);
1338 # if defined(ENABLE_PROFILING)
1340 profile_printstats();
1342 #endif /* !defined(NDEBUG) */
1344 #if defined(ENABLE_RT_TIMING)
1345 rt_timing_print_time_stats(stderr);
1348 #if defined(ENABLE_CYCLES_STATS)
1349 builtin_print_cycles_stats(stderr);
1350 stacktrace_print_cycles_stats(stderr);
1354 #if defined(ENABLE_STATISTICS)
1355 || opt_getcompilingtime || opt_stat
1359 log_text("CACAO terminated");
1361 #if defined(ENABLE_STATISTICS)
1364 #ifdef TYPECHECK_STATISTICS
1365 typecheck_print_statistics(get_logfile());
1371 if (opt_getcompilingtime)
1373 #endif /* defined(ENABLE_STATISTICS) */
1375 /* vm_print_profile(stderr);*/
1379 /* vm_vmargs_from_valist *******************************************************
1383 *******************************************************************************/
1385 static void vm_vmargs_from_valist(methodinfo *m, java_objectheader *o,
1386 vm_arg *vmargs, va_list ap)
1388 typedesc *paramtypes;
1391 paramtypes = m->parseddesc->paramtypes;
1393 /* if method is non-static fill first block and skip `this' pointer */
1398 /* the `this' pointer */
1399 vmargs[0].type = TYPE_ADR;
1400 vmargs[0].data.l = (u8) (ptrint) o;
1406 for (; i < m->parseddesc->paramcount; i++, paramtypes++) {
1407 switch (paramtypes->decltype) {
1408 /* primitive types */
1409 case PRIMITIVETYPE_BOOLEAN:
1410 case PRIMITIVETYPE_BYTE:
1411 case PRIMITIVETYPE_CHAR:
1412 case PRIMITIVETYPE_SHORT:
1413 case PRIMITIVETYPE_INT:
1414 vmargs[i].type = TYPE_INT;
1415 vmargs[i].data.l = (s8) va_arg(ap, s4);
1418 case PRIMITIVETYPE_LONG:
1419 vmargs[i].type = TYPE_LNG;
1420 vmargs[i].data.l = (s8) va_arg(ap, s8);
1423 case PRIMITIVETYPE_FLOAT:
1424 vmargs[i].type = TYPE_FLT;
1425 #if defined(__ALPHA__)
1426 /* this keeps the assembler function much simpler */
1428 vmargs[i].data.d = (jdouble) va_arg(ap, jdouble);
1430 vmargs[i].data.f = (jfloat) va_arg(ap, jdouble);
1434 case PRIMITIVETYPE_DOUBLE:
1435 vmargs[i].type = TYPE_DBL;
1436 vmargs[i].data.d = (jdouble) va_arg(ap, jdouble);
1440 vmargs[i].type = TYPE_ADR;
1441 vmargs[i].data.l = (u8) (ptrint) va_arg(ap, void*);
1448 /* vm_vmargs_from_jvalue *******************************************************
1452 *******************************************************************************/
1454 static void vm_vmargs_from_jvalue(methodinfo *m, java_objectheader *o,
1455 vm_arg *vmargs, jvalue *args)
1457 typedesc *paramtypes;
1461 paramtypes = m->parseddesc->paramtypes;
1463 /* if method is non-static fill first block and skip `this' pointer */
1468 /* the `this' pointer */
1469 vmargs[0].type = TYPE_ADR;
1470 vmargs[0].data.l = (u8) (ptrint) o;
1476 for (j = 0; i < m->parseddesc->paramcount; i++, j++, paramtypes++) {
1477 switch (paramtypes->decltype) {
1478 /* primitive types */
1479 case PRIMITIVETYPE_BOOLEAN:
1480 case PRIMITIVETYPE_BYTE:
1481 case PRIMITIVETYPE_CHAR:
1482 case PRIMITIVETYPE_SHORT:
1483 case PRIMITIVETYPE_INT:
1484 vmargs[i].type = TYPE_INT;
1485 vmargs[i].data.l = (s8) args[j].i;
1488 case PRIMITIVETYPE_LONG:
1489 vmargs[i].type = TYPE_LNG;
1490 vmargs[i].data.l = (s8) args[j].j;
1493 case PRIMITIVETYPE_FLOAT:
1494 vmargs[i].type = TYPE_FLT;
1495 #if defined(__ALPHA__)
1496 /* this keeps the assembler function much simpler */
1498 vmargs[i].data.d = (jdouble) args[j].f;
1500 vmargs[i].data.f = args[j].f;
1504 case PRIMITIVETYPE_DOUBLE:
1505 vmargs[i].type = TYPE_DBL;
1506 vmargs[i].data.d = args[j].d;
1510 vmargs[i].type = TYPE_ADR;
1511 vmargs[i].data.l = (u8) (ptrint) args[j].l;
1518 /* vm_call_method **************************************************************
1520 Calls a Java method with a variable number of arguments and returns
1523 *******************************************************************************/
1525 java_objectheader *vm_call_method(methodinfo *m, java_objectheader *o, ...)
1528 java_objectheader *ro;
1531 ro = vm_call_method_valist(m, o, ap);
1538 /* vm_call_method_valist *******************************************************
1540 Calls a Java method with a variable number of arguments, passed via
1541 a va_list, and returns an address.
1543 *******************************************************************************/
1545 java_objectheader *vm_call_method_valist(methodinfo *m, java_objectheader *o,
1550 java_objectheader *ro;
1553 /* mark start of dump memory area */
1555 dumpsize = dump_size();
1557 /* get number of Java method arguments */
1559 vmargscount = m->parseddesc->paramcount;
1561 /* allocate vm_arg array */
1563 vmargs = DMNEW(vm_arg, vmargscount);
1565 /* fill the vm_arg array from a va_list */
1567 vm_vmargs_from_valist(m, o, vmargs, ap);
1569 /* call the Java method */
1571 ro = vm_call_method_vmarg(m, vmargscount, vmargs);
1573 /* release dump area */
1575 dump_release(dumpsize);
1581 /* vm_call_method_jvalue *******************************************************
1583 Calls a Java method with a variable number of arguments, passed via
1584 a jvalue array, and returns an address.
1586 *******************************************************************************/
1588 java_objectheader *vm_call_method_jvalue(methodinfo *m, java_objectheader *o,
1593 java_objectheader *ro;
1596 /* mark start of dump memory area */
1598 dumpsize = dump_size();
1600 /* get number of Java method arguments */
1602 vmargscount = m->parseddesc->paramcount;
1604 /* allocate vm_arg array */
1606 vmargs = DMNEW(vm_arg, vmargscount);
1608 /* fill the vm_arg array from a va_list */
1610 vm_vmargs_from_jvalue(m, o, vmargs, args);
1612 /* call the Java method */
1614 ro = vm_call_method_vmarg(m, vmargscount, vmargs);
1616 /* release dump area */
1618 dump_release(dumpsize);
1624 /* vm_call_method_vmarg ********************************************************
1626 Calls a Java method with a variable number of arguments, passed via
1627 a vm_arg array, and returns an address.
1629 *******************************************************************************/
1631 java_objectheader *vm_call_method_vmarg(methodinfo *m, s4 vmargscount,
1634 java_objectheader *o;
1636 #if defined(ENABLE_JIT)
1637 # if defined(ENABLE_INTRP)
1639 o = intrp_asm_vm_call_method(m, vmargscount, vmargs);
1642 o = asm_vm_call_method(m, vmargscount, vmargs);
1644 o = intrp_asm_vm_call_method(m, vmargscount, vmargs);
1651 /* vm_call_method_int **********************************************************
1653 Calls a Java method with a variable number of arguments and returns
1656 *******************************************************************************/
1658 s4 vm_call_method_int(methodinfo *m, java_objectheader *o, ...)
1664 i = vm_call_method_int_valist(m, o, ap);
1671 /* vm_call_method_int_valist ***************************************************
1673 Calls a Java method with a variable number of arguments, passed via
1674 a va_list, and returns an integer (s4).
1676 *******************************************************************************/
1678 s4 vm_call_method_int_valist(methodinfo *m, java_objectheader *o, va_list ap)
1685 /* mark start of dump memory area */
1687 dumpsize = dump_size();
1689 /* get number of Java method arguments */
1691 vmargscount = m->parseddesc->paramcount;
1693 /* allocate vm_arg array */
1695 vmargs = DMNEW(vm_arg, vmargscount);
1697 /* fill the vm_arg array from a va_list */
1699 vm_vmargs_from_valist(m, o, vmargs, ap);
1701 /* call the Java method */
1703 i = vm_call_method_int_vmarg(m, vmargscount, vmargs);
1705 /* release dump area */
1707 dump_release(dumpsize);
1713 /* vm_call_method_int_jvalue ***************************************************
1715 Calls a Java method with a variable number of arguments, passed via
1716 a jvalue array, and returns an integer (s4).
1718 *******************************************************************************/
1720 s4 vm_call_method_int_jvalue(methodinfo *m, java_objectheader *o, jvalue *args)
1727 /* mark start of dump memory area */
1729 dumpsize = dump_size();
1731 /* get number of Java method arguments */
1733 vmargscount = m->parseddesc->paramcount;
1735 /* allocate vm_arg array */
1737 vmargs = DMNEW(vm_arg, vmargscount);
1739 /* fill the vm_arg array from a va_list */
1741 vm_vmargs_from_jvalue(m, o, vmargs, args);
1743 /* call the Java method */
1745 i = vm_call_method_int_vmarg(m, vmargscount, vmargs);
1747 /* release dump area */
1749 dump_release(dumpsize);
1755 /* vm_call_method_int_vmarg ****************************************************
1757 Calls a Java method with a variable number of arguments, passed via
1758 a vm_arg array, and returns an integer (s4).
1760 *******************************************************************************/
1762 s4 vm_call_method_int_vmarg(methodinfo *m, s4 vmargscount, vm_arg *vmargs)
1766 #if defined(ENABLE_JIT)
1767 # if defined(ENABLE_INTRP)
1769 i = intrp_asm_vm_call_method_int(m, vmargscount, vmargs);
1772 i = asm_vm_call_method_int(m, vmargscount, vmargs);
1774 i = intrp_asm_vm_call_method_int(m, vmargscount, vmargs);
1781 /* vm_call_method_long *********************************************************
1783 Calls a Java method with a variable number of arguments and returns
1786 *******************************************************************************/
1788 s8 vm_call_method_long(methodinfo *m, java_objectheader *o, ...)
1794 l = vm_call_method_long_valist(m, o, ap);
1801 /* vm_call_method_long_valist **************************************************
1803 Calls a Java method with a variable number of arguments, passed via
1804 a va_list, and returns a long (s8).
1806 *******************************************************************************/
1808 s8 vm_call_method_long_valist(methodinfo *m, java_objectheader *o, va_list ap)
1815 /* mark start of dump memory area */
1817 dumpsize = dump_size();
1819 /* get number of Java method arguments */
1821 vmargscount = m->parseddesc->paramcount;
1823 /* allocate vm_arg array */
1825 vmargs = DMNEW(vm_arg, vmargscount);
1827 /* fill the vm_arg array from a va_list */
1829 vm_vmargs_from_valist(m, o, vmargs, ap);
1831 /* call the Java method */
1833 l = vm_call_method_long_vmarg(m, vmargscount, vmargs);
1835 /* release dump area */
1837 dump_release(dumpsize);
1843 /* vm_call_method_long_jvalue **************************************************
1845 Calls a Java method with a variable number of arguments, passed via
1846 a jvalue array, and returns a long (s8).
1848 *******************************************************************************/
1850 s8 vm_call_method_long_jvalue(methodinfo *m, java_objectheader *o, jvalue *args)
1857 /* mark start of dump memory area */
1859 dumpsize = dump_size();
1861 /* get number of Java method arguments */
1863 vmargscount = m->parseddesc->paramcount;
1865 /* allocate vm_arg array */
1867 vmargs = DMNEW(vm_arg, vmargscount);
1869 /* fill the vm_arg array from a va_list */
1871 vm_vmargs_from_jvalue(m, o, vmargs, args);
1873 /* call the Java method */
1875 l = vm_call_method_long_vmarg(m, vmargscount, vmargs);
1877 /* release dump area */
1879 dump_release(dumpsize);
1885 /* vm_call_method_long_vmarg ***************************************************
1887 Calls a Java method with a variable number of arguments, passed via
1888 a vm_arg array, and returns a long (s8).
1890 *******************************************************************************/
1892 s8 vm_call_method_long_vmarg(methodinfo *m, s4 vmargscount, vm_arg *vmargs)
1896 #if defined(ENABLE_JIT)
1897 # if defined(ENABLE_INTRP)
1899 l = intrp_asm_vm_call_method_long(m, vmargscount, vmargs);
1902 l = asm_vm_call_method_long(m, vmargscount, vmargs);
1904 l = intrp_asm_vm_call_method_long(m, vmargscount, vmargs);
1911 /* vm_call_method_float ********************************************************
1913 Calls a Java method with a variable number of arguments and returns
1916 *******************************************************************************/
1918 float vm_call_method_float(methodinfo *m, java_objectheader *o, ...)
1924 f = vm_call_method_float_valist(m, o, ap);
1931 /* vm_call_method_float_valist *************************************************
1933 Calls a Java method with a variable number of arguments, passed via
1934 a va_list, and returns a float.
1936 *******************************************************************************/
1938 float vm_call_method_float_valist(methodinfo *m, java_objectheader *o,
1946 /* mark start of dump memory area */
1948 dumpsize = dump_size();
1950 /* get number of Java method arguments */
1952 vmargscount = m->parseddesc->paramcount;
1954 /* allocate vm_arg array */
1956 vmargs = DMNEW(vm_arg, vmargscount);
1958 /* fill the vm_arg array from a va_list */
1960 vm_vmargs_from_valist(m, o, vmargs, ap);
1962 /* call the Java method */
1964 f = vm_call_method_float_vmarg(m, vmargscount, vmargs);
1966 /* release dump area */
1968 dump_release(dumpsize);
1974 /* vm_call_method_float_jvalue *************************************************
1976 Calls a Java method with a variable number of arguments, passed via
1977 a jvalue array, and returns a float.
1979 *******************************************************************************/
1981 float vm_call_method_float_jvalue(methodinfo *m, java_objectheader *o,
1989 /* mark start of dump memory area */
1991 dumpsize = dump_size();
1993 /* get number of Java method arguments */
1995 vmargscount = m->parseddesc->paramcount;
1997 /* allocate vm_arg array */
1999 vmargs = DMNEW(vm_arg, vmargscount);
2001 /* fill the vm_arg array from a va_list */
2003 vm_vmargs_from_jvalue(m, o, vmargs, args);
2005 /* call the Java method */
2007 f = vm_call_method_float_vmarg(m, vmargscount, vmargs);
2009 /* release dump area */
2011 dump_release(dumpsize);
2017 /* vm_call_method_float_vmarg **************************************************
2019 Calls a Java method with a variable number of arguments and returns
2022 *******************************************************************************/
2024 float vm_call_method_float_vmarg(methodinfo *m, s4 vmargscount, vm_arg *vmargs)
2028 #if defined(ENABLE_JIT)
2029 # if defined(ENABLE_INTRP)
2031 f = intrp_asm_vm_call_method_float(m, vmargscount, vmargs);
2034 f = asm_vm_call_method_float(m, vmargscount, vmargs);
2036 f = intrp_asm_vm_call_method_float(m, vmargscount, vmargs);
2043 /* vm_call_method_double *******************************************************
2045 Calls a Java method with a variable number of arguments and returns
2048 *******************************************************************************/
2050 double vm_call_method_double(methodinfo *m, java_objectheader *o, ...)
2056 d = vm_call_method_double_valist(m, o, ap);
2063 /* vm_call_method_double_valist ************************************************
2065 Calls a Java method with a variable number of arguments, passed via
2066 a va_list, and returns a double.
2068 *******************************************************************************/
2070 double vm_call_method_double_valist(methodinfo *m, java_objectheader *o,
2078 /* mark start of dump memory area */
2080 dumpsize = dump_size();
2082 /* get number of Java method arguments */
2084 vmargscount = m->parseddesc->paramcount;
2086 /* allocate vm_arg array */
2088 vmargs = DMNEW(vm_arg, vmargscount);
2090 /* fill the vm_arg array from a va_list */
2092 vm_vmargs_from_valist(m, o, vmargs, ap);
2094 /* call the Java method */
2096 d = vm_call_method_double_vmarg(m, vmargscount, vmargs);
2098 /* release dump area */
2100 dump_release(dumpsize);
2106 /* vm_call_method_double_jvalue ************************************************
2108 Calls a Java method with a variable number of arguments, passed via
2109 a jvalue array, and returns a double.
2111 *******************************************************************************/
2113 double vm_call_method_double_jvalue(methodinfo *m, java_objectheader *o,
2121 /* mark start of dump memory area */
2123 dumpsize = dump_size();
2125 /* get number of Java method arguments */
2127 vmargscount = m->parseddesc->paramcount;
2129 /* allocate vm_arg array */
2131 vmargs = DMNEW(vm_arg, vmargscount);
2133 /* fill the vm_arg array from a va_list */
2135 vm_vmargs_from_jvalue(m, o, vmargs, args);
2137 /* call the Java method */
2139 d = vm_call_method_double_vmarg(m, vmargscount, vmargs);
2141 /* release dump area */
2143 dump_release(dumpsize);
2149 /* vm_call_method_double_vmarg *************************************************
2151 Calls a Java method with a variable number of arguments and returns
2154 *******************************************************************************/
2156 double vm_call_method_double_vmarg(methodinfo *m, s4 vmargscount,
2161 #if defined(ENABLE_JIT)
2162 # if defined(ENABLE_INTRP)
2164 d = intrp_asm_vm_call_method_double(m, vmargscount, vmargs);
2167 d = asm_vm_call_method_double(m, vmargscount, vmargs);
2169 d = intrp_asm_vm_call_method_double(m, vmargscount, vmargs);
2177 * These are local overrides for various environment variables in Emacs.
2178 * Please do not remove this and leave it at the end of the file, where
2179 * Emacs will automagically detect them.
2180 * ---------------------------------------------------------------------
2183 * indent-tabs-mode: t