1 /* main.c - contains main() and variables for the global options
3 Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
4 Institut f. Computersprachen, TU Wien
5 R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser, M. Probst,
6 S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich,
9 This file is part of CACAO.
11 This program is free software; you can redistribute it and/or
12 modify it under the terms of the GNU General Public License as
13 published by the Free Software Foundation; either version 2, or (at
14 your option) any later version.
16 This program is distributed in the hope that it will be useful, but
17 WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 General Public License for more details.
21 You should have received a copy of the GNU General Public License
22 along with this program; if not, write to the Free Software
23 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 Contact: cacao@complang.tuwien.ac.at
28 Authors: Reinhard Grafl
34 This module does the following tasks:
35 - Command line option handling
36 - Calling initialization routines
37 - Calling the class loader
38 - Running the main method
40 $Id: main.c 1150 2004-06-06 13:29:25Z twisti $
56 #include "threads/thread.h"
57 #include "toolbox/logging.h"
58 #include "toolbox/memory.h"
59 #include "jit/parseRTstats.h"
60 #include "nat/java_io_File.h" /* required by java_lang_Runtime.h */
61 #include "nat/java_util_Properties.h" /* required by java_lang_Runtime.h */
62 #include "nat/java_lang_Runtime.h"
63 #include "nat/java_lang_Throwable.h"
65 #ifdef TYPEINFO_DEBUG_TEST
69 /* command line option */
72 bool compileall = false;
73 bool runverbose = false; /* trace all method invocation */
74 bool verboseexception = false;
75 bool collectverbose = false;
77 bool loadverbose = false;
78 bool linkverbose = false;
79 bool initverbose = false;
81 bool opt_rt = false; /* true if RTA parse should be used RT-CO */
82 bool opt_xta = false; /* true if XTA parse should be used XTA-CO */
83 bool opt_vta = false; /* true if VTA parse should be used VTA-CO */
85 bool opt_liberalutf = false; /* Don't check overlong UTF-8 sequences */
87 bool showmethods = false;
88 bool showconstantpool = false;
91 bool compileverbose = false; /* trace compiler actions */
92 bool showstack = false;
93 bool showdisassemble = false; /* generate disassembler listing */
94 bool showddatasegment = false; /* generate data segment listing */
95 bool showintermediate = false; /* generate intermediate code listing */
97 bool useinlining = false; /* use method inlining */
98 bool inlinevirtuals = false; /* inline unique virtual methods */
99 bool inlineexceptions = false; /* inline methods, that contain excptions */
100 bool inlineparamopt = false; /* optimize parameter passing to inlined methods */
101 bool inlineoutsiders = false; /* inline methods, that are not member of the invoker's class */
103 bool checkbounds = true; /* check array bounds */
104 bool checknull = true; /* check null pointers */
105 bool opt_noieee = false; /* don't implement ieee compliant floats */
106 bool checksync = true; /* do synchronization */
107 bool opt_loops = false; /* optimize array accesses in loops */
109 bool makeinitializations = true;
111 bool getloadingtime = false; /* to measure the runtime */
114 bool getcompilingtime = false; /* compute compile time */
115 s8 compilingtime = 0; /* accumulated compile time */
117 int has_ext_instr_set = 0; /* has instruction set extensions */
119 bool opt_stat = false;
121 bool opt_verify = true; /* true if classfiles should be verified */
123 bool opt_eager = false;
126 static classinfo *mainclass;
128 #if defined(USE_THREADS) && !defined(NATIVE_THREADS)
129 void **stackbottom = 0;
133 /* internal function: get_opt *************************************************
135 decodes the next command line option
137 ******************************************************************************/
143 #define OPT_CLASSPATH 2
147 #define OPT_VERBOSE1 6
148 #define OPT_VERBOSE 7
149 #define OPT_VERBOSEGC 8
150 #define OPT_VERBOSECALL 9
151 #define OPT_NOIEEE 10
152 #define OPT_SOFTNULL 11
158 #define OPT_METHOD 17
159 #define OPT_SIGNATURE 18
163 #define OPT_INLINING 25
167 #define OPT_VERBOSETC 29
168 #define OPT_NOVERIFY 30
169 #define OPT_LIBERALUTF 31
170 #define OPT_VERBOSEEXCEPTION 32
174 struct {char *name; bool arg; int value;} opts[] = {
175 {"classpath", true, OPT_CLASSPATH},
177 {"ms", true, OPT_MS},
178 {"mx", true, OPT_MX},
179 {"noasyncgc", false, OPT_IGNORE},
180 {"noverify", false, OPT_NOVERIFY},
181 {"liberalutf", false, OPT_LIBERALUTF},
182 {"oss", true, OPT_IGNORE},
183 {"ss", true, OPT_IGNORE},
184 {"v", false, OPT_VERBOSE1},
185 {"verbose", false, OPT_VERBOSE},
186 {"verbosegc", false, OPT_VERBOSEGC},
187 {"verbosecall", false, OPT_VERBOSECALL},
188 {"verboseexception", false, OPT_VERBOSEEXCEPTION},
189 #ifdef TYPECHECK_VERBOSE
190 {"verbosetc", false, OPT_VERBOSETC},
192 #if defined(__ALPHA__)
193 {"noieee", false, OPT_NOIEEE},
195 {"softnull", false, OPT_SOFTNULL},
196 {"time", false, OPT_TIME},
197 {"stat", false, OPT_STAT},
198 {"log", true, OPT_LOG},
199 {"c", true, OPT_CHECK},
200 {"l", false, OPT_LOAD},
201 { "eager", false, OPT_EAGER },
202 {"m", true, OPT_METHOD},
203 {"sig", true, OPT_SIGNATURE},
204 {"s", true, OPT_SHOW},
205 {"all", false, OPT_ALL},
206 {"oloop", false, OPT_OLOOP},
207 {"i", true, OPT_INLINING},
208 {"rt", false, OPT_RT},
209 {"xta", false, OPT_XTA},
210 {"vta", false, OPT_VTA},
214 static int opt_ind = 1;
215 static char *opt_arg;
218 static int get_opt(int argc, char **argv)
223 if (opt_ind >= argc) return OPT_DONE;
226 if (a[0] != '-') return OPT_DONE;
228 for (i = 0; opts[i].name; i++) {
230 if (strcmp(a + 1, opts[i].name) == 0) { /* boolean option found */
232 return opts[i].value;
236 if (strcmp(a + 1, opts[i].name) == 0) { /* parameter option found */
238 if (opt_ind < argc) {
239 opt_arg = argv[opt_ind];
241 return opts[i].value;
246 size_t l = strlen(opts[i].name);
247 if (strlen(a + 1) > l) {
248 if (memcmp(a + 1, opts[i].name, l) == 0) {
251 return opts[i].value;
262 /******************** interne Function: print_usage ************************
264 Prints the correct usage syntax to stdout.
266 ***************************************************************************/
268 static void print_usage()
270 printf("USAGE: cacao [options] classname [program arguments]\n");
271 printf("Options:\n");
272 printf(" -classpath path ...... specify a path to look for classes\n");
273 printf(" -Dpropertyname=value . add an entry to the property list\n");
274 printf(" -mx maxmem[k|m] ...... specify the size for the heap\n");
275 printf(" -ms initmem[k|m] ..... specify the initial size for the heap\n");
276 printf(" -v ................... write state-information\n");
277 printf(" -verbose ............. write more information\n");
278 printf(" -verbosegc ........... write message for each GC\n");
279 printf(" -verbosecall ......... write message for each call\n");
280 printf(" -verboseexception .... write message for each step of stack unwinding\n");
281 #ifdef TYPECHECK_VERBOSE
282 printf(" -verbosetc ........... write debug messages while typechecking\n");
284 #if defined(__ALPHA__)
285 printf(" -noieee .............. don't use ieee compliant arithmetic\n");
287 printf(" -noverify ............ don't verify classfiles\n");
288 printf(" -liberalutf........... don't warn about overlong UTF-8 sequences\n");
289 printf(" -softnull ............ use software nullpointer check\n");
290 printf(" -time ................ measure the runtime\n");
291 printf(" -stat ................ detailed compiler statistics\n");
292 printf(" -log logfile ......... specify a name for the logfile\n");
293 printf(" -c(heck)b(ounds) ..... don't check array bounds\n");
294 printf(" s(ync) ....... don't check for synchronization\n");
295 printf(" -oloop ............... optimize array accesses in loops\n");
296 printf(" -l ................... don't start the class after loading\n");
297 printf(" -eager perform eager class loading and linking\n");
298 printf(" -all ................. compile all methods, no execution\n");
299 printf(" -m ................... compile only a specific method\n");
300 printf(" -sig ................. specify signature for a specific method\n");
301 printf(" -s(how)a(ssembler) ... show disassembled listing\n");
302 printf(" c(onstants) ... show the constant pool\n");
303 printf(" d(atasegment).. show data segment listing\n");
304 printf(" i(ntermediate). show intermediate representation\n");
305 printf(" m(ethods)...... show class fields and methods\n");
306 printf(" u(tf) ......... show the utf - hash\n");
307 printf(" -i n ............. activate inlining\n");
308 printf(" v ............. inline virtual methods\n");
309 printf(" e ............. inline methods with exceptions\n");
310 printf(" p ............. optimize argument renaming\n");
311 printf(" o ............. inline methods of foreign classes\n");
312 printf(" -rt .................. use rapid type analysis\n");
313 printf(" -xta ................. use x type analysis\n");
314 printf(" -vta ................. use variable type analysis\n");
318 /***************************** Function: print_times *********************
320 Prints a summary of CPU time usage.
322 **************************************************************************/
324 static void print_times()
326 s8 totaltime = getcputime();
327 s8 runtime = totaltime - loadingtime - compilingtime;
328 char logtext[MAXLOGTEXT];
330 #if defined(__I386__) || defined(__POWERPC__)
331 sprintf(logtext, "Time for loading classes: %lld secs, %lld millis",
333 sprintf(logtext, "Time for loading classes: %ld secs, %ld millis",
335 loadingtime / 1000000, (loadingtime % 1000000) / 1000);
338 #if defined(__I386__) || defined(__POWERPC__)
339 sprintf(logtext, "Time for compiling code: %lld secs, %lld millis",
341 sprintf(logtext, "Time for compiling code: %ld secs, %ld millis",
343 compilingtime / 1000000, (compilingtime % 1000000) / 1000);
346 #if defined(__I386__) || defined(__POWERPC__)
347 sprintf(logtext, "Time for running program: %lld secs, %lld millis",
349 sprintf(logtext, "Time for running program: %ld secs, %ld millis",
351 runtime / 1000000, (runtime % 1000000) / 1000);
354 #if defined(__I386__) || defined(__POWERPC__)
355 sprintf(logtext, "Total time: %lld secs, %lld millis",
357 sprintf(logtext, "Total time: %ld secs, %ld millis",
359 totaltime / 1000000, (totaltime % 1000000) / 1000);
364 /***************************** Function: print_stats *********************
366 outputs detailed compiler statistics
368 **************************************************************************/
370 static void print_stats()
372 char logtext[MAXLOGTEXT];
374 sprintf(logtext, "Number of JitCompiler Calls: %d", count_jit_calls);
376 sprintf(logtext, "Number of compiled Methods: %d", count_methods);
378 sprintf(logtext, "Number of max basic blocks per method: %d", count_max_basic_blocks);
380 sprintf(logtext, "Number of compiled basic blocks: %d", count_basic_blocks);
382 sprintf(logtext, "Number of max JavaVM-Instructions per method: %d", count_max_javainstr);
384 sprintf(logtext, "Number of compiled JavaVM-Instructions: %d", count_javainstr);
386 sprintf(logtext, "Size of compiled JavaVM-Instructions: %d(%d)", count_javacodesize,
387 count_javacodesize - count_methods * 18);
389 sprintf(logtext, "Size of compiled Exception Tables: %d", count_javaexcsize);
391 sprintf(logtext, "Value of extended instruction set var: %d", has_ext_instr_set);
393 sprintf(logtext, "Number of Machine-Instructions: %d", count_code_len >> 2);
395 sprintf(logtext, "Number of Spills: %d", count_spills);
397 sprintf(logtext, "Number of Activ Pseudocommands: %5d", count_pcmd_activ);
399 sprintf(logtext, "Number of Drop Pseudocommands: %5d", count_pcmd_drop);
401 sprintf(logtext, "Number of Const Pseudocommands: %5d (zero:%5d)", count_pcmd_load, count_pcmd_zero);
403 sprintf(logtext, "Number of ConstAlu Pseudocommands: %5d (cmp: %5d, store:%5d)", count_pcmd_const_alu, count_pcmd_const_bra, count_pcmd_const_store);
405 sprintf(logtext, "Number of Move Pseudocommands: %5d", count_pcmd_move);
407 sprintf(logtext, "Number of Load Pseudocommands: %5d", count_load_instruction);
409 sprintf(logtext, "Number of Store Pseudocommands: %5d (combined: %5d)", count_pcmd_store, count_pcmd_store - count_pcmd_store_comb);
411 sprintf(logtext, "Number of OP Pseudocommands: %5d", count_pcmd_op);
413 sprintf(logtext, "Number of DUP Pseudocommands: %5d", count_dup_instruction);
415 sprintf(logtext, "Number of Mem Pseudocommands: %5d", count_pcmd_mem);
417 sprintf(logtext, "Number of Method Pseudocommands: %5d", count_pcmd_met);
419 sprintf(logtext, "Number of Branch Pseudocommands: %5d (rets:%5d, Xrets: %5d)",
420 count_pcmd_bra, count_pcmd_return, count_pcmd_returnx);
422 sprintf(logtext, "Number of Table Pseudocommands: %5d", count_pcmd_table);
424 sprintf(logtext, "Number of Useful Pseudocommands: %5d", count_pcmd_table +
425 count_pcmd_bra + count_pcmd_load + count_pcmd_mem + count_pcmd_op);
427 sprintf(logtext, "Number of Null Pointer Checks: %5d", count_check_null);
429 sprintf(logtext, "Number of Array Bound Checks: %5d", count_check_bound);
431 sprintf(logtext, "Number of Try-Blocks: %d", count_tryblocks);
433 sprintf(logtext, "Maximal count of stack elements: %d", count_max_new_stack);
435 sprintf(logtext, "Upper bound of max stack elements: %d", count_upper_bound_new_stack);
437 sprintf(logtext, "Distribution of stack sizes at block boundary");
439 sprintf(logtext, " 0 1 2 3 4 5 6 7 8 9 >=10");
441 sprintf(logtext, "%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d", count_block_stack[0],
442 count_block_stack[1], count_block_stack[2], count_block_stack[3], count_block_stack[4],
443 count_block_stack[5], count_block_stack[6], count_block_stack[7], count_block_stack[8],
444 count_block_stack[9], count_block_stack[10]);
446 sprintf(logtext, "Distribution of store stack depth");
448 sprintf(logtext, " 0 1 2 3 4 5 6 7 8 9 >=10");
450 sprintf(logtext, "%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d", count_store_depth[0],
451 count_store_depth[1], count_store_depth[2], count_store_depth[3], count_store_depth[4],
452 count_store_depth[5], count_store_depth[6], count_store_depth[7], count_store_depth[8],
453 count_store_depth[9], count_store_depth[10]);
455 sprintf(logtext, "Distribution of store creator chains first part");
457 sprintf(logtext, " 0 1 2 3 4 5 6 7 8 9 ");
459 sprintf(logtext, "%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d", count_store_length[0],
460 count_store_length[1], count_store_length[2], count_store_length[3], count_store_length[4],
461 count_store_length[5], count_store_length[6], count_store_length[7], count_store_length[8],
462 count_store_length[9]);
464 sprintf(logtext, "Distribution of store creator chains second part");
466 sprintf(logtext, " 10 11 12 13 14 15 16 17 18 19 >=20");
468 sprintf(logtext, "%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d", count_store_length[10],
469 count_store_length[11], count_store_length[12], count_store_length[13], count_store_length[14],
470 count_store_length[15], count_store_length[16], count_store_length[17], count_store_length[18],
471 count_store_length[19], count_store_length[20]);
473 sprintf(logtext, "Distribution of analysis iterations");
475 sprintf(logtext, " 1 2 3 4 >=5");
477 sprintf(logtext, "%5d%5d%5d%5d%5d", count_analyse_iterations[0], count_analyse_iterations[1],
478 count_analyse_iterations[2], count_analyse_iterations[3], count_analyse_iterations[4]);
480 sprintf(logtext, "Distribution of basic blocks per method");
482 sprintf(logtext, " <= 5 <=10 <=15 <=20 <=30 <=40 <=50 <=75 >75");
484 sprintf(logtext, "%5d%5d%5d%5d%5d%5d%5d%5d%5d", count_method_bb_distribution[0],
485 count_method_bb_distribution[1], count_method_bb_distribution[2], count_method_bb_distribution[3],
486 count_method_bb_distribution[4], count_method_bb_distribution[5], count_method_bb_distribution[6],
487 count_method_bb_distribution[7], count_method_bb_distribution[8]);
489 sprintf(logtext, "Distribution of basic block sizes");
492 " 0 1 2 3 4 5 6 7 8 9 <13 <15 <17 <19 <21 <26 <31 >30");
494 sprintf(logtext, "%3d%5d%5d%5d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d",
495 count_block_size_distribution[0], count_block_size_distribution[1], count_block_size_distribution[2],
496 count_block_size_distribution[3], count_block_size_distribution[4], count_block_size_distribution[5],
497 count_block_size_distribution[6], count_block_size_distribution[7], count_block_size_distribution[8],
498 count_block_size_distribution[9], count_block_size_distribution[10], count_block_size_distribution[11],
499 count_block_size_distribution[12], count_block_size_distribution[13], count_block_size_distribution[14],
500 count_block_size_distribution[15], count_block_size_distribution[16], count_block_size_distribution[17]);
502 sprintf(logtext, "Size of Code Area (Kb): %10.3f", (float) count_code_len / 1024);
504 sprintf(logtext, "Size of data Area (Kb): %10.3f", (float) count_data_len / 1024);
506 sprintf(logtext, "Size of Class Infos (Kb):%10.3f", (float) (count_class_infos) / 1024);
508 sprintf(logtext, "Size of Const Pool (Kb): %10.3f", (float) (count_const_pool_len + count_utf_len) / 1024);
510 sprintf(logtext, "Size of Vftbl (Kb): %10.3f", (float) count_vftbl_len / 1024);
512 sprintf(logtext, "Size of comp stub (Kb): %10.3f", (float) count_cstub_len / 1024);
514 sprintf(logtext, "Size of native stub (Kb):%10.3f", (float) count_nstub_len / 1024);
516 sprintf(logtext, "Size of Utf (Kb): %10.3f", (float) count_utf_len / 1024);
518 sprintf(logtext, "Size of VMCode (Kb): %10.3f(%d)", (float) count_vmcode_len / 1024,
519 count_vmcode_len - 18 * count_all_methods);
521 sprintf(logtext, "Size of ExTable (Kb): %10.3f", (float) count_extable_len / 1024);
523 sprintf(logtext, "Number of class loads: %d", count_class_loads);
525 sprintf(logtext, "Number of class inits: %d", count_class_inits);
527 sprintf(logtext, "Number of loaded Methods: %d\n\n", count_all_methods);
530 sprintf(logtext, "Calls of utf_new: %22d", count_utf_new);
532 sprintf(logtext, "Calls of utf_new (element found): %6d\n\n", count_utf_new_found);
537 #ifdef TYPECHECK_STATISTICS
538 void typecheck_print_statistics(FILE *file);
543 * void exit_handler(void)
544 * -----------------------
545 * The exit_handler function is called upon program termination to shutdown
546 * the various subsystems and release the resources allocated to the VM.
548 void exit_handler(void)
550 /********************* Print debug tables ************************/
552 if (showmethods) class_showmethods(mainclass);
553 if (showconstantpool) class_showconstantpool(mainclass);
554 if (showutf) utf_show();
556 #if defined(USE_THREADS) && !defined(NATIVE_THREADS)
557 clear_thread_flags(); /* restores standard file descriptor
561 /************************ Free all resources *******************/
563 /*heap_close();*/ /* must be called before compiler_close and
564 loader_close because finalization occurs
568 tables_close(literalstring_free);
570 if (verbose || getcompilingtime || opt_stat) {
571 log_text("CACAO terminated");
574 #ifdef TYPECHECK_STATISTICS
575 typecheck_print_statistics(get_logfile());
578 if (getcompilingtime)
585 /************************** Function: main *******************************
589 **************************************************************************/
591 int main(int argc, char **argv)
596 /********** interne (nur fuer main relevante Optionen) **************/
598 char logfilename[200] = "";
599 u4 heapmaxsize = 64 * 1024 * 1024;
600 u4 heapstartsize = 200 * 1024;
602 char classpath[500] = ".";
604 char *specificmethodname = NULL;
605 char *specificsignature = NULL;
607 #if defined(USE_THREADS) && !defined(NATIVE_THREADS)
608 stackbottom = &dummy;
611 if (0 != atexit(exit_handler))
612 throw_cacao_exception_exit(string_java_lang_InternalError,
613 "unable to register exit_handler");
616 /************ Collect info from the environment ************************/
618 cp = getenv("CLASSPATH");
620 strcpy(classpath, cp);
623 /***************** Interpret the command line *****************/
628 while ((i = get_opt(argc, argv)) != OPT_DONE) {
630 case OPT_IGNORE: break;
633 strcpy(classpath + strlen(classpath), ":");
634 strcpy(classpath + strlen(classpath), opt_arg);
640 int l = strlen(opt_arg);
641 for (n = 0; n < l; n++) {
642 if (opt_arg[n] == '=') {
644 attach_property(opt_arg, opt_arg + n + 1);
657 if (opt_arg[strlen(opt_arg) - 1] == 'k') {
658 j = 1024 * atoi(opt_arg);
660 } else if (opt_arg[strlen(opt_arg) - 1] == 'm') {
661 j = 1024 * 1024 * atoi(opt_arg);
663 } else j = atoi(opt_arg);
665 if (i == OPT_MX) heapmaxsize = j;
666 else heapstartsize = j;
678 compileverbose = true;
681 case OPT_VERBOSEEXCEPTION:
682 verboseexception = true;
686 collectverbose = true;
689 #ifdef TYPECHECK_VERBOSE
691 typecheckverbose = true;
695 case OPT_VERBOSECALL:
708 opt_liberalutf = true;
716 getcompilingtime = true;
717 getloadingtime = true;
725 strcpy(logfilename, opt_arg);
729 for (j = 0; j < strlen(opt_arg); j++) {
730 switch (opt_arg[j]) {
746 makeinitializations = false;
755 specificmethodname = opt_arg;
756 makeinitializations = false;
760 specificsignature = opt_arg;
766 makeinitializations = false;
769 case OPT_SHOW: /* Display options */
770 for (j = 0; j < strlen(opt_arg); j++) {
771 switch (opt_arg[j]) {
773 showdisassemble = true;
777 showconstantpool = true;
780 showddatasegment = true;
783 showintermediate = true;
784 compileverbose = true;
804 for (j = 0; j < strlen(opt_arg); j++) {
805 switch (opt_arg[j]) {
810 inlinevirtuals = true;
813 inlineexceptions = true;
816 inlineparamopt = true;
819 inlineoutsiders = true;
833 opt_xta = false; /**not yet **/
837 /***opt_vta = true; not yet **/
847 if (opt_ind >= argc) {
852 mainstring = argv[opt_ind++];
853 for (i = strlen(mainstring) - 1; i >= 0; i--) { /* Transform dots into slashes */
854 if (mainstring[i] == '.') mainstring[i] = '/'; /* in the class name */
858 /**************************** Program start *****************************/
860 log_init(logfilename);
862 log_text("CACAO started -------------------------------------------------------");
864 /* initialize the garbage collector */
865 gc_init(heapmaxsize, heapstartsize);
867 native_setclasspath(classpath);
870 suck_init(classpath);
872 #if defined(USE_THREADS) && defined(NATIVE_THREADS)
876 loader_init((u1 *) &dummy);
878 native_loadclasses();
882 #if defined(USE_THREADS)
883 initThreads((u1*) &dummy);
887 /************************* Start worker routines ********************/
890 methodinfo *mainmethod;
893 /* create, load and link the main class */
894 mainclass = class_new(utf_new_char(mainstring));
896 if (!class_load(mainclass))
897 throw_exception_exit();
899 if (!class_link(mainclass))
900 throw_exception_exit();
902 mainmethod = class_resolveclassmethod(mainclass,
903 utf_new_char("main"),
904 utf_new_char("([Ljava/lang/String;)V"),
908 /* problems with main method? */
909 /* if (*exceptionptr) */
910 /* throw_exception_exit(); */
912 /* there is no main method or it isn't static */
913 if (!mainmethod || !(mainmethod->flags & ACC_STATIC)) {
915 new_exception_message(string_java_lang_NoSuchMethodError,
917 throw_exception_exit();
920 a = builtin_anewarray(argc - opt_ind, class_java_lang_String);
921 for (i = opt_ind; i < argc; i++) {
922 a->data[i - opt_ind] =
923 (java_objectheader *) javastring_new(utf_new_char(argv[i]));
926 #ifdef TYPEINFO_DEBUG_TEST
927 /* test the typeinfo system */
930 /*class_showmethods(currentThread->group->header.vftbl->class); */
932 *threadrootmethod = mainmethod;
935 asm_calljavafunction(mainmethod, a, NULL, NULL, NULL);
937 /* exception occurred? */
939 throw_exception_exit();
941 #if defined(USE_THREADS)
942 #if defined(NATIVE_THREADS)
945 killThread(currentThread);
949 /* now exit the JavaVM */
954 /************* If requested, compile all methods ********************/
962 /* create all classes found in the classpath */
963 /* XXX currently only works with zip/jar's */
964 create_all_classes();
966 /* load and link all classes */
967 for (slot = 0; slot < class_hash.size; slot++) {
968 c = class_hash.ptr[slot];
977 /* compile all class methods */
978 for (i = 0; i < c->methodscount; i++) {
979 m = &(c->methods[i]);
981 (void) jit_compile(m);
991 /******** If requested, compile a specific method ***************/
993 if (specificmethodname) {
996 /* create, load and link the main class */
997 mainclass = class_new(utf_new_char(mainstring));
998 class_load(mainclass);
1001 throw_exception_exit();
1003 class_link(mainclass);
1006 throw_exception_exit();
1008 if (specificsignature) {
1009 m = class_resolveclassmethod(mainclass,
1010 utf_new_char(specificmethodname),
1011 utf_new_char(specificsignature),
1015 m = class_resolveclassmethod(mainclass,
1016 utf_new_char(specificmethodname),
1023 char message[MAXLOGTEXT];
1024 sprintf(message, "%s%s", specificmethodname,
1025 specificmethodname ? specificmethodname : "");
1028 new_exception_message(string_java_lang_NoSuchMethodException,
1031 throw_exception_exit();
1039 /* keep compiler happy */
1045 /* cacao_exit ******************************************************************
1047 Calls java.lang.Runtime.exit(I)V to exit the JavaVM correctly.
1049 *******************************************************************************/
1051 void cacao_exit(s4 status)
1055 java_lang_Runtime *rt;
1057 /* class should already be loaded, but who knows... */
1059 c = class_new(utf_new_char("java/lang/Runtime"));
1062 throw_exception_exit();
1065 throw_exception_exit();
1067 /* first call Runtime.getRuntime()Ljava.lang.Runtime; */
1069 m = class_resolveclassmethod(c,
1070 utf_new_char("getRuntime"),
1071 utf_new_char("()Ljava/lang/Runtime;"),
1072 class_java_lang_Object,
1076 throw_exception_exit();
1078 rt = (java_lang_Runtime *) asm_calljavafunction(m,
1084 /* exception occurred? */
1087 throw_exception_exit();
1089 /* then call Runtime.exit(I)V */
1091 m = class_resolveclassmethod(c,
1092 utf_new_char("exit"),
1093 utf_new_char("(I)V"),
1094 class_java_lang_Object,
1098 throw_exception_exit();
1100 asm_calljavafunction(m, rt, (void *) 0, NULL, NULL);
1102 /* this should never happen */
1104 throw_cacao_exception_exit(string_java_lang_InternalError,
1105 "Problems with Runtime.exit(I)V");
1109 /*************************** Shutdown function *********************************
1111 Terminates the system immediately without freeing memory explicitly (to be
1112 used only for abnormal termination)
1114 *******************************************************************************/
1116 void cacao_shutdown(s4 status)
1120 if (verbose || getcompilingtime || opt_stat) {
1121 log_text("CACAO terminated by shutdown");
1124 if (getcompilingtime)
1127 dolog("Exit status: %d\n", (int) status);
1135 * These are local overrides for various environment variables in Emacs.
1136 * Please do not remove this and leave it at the end of the file, where
1137 * Emacs will automagically detect them.
1138 * ---------------------------------------------------------------------
1141 * indent-tabs-mode: t