X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=main.c;h=db5e48b7764e84f7c74702248c913f5450372579;hb=7aeefe1d2b8656fdb344d344df42e606f992d6dd;hp=93437d43c830860f76114134cc3dfc7e75432d9c;hpb=b75612def6617163d9796ebac68349b822af20e2;p=cacao.git diff --git a/main.c b/main.c index 93437d43c..db5e48b77 100644 --- a/main.c +++ b/main.c @@ -1,53 +1,126 @@ -/* main.c ********************************************************************** +/* main.c - contains main() and variables for the global options - Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst + Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 + Institut f. Computersprachen, TU Wien + R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser, M. Probst, + S. Ring, E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, + J. Wenninger - See file COPYRIGHT for information on usage and disclaimer of warranties + This file is part of CACAO. - Contains main() and variables for the global options. - This module does the following tasks: - - Command line option handling - - Calling initialization routines - - Calling the class loader - - Running the main method + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2, or (at + your option) any later version. - Authors: Reinhard Grafl EMAIL: cacao@complang.tuwien.ac.at - Changes: Andi Krall EMAIL: cacao@complang.tuwien.ac.at - Mark Probst EMAIL: cacao@complang.tuwien.ac.at - Philipp Tomsich EMAIL: cacao@complang.tuwien.ac.at + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. - Last Change: $Id: main.c 467 2003-09-26 01:55:25Z didi $ + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. -*******************************************************************************/ + Contact: cacao@complang.tuwien.ac.at -#include "global.h" + Authors: Reinhard Grafl + + Changes: Andi Krall + Mark Probst + Philipp Tomsich + + This module does the following tasks: + - Command line option handling + - Calling initialization routines + - Calling the class loader + - Running the main method + + $Id: main.c 1009 2004-03-31 22:44:07Z edwin $ + +*/ + +#include +#include +#include "main.h" +#include "global.h" #include "tables.h" #include "loader.h" #include "jit.h" -#ifdef OLD_COMPILER -#include "compiler.h" -#endif - #include "asmpart.h" #include "builtin.h" #include "native.h" - +#include "mm/boehm.h" #include "threads/thread.h" +#include "toolbox/loging.h" +#include "toolbox/memory.h" +#include "parseRTstats.h" +#include "nat/java_lang_Throwable.h" -bool compileall = false; -int newcompiler = true; -bool verbose = false; -#ifdef NEW_GC -bool new_gc = false; +#ifdef TYPEINFO_DEBUG_TEST +#include "typeinfo.h" #endif -static bool showmethods = false; -static bool showconstantpool = false; -static bool showutf = false; +/* command line option */ + +bool verbose = false; +bool compileall = false; +bool runverbose = false; /* trace all method invocation */ +bool verboseexception = false; /* trace all method invocation */ +bool collectverbose = false; + +bool loadverbose = false; +bool linkverbose = false; +bool initverbose = false; + +bool opt_rt = false; /* true if RTA parse should be used RT-CO */ +bool opt_xta = false; /* true if XTA parse should be used XTA-CO */ +bool opt_vta = false; /* true if VTA parse should be used VTA-CO */ + +bool opt_liberalutf = false; /* Don't check overlong UTF-8 sequences */ + +bool showmethods = false; +bool showconstantpool = false; +bool showutf = false; + +bool compileverbose = false; /* trace compiler actions */ +bool showstack = false; +bool showdisassemble = false; /* generate disassembler listing */ +bool showddatasegment = false; /* generate data segment listing */ +bool showintermediate = false; /* generate intermediate code listing */ + +bool useinlining = false; /* use method inlining */ +bool inlinevirtuals = false; /* inline unique virtual methods */ +bool inlineexceptions = false; /* inline methods, that contain excptions */ +bool inlineparamopt = false; /* optimize parameter passing to inlined methods */ +bool inlineoutsiders = false; /* inline methods, that are not member of the invoker's class */ + +bool checkbounds = true; /* check array bounds */ +bool checknull = true; /* check null pointers */ +bool opt_noieee = false; /* don't implement ieee compliant floats */ +bool checksync = true; /* do synchronization */ +bool opt_loops = false; /* optimize array accesses in loops */ + +bool makeinitializations = true; + +bool getloadingtime = false; /* to measure the runtime */ +s8 loadingtime = 0; + +bool getcompilingtime = false; /* compute compile time */ +s8 compilingtime = 0; /* accumulated compile time */ + +int has_ext_instr_set = 0; /* has instruction set extensions */ + +bool statistics = false; + +bool opt_verify = true; /* true if classfiles should be verified */ + +char mainString[256]; static classinfo *topclass; -#ifndef USE_THREADS +#if defined(USE_THREADS) && !defined(NATIVE_THREADS) void **stackbottom = 0; #endif @@ -58,9 +131,9 @@ void **stackbottom = 0; ******************************************************************************/ -#define OPT_DONE -1 -#define OPT_ERROR 0 -#define OPT_IGNORE 1 +#define OPT_DONE -1 +#define OPT_ERROR 0 +#define OPT_IGNORE 1 #define OPT_CLASSPATH 2 #define OPT_D 3 @@ -70,7 +143,7 @@ void **stackbottom = 0; #define OPT_VERBOSE 7 #define OPT_VERBOSEGC 8 #define OPT_VERBOSECALL 9 -#define OPT_IEEE 10 +#define OPT_NOIEEE 10 #define OPT_SOFTNULL 11 #define OPT_TIME 12 #define OPT_STAT 13 @@ -81,18 +154,15 @@ void **stackbottom = 0; #define OPT_SIGNATURE 18 #define OPT_SHOW 19 #define OPT_ALL 20 -#ifdef OLD_COMPILER -#define OPT_OLD 21 -#endif -#ifdef NEW_GC -#define OPT_GC1 22 -#define OPT_GC2 23 -#endif #define OPT_OLOOP 24 #define OPT_INLINING 25 #define OPT_RT 26 #define OPT_XTA 27 - +#define OPT_VTA 28 +#define OPT_VERBOSETC 29 +#define OPT_NOVERIFY 30 +#define OPT_LIBERALUTF 31 +#define OPT_VERBOSEEXCEPTION 32 struct {char *name; bool arg; int value;} opts[] = { {"classpath", true, OPT_CLASSPATH}, @@ -100,14 +170,21 @@ struct {char *name; bool arg; int value;} opts[] = { {"ms", true, OPT_MS}, {"mx", true, OPT_MX}, {"noasyncgc", false, OPT_IGNORE}, - {"noverify", false, OPT_IGNORE}, + {"noverify", false, OPT_NOVERIFY}, + {"liberalutf", false, OPT_LIBERALUTF}, {"oss", true, OPT_IGNORE}, {"ss", true, OPT_IGNORE}, {"v", false, OPT_VERBOSE1}, {"verbose", false, OPT_VERBOSE}, {"verbosegc", false, OPT_VERBOSEGC}, {"verbosecall", false, OPT_VERBOSECALL}, - {"ieee", false, OPT_IEEE}, + {"verboseexception", false, OPT_VERBOSEEXCEPTION}, +#ifdef TYPECHECK_VERBOSE + {"verbosetc", false, OPT_VERBOSETC}, +#endif +#if defined(__ALPHA__) + {"noieee", false, OPT_NOIEEE}, +#endif {"softnull", false, OPT_SOFTNULL}, {"time", false, OPT_TIME}, {"stat", false, OPT_STAT}, @@ -118,24 +195,19 @@ struct {char *name; bool arg; int value;} opts[] = { {"sig", true, OPT_SIGNATURE}, {"s", true, OPT_SHOW}, {"all", false, OPT_ALL}, -#ifdef OLD_COMPILER - {"old", false, OPT_OLD}, -#endif -#ifdef NEW_GC - {"gc1", false, OPT_GC1}, - {"gc2", false, OPT_GC2}, -#endif {"oloop", false, OPT_OLOOP}, - {"i", true, OPT_INLINING}, + {"i", true, OPT_INLINING}, {"rt", false, OPT_RT}, {"xta", false, OPT_XTA}, + {"vta", false, OPT_VTA}, {NULL, false, 0} }; static int opt_ind = 1; static char *opt_arg; -static int get_opt (int argc, char **argv) + +static int get_opt(int argc, char **argv) { char *a; int i; @@ -145,15 +217,15 @@ static int get_opt (int argc, char **argv) a = argv[opt_ind]; if (a[0] != '-') return OPT_DONE; - for (i=0; opts[i].name; i++) { - if (! opts[i].arg) { - if (strcmp(a+1, opts[i].name) == 0) { /* boolean option found */ + for (i = 0; opts[i].name; i++) { + if (!opts[i].arg) { + if (strcmp(a + 1, opts[i].name) == 0) { /* boolean option found */ opt_ind++; return opts[i].value; } - } - else { - if (strcmp(a+1, opts[i].name) == 0) { /* parameter option found */ + + } else { + if (strcmp(a + 1, opts[i].name) == 0) { /* parameter option found */ opt_ind++; if (opt_ind < argc) { opt_arg = argv[opt_ind]; @@ -161,13 +233,13 @@ static int get_opt (int argc, char **argv) return opts[i].value; } return OPT_ERROR; - } - else { + + } else { size_t l = strlen(opts[i].name); - if (strlen(a+1) > l) { - if (memcmp (a+1, opts[i].name, l)==0) { + if (strlen(a + 1) > l) { + if (memcmp(a + 1, opts[i].name, l) == 0) { opt_ind++; - opt_arg = a+1+l; + opt_arg = a + 1 + l; return opts[i].value; } } @@ -189,51 +261,50 @@ Prints the correct usage syntax to stdout. static void print_usage() { - printf ("USAGE: cacao [options] classname [program arguments]\n"); - printf ("Options:\n"); - printf (" -classpath path ...... specify a path to look for classes\n"); - printf (" -Dpropertyname=value . add an entry to the property list\n"); - printf (" -mx maxmem[k|m] ...... specify the size for the heap\n"); - printf (" -ms initmem[k|m] ..... specify the initial size for the heap\n"); - printf (" -v ................... write state-information\n"); - printf (" -verbose ............. write more information\n"); - printf (" -verbosegc ........... write message for each GC\n"); - printf (" -verbosecall ......... write message for each call\n"); - printf (" -ieee ................ use ieee compliant arithmetic\n"); - printf (" -softnull ............ use software nullpointer check\n"); - printf (" -time ................ measure the runtime\n"); - printf (" -stat ................ detailed compiler statistics\n"); - printf (" -log logfile ......... specify a name for the logfile\n"); - printf (" -c(heck)b(ounds) ..... don't check array bounds\n"); - printf (" s(ync) ....... don't check for synchronization\n"); - printf (" -oloop ............... optimize array accesses in loops\n"); - printf (" -l ................... don't start the class after loading\n"); - printf (" -all ................. compile all methods, no execution\n"); -#ifdef OLD_COMPILER - printf (" -old ................. use old JIT compiler\n"); -#endif -#ifdef NEW_GC - printf (" -gc1 ................. use the old garbage collector (default)\n"); - printf (" -gc2 ................. use the new garbage collector\n"); + printf("USAGE: cacao [options] classname [program arguments]\n"); + printf("Options:\n"); + printf(" -classpath path ...... specify a path to look for classes\n"); + printf(" -Dpropertyname=value . add an entry to the property list\n"); + printf(" -mx maxmem[k|m] ...... specify the size for the heap\n"); + printf(" -ms initmem[k|m] ..... specify the initial size for the heap\n"); + printf(" -v ................... write state-information\n"); + printf(" -verbose ............. write more information\n"); + printf(" -verbosegc ........... write message for each GC\n"); + printf(" -verbosecall ......... write message for each call\n"); + printf(" -verboseexception .... write message for each step of stack unwinding\n"); +#ifdef TYPECHECK_VERBOSE + printf(" -verbosetc ........... write debug messages while typechecking\n"); #endif - printf (" -m ................... compile only a specific method\n"); - printf (" -sig ................. specify signature for a specific method\n"); - printf (" -s(how)a(ssembler) ... show disassembled listing\n"); - printf (" c(onstants) ... show the constant pool\n"); - printf (" d(atasegment).. show data segment listing\n"); - printf (" i(ntermediate). show intermediate representation\n"); - printf (" m(ethods)...... show class fields and methods\n"); -#ifdef OLD_COMPILER - printf (" s(tack) ....... show stack for every javaVM-command\n"); +#if defined(__ALPHA__) + printf(" -noieee .............. don't use ieee compliant arithmetic\n"); #endif - printf (" u(tf) ......... show the utf - hash\n"); - printf (" -i n ............. activate inlining\n"); - printf (" v ............. inline virtual methods\n"); - printf (" e ............. inline methods with exceptions\n"); - printf (" p ............. optimize argument renaming\n"); - printf (" o ............. inline methods of foreign classes\n"); - printf (" -rt .................. use rapid type analysis\n"); - printf (" -xta ................. use xta\n"); + printf(" -noverify ............ don't verify classfiles\n"); + printf(" -liberalutf........... don't warn about overlong UTF-8 sequences\n"); + printf(" -softnull ............ use software nullpointer check\n"); + printf(" -time ................ measure the runtime\n"); + printf(" -stat ................ detailed compiler statistics\n"); + printf(" -log logfile ......... specify a name for the logfile\n"); + printf(" -c(heck)b(ounds) ..... don't check array bounds\n"); + printf(" s(ync) ....... don't check for synchronization\n"); + printf(" -oloop ............... optimize array accesses in loops\n"); + printf(" -l ................... don't start the class after loading\n"); + printf(" -all ................. compile all methods, no execution\n"); + printf(" -m ................... compile only a specific method\n"); + printf(" -sig ................. specify signature for a specific method\n"); + printf(" -s(how)a(ssembler) ... show disassembled listing\n"); + printf(" c(onstants) ... show the constant pool\n"); + printf(" d(atasegment).. show data segment listing\n"); + printf(" i(ntermediate). show intermediate representation\n"); + printf(" m(ethods)...... show class fields and methods\n"); + printf(" u(tf) ......... show the utf - hash\n"); + printf(" -i n ............. activate inlining\n"); + printf(" v ............. inline virtual methods\n"); + printf(" e ............. inline methods with exceptions\n"); + printf(" p ............. optimize argument renaming\n"); + printf(" o ............. inline methods of foreign classes\n"); + printf(" -rt .................. use rapid type analysis\n"); + printf(" -xta ................. use x type analysis\n"); + printf(" -vta ................. use variable type analysis\n"); } @@ -246,21 +317,41 @@ static void print_usage() static void print_times() { - long int totaltime = getcputime(); - long int runtime = totaltime - loadingtime - compilingtime; - - sprintf (logtext, "Time for loading classes: %ld secs, %ld millis", - loadingtime / 1000000, (loadingtime % 1000000) / 1000); - dolog(); - sprintf (logtext, "Time for compiling code: %ld secs, %ld millis", - compilingtime / 1000000, (compilingtime % 1000000) / 1000); - dolog(); - sprintf (logtext, "Time for running program: %ld secs, %ld millis", - runtime / 1000000, (runtime % 1000000) / 1000); - dolog(); - sprintf (logtext, "Total time: %ld secs, %ld millis", - totaltime / 1000000, (totaltime % 1000000) / 1000); - dolog(); + s8 totaltime = getcputime(); + s8 runtime = totaltime - loadingtime - compilingtime; + char logtext[MAXLOGTEXT]; + +#if defined(__I386__) || defined(__POWERPC__) + sprintf(logtext, "Time for loading classes: %lld secs, %lld millis", +#else + sprintf(logtext, "Time for loading classes: %ld secs, %ld millis", +#endif + loadingtime / 1000000, (loadingtime % 1000000) / 1000); + log_text(logtext); + +#if defined(__I386__) || defined(__POWERPC__) + sprintf(logtext, "Time for compiling code: %lld secs, %lld millis", +#else + sprintf(logtext, "Time for compiling code: %ld secs, %ld millis", +#endif + compilingtime / 1000000, (compilingtime % 1000000) / 1000); + log_text(logtext); + +#if defined(__I386__) || defined(__POWERPC__) + sprintf(logtext, "Time for running program: %lld secs, %lld millis", +#else + sprintf(logtext, "Time for running program: %ld secs, %ld millis", +#endif + runtime / 1000000, (runtime % 1000000) / 1000); + log_text(logtext); + +#if defined(__I386__) || defined(__POWERPC__) + sprintf(logtext, "Total time: %lld secs, %lld millis", +#else + sprintf(logtext, "Total time: %ld secs, %ld millis", +#endif + totaltime / 1000000, (totaltime % 1000000) / 1000); + log_text(logtext); } @@ -276,238 +367,238 @@ static void print_times() static void print_stats() { - sprintf (logtext, "Number of JitCompiler Calls: %d", count_jit_calls); - dolog(); - sprintf (logtext, "Number of compiled Methods: %d", count_methods); - dolog(); - sprintf (logtext, "Number of max basic blocks per method: %d", count_max_basic_blocks); - dolog(); - sprintf (logtext, "Number of compiled basic blocks: %d", count_basic_blocks); - dolog(); - sprintf (logtext, "Number of max JavaVM-Instructions per method: %d", count_max_javainstr); - dolog(); - sprintf (logtext, "Number of compiled JavaVM-Instructions: %d", count_javainstr); - dolog(); - sprintf (logtext, "Size of compiled JavaVM-Instructions: %d(%d)", count_javacodesize, - count_javacodesize - count_methods * 18); - dolog(); - sprintf (logtext, "Size of compiled Exception Tables: %d", count_javaexcsize); - dolog(); - sprintf (logtext, "Value of extended instruction set var: %d", has_ext_instr_set); - dolog(); - sprintf (logtext, "Number of Machine-Instructions: %d", count_code_len >> 2); - dolog(); - sprintf (logtext, "Number of Spills: %d", count_spills); - dolog(); - sprintf (logtext, "Number of Activ Pseudocommands: %5d", count_pcmd_activ); - dolog(); - sprintf (logtext, "Number of Drop Pseudocommands: %5d", count_pcmd_drop); - dolog(); - sprintf (logtext, "Number of Const Pseudocommands: %5d (zero:%5d)", count_pcmd_load, count_pcmd_zero); - dolog(); - sprintf (logtext, "Number of ConstAlu Pseudocommands: %5d (cmp: %5d, store:%5d)", count_pcmd_const_alu, count_pcmd_const_bra, count_pcmd_const_store); - dolog(); - sprintf (logtext, "Number of Move Pseudocommands: %5d", count_pcmd_move); - dolog(); - sprintf (logtext, "Number of Load Pseudocommands: %5d", count_load_instruction); - dolog(); - sprintf (logtext, "Number of Store Pseudocommands: %5d (combined: %5d)", count_pcmd_store, count_pcmd_store - count_pcmd_store_comb); - dolog(); - sprintf (logtext, "Number of OP Pseudocommands: %5d", count_pcmd_op); - dolog(); - sprintf (logtext, "Number of DUP Pseudocommands: %5d", count_dup_instruction); - dolog(); - sprintf (logtext, "Number of Mem Pseudocommands: %5d", count_pcmd_mem); - dolog(); - sprintf (logtext, "Number of Method Pseudocommands: %5d", count_pcmd_met); - dolog(); - sprintf (logtext, "Number of Branch Pseudocommands: %5d (rets:%5d, Xrets: %5d)", - count_pcmd_bra, count_pcmd_return, count_pcmd_returnx); - dolog(); - sprintf (logtext, "Number of Table Pseudocommands: %5d", count_pcmd_table); - dolog(); - sprintf (logtext, "Number of Useful Pseudocommands: %5d", count_pcmd_table + - count_pcmd_bra + count_pcmd_load + count_pcmd_mem + count_pcmd_op); - dolog(); - sprintf (logtext, "Number of Null Pointer Checks: %5d", count_check_null); - dolog(); - sprintf (logtext, "Number of Array Bound Checks: %5d", count_check_bound); - dolog(); - sprintf (logtext, "Number of Try-Blocks: %d", count_tryblocks); - dolog(); - sprintf (logtext, "Maximal count of stack elements: %d", count_max_new_stack); - dolog(); - sprintf (logtext, "Upper bound of max stack elements: %d", count_upper_bound_new_stack); - dolog(); - sprintf (logtext, "Distribution of stack sizes at block boundary"); - dolog(); - sprintf (logtext, " 0 1 2 3 4 5 6 7 8 9 >=10"); - dolog(); - sprintf (logtext, "%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d", count_block_stack[0], - count_block_stack[1],count_block_stack[2],count_block_stack[3],count_block_stack[4], - count_block_stack[5],count_block_stack[6],count_block_stack[7],count_block_stack[8], - count_block_stack[9],count_block_stack[10]); - dolog(); - sprintf (logtext, "Distribution of store stack depth"); - dolog(); - sprintf (logtext, " 0 1 2 3 4 5 6 7 8 9 >=10"); - dolog(); - sprintf (logtext, "%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d", count_store_depth[0], - count_store_depth[1],count_store_depth[2],count_store_depth[3],count_store_depth[4], - count_store_depth[5],count_store_depth[6],count_store_depth[7],count_store_depth[8], - count_store_depth[9],count_store_depth[10]); - dolog(); - sprintf (logtext, "Distribution of store creator chains first part"); - dolog(); - sprintf (logtext, " 0 1 2 3 4 5 6 7 8 9 "); - dolog(); - sprintf (logtext, "%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d", count_store_length[0], - count_store_length[1],count_store_length[2],count_store_length[3],count_store_length[4], - count_store_length[5],count_store_length[6],count_store_length[7],count_store_length[8], - count_store_length[9]); - dolog(); - sprintf (logtext, "Distribution of store creator chains second part"); - dolog(); - sprintf (logtext, " 10 11 12 13 14 15 16 17 18 19 >=20"); - dolog(); - sprintf (logtext, "%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d", count_store_length[10], - count_store_length[11],count_store_length[12],count_store_length[13],count_store_length[14], - count_store_length[15],count_store_length[16],count_store_length[17],count_store_length[18], - count_store_length[19],count_store_length[20]); - dolog(); - sprintf (logtext, "Distribution of analysis iterations"); - dolog(); - sprintf (logtext, " 1 2 3 4 >=5"); - dolog(); - sprintf (logtext, "%5d%5d%5d%5d%5d", count_analyse_iterations[0],count_analyse_iterations[1], - count_analyse_iterations[2],count_analyse_iterations[3],count_analyse_iterations[4]); - dolog(); - sprintf (logtext, "Distribution of basic blocks per method"); - dolog(); - sprintf (logtext, " <= 5 <=10 <=15 <=20 <=30 <=40 <=50 <=75 >75"); - dolog(); - sprintf (logtext, "%5d%5d%5d%5d%5d%5d%5d%5d%5d", count_method_bb_distribution[0], - count_method_bb_distribution[1],count_method_bb_distribution[2],count_method_bb_distribution[3], - count_method_bb_distribution[4],count_method_bb_distribution[5],count_method_bb_distribution[6], - count_method_bb_distribution[7],count_method_bb_distribution[8]); - dolog(); - sprintf (logtext, "Distribution of basic block sizes"); - dolog(); - sprintf (logtext, - " 0 1 2 3 4 5 6 7 8 9 <13 <15 <17 <19 <21 <26 <31 >30"); - dolog(); - sprintf (logtext, "%3d%5d%5d%5d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d", - count_block_size_distribution[0], count_block_size_distribution[1], count_block_size_distribution[2], - count_block_size_distribution[3], count_block_size_distribution[4], count_block_size_distribution[5], - count_block_size_distribution[6], count_block_size_distribution[7], count_block_size_distribution[8], - count_block_size_distribution[9], count_block_size_distribution[10],count_block_size_distribution[11], - count_block_size_distribution[12],count_block_size_distribution[13],count_block_size_distribution[14], - count_block_size_distribution[15],count_block_size_distribution[16],count_block_size_distribution[17]); - dolog(); - sprintf (logtext, "Size of Code Area (Kb): %10.3f", (float) count_code_len / 1024); - dolog(); - sprintf (logtext, "Size of data Area (Kb): %10.3f", (float) count_data_len / 1024); - dolog(); - sprintf (logtext, "Size of Class Infos (Kb):%10.3f", (float) (count_class_infos) / 1024); - dolog(); - sprintf (logtext, "Size of Const Pool (Kb): %10.3f", (float) (count_const_pool_len + count_utf_len) / 1024); - dolog(); - sprintf (logtext, "Size of Vftbl (Kb): %10.3f", (float) count_vftbl_len / 1024); - dolog(); - sprintf (logtext, "Size of comp stub (Kb): %10.3f", (float) count_cstub_len / 1024); - dolog(); - sprintf (logtext, "Size of native stub (Kb):%10.3f", (float) count_nstub_len / 1024); - dolog(); - sprintf (logtext, "Size of Utf (Kb): %10.3f", (float) count_utf_len / 1024); - dolog(); - sprintf (logtext, "Size of VMCode (Kb): %10.3f(%d)", (float) count_vmcode_len / 1024, - count_vmcode_len - 18 * count_all_methods); - dolog(); - sprintf (logtext, "Size of ExTable (Kb): %10.3f", (float) count_extable_len / 1024); - dolog(); - sprintf (logtext, "Number of class loads: %d", count_class_loads); - dolog(); - sprintf (logtext, "Number of class inits: %d", count_class_inits); - dolog(); - sprintf (logtext, "Number of loaded Methods: %d\n\n", count_all_methods); - dolog(); - - sprintf (logtext, "Calls of utf_new: %22d", count_utf_new); - dolog(); - sprintf (logtext, "Calls of utf_new (element found): %6d\n\n", count_utf_new_found); - dolog(); + char logtext[MAXLOGTEXT]; + + sprintf(logtext, "Number of JitCompiler Calls: %d", count_jit_calls); + log_text(logtext); + sprintf(logtext, "Number of compiled Methods: %d", count_methods); + log_text(logtext); + sprintf(logtext, "Number of max basic blocks per method: %d", count_max_basic_blocks); + log_text(logtext); + sprintf(logtext, "Number of compiled basic blocks: %d", count_basic_blocks); + log_text(logtext); + sprintf(logtext, "Number of max JavaVM-Instructions per method: %d", count_max_javainstr); + log_text(logtext); + sprintf(logtext, "Number of compiled JavaVM-Instructions: %d", count_javainstr); + log_text(logtext); + sprintf(logtext, "Size of compiled JavaVM-Instructions: %d(%d)", count_javacodesize, + count_javacodesize - count_methods * 18); + log_text(logtext); + sprintf(logtext, "Size of compiled Exception Tables: %d", count_javaexcsize); + log_text(logtext); + sprintf(logtext, "Value of extended instruction set var: %d", has_ext_instr_set); + log_text(logtext); + sprintf(logtext, "Number of Machine-Instructions: %d", count_code_len >> 2); + log_text(logtext); + sprintf(logtext, "Number of Spills: %d", count_spills); + log_text(logtext); + sprintf(logtext, "Number of Activ Pseudocommands: %5d", count_pcmd_activ); + log_text(logtext); + sprintf(logtext, "Number of Drop Pseudocommands: %5d", count_pcmd_drop); + log_text(logtext); + sprintf(logtext, "Number of Const Pseudocommands: %5d (zero:%5d)", count_pcmd_load, count_pcmd_zero); + log_text(logtext); + sprintf(logtext, "Number of ConstAlu Pseudocommands: %5d (cmp: %5d, store:%5d)", count_pcmd_const_alu, count_pcmd_const_bra, count_pcmd_const_store); + log_text(logtext); + sprintf(logtext, "Number of Move Pseudocommands: %5d", count_pcmd_move); + log_text(logtext); + sprintf(logtext, "Number of Load Pseudocommands: %5d", count_load_instruction); + log_text(logtext); + sprintf(logtext, "Number of Store Pseudocommands: %5d (combined: %5d)", count_pcmd_store, count_pcmd_store - count_pcmd_store_comb); + log_text(logtext); + sprintf(logtext, "Number of OP Pseudocommands: %5d", count_pcmd_op); + log_text(logtext); + sprintf(logtext, "Number of DUP Pseudocommands: %5d", count_dup_instruction); + log_text(logtext); + sprintf(logtext, "Number of Mem Pseudocommands: %5d", count_pcmd_mem); + log_text(logtext); + sprintf(logtext, "Number of Method Pseudocommands: %5d", count_pcmd_met); + log_text(logtext); + sprintf(logtext, "Number of Branch Pseudocommands: %5d (rets:%5d, Xrets: %5d)", + count_pcmd_bra, count_pcmd_return, count_pcmd_returnx); + log_text(logtext); + sprintf(logtext, "Number of Table Pseudocommands: %5d", count_pcmd_table); + log_text(logtext); + sprintf(logtext, "Number of Useful Pseudocommands: %5d", count_pcmd_table + + count_pcmd_bra + count_pcmd_load + count_pcmd_mem + count_pcmd_op); + log_text(logtext); + sprintf(logtext, "Number of Null Pointer Checks: %5d", count_check_null); + log_text(logtext); + sprintf(logtext, "Number of Array Bound Checks: %5d", count_check_bound); + log_text(logtext); + sprintf(logtext, "Number of Try-Blocks: %d", count_tryblocks); + log_text(logtext); + sprintf(logtext, "Maximal count of stack elements: %d", count_max_new_stack); + log_text(logtext); + sprintf(logtext, "Upper bound of max stack elements: %d", count_upper_bound_new_stack); + log_text(logtext); + sprintf(logtext, "Distribution of stack sizes at block boundary"); + log_text(logtext); + sprintf(logtext, " 0 1 2 3 4 5 6 7 8 9 >=10"); + log_text(logtext); + sprintf(logtext, "%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d", count_block_stack[0], + count_block_stack[1], count_block_stack[2], count_block_stack[3], count_block_stack[4], + count_block_stack[5], count_block_stack[6], count_block_stack[7], count_block_stack[8], + count_block_stack[9], count_block_stack[10]); + log_text(logtext); + sprintf(logtext, "Distribution of store stack depth"); + log_text(logtext); + sprintf(logtext, " 0 1 2 3 4 5 6 7 8 9 >=10"); + log_text(logtext); + sprintf(logtext, "%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d", count_store_depth[0], + count_store_depth[1], count_store_depth[2], count_store_depth[3], count_store_depth[4], + count_store_depth[5], count_store_depth[6], count_store_depth[7], count_store_depth[8], + count_store_depth[9], count_store_depth[10]); + log_text(logtext); + sprintf(logtext, "Distribution of store creator chains first part"); + log_text(logtext); + sprintf(logtext, " 0 1 2 3 4 5 6 7 8 9 "); + log_text(logtext); + sprintf(logtext, "%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d", count_store_length[0], + count_store_length[1], count_store_length[2], count_store_length[3], count_store_length[4], + count_store_length[5], count_store_length[6], count_store_length[7], count_store_length[8], + count_store_length[9]); + log_text(logtext); + sprintf(logtext, "Distribution of store creator chains second part"); + log_text(logtext); + sprintf(logtext, " 10 11 12 13 14 15 16 17 18 19 >=20"); + log_text(logtext); + sprintf(logtext, "%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d%5d", count_store_length[10], + count_store_length[11], count_store_length[12], count_store_length[13], count_store_length[14], + count_store_length[15], count_store_length[16], count_store_length[17], count_store_length[18], + count_store_length[19], count_store_length[20]); + log_text(logtext); + sprintf(logtext, "Distribution of analysis iterations"); + log_text(logtext); + sprintf(logtext, " 1 2 3 4 >=5"); + log_text(logtext); + sprintf(logtext, "%5d%5d%5d%5d%5d", count_analyse_iterations[0], count_analyse_iterations[1], + count_analyse_iterations[2], count_analyse_iterations[3], count_analyse_iterations[4]); + log_text(logtext); + sprintf(logtext, "Distribution of basic blocks per method"); + log_text(logtext); + sprintf(logtext, " <= 5 <=10 <=15 <=20 <=30 <=40 <=50 <=75 >75"); + log_text(logtext); + sprintf(logtext, "%5d%5d%5d%5d%5d%5d%5d%5d%5d", count_method_bb_distribution[0], + count_method_bb_distribution[1], count_method_bb_distribution[2], count_method_bb_distribution[3], + count_method_bb_distribution[4], count_method_bb_distribution[5], count_method_bb_distribution[6], + count_method_bb_distribution[7], count_method_bb_distribution[8]); + log_text(logtext); + sprintf(logtext, "Distribution of basic block sizes"); + log_text(logtext); + sprintf(logtext, + " 0 1 2 3 4 5 6 7 8 9 <13 <15 <17 <19 <21 <26 <31 >30"); + log_text(logtext); + sprintf(logtext, "%3d%5d%5d%5d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d%4d", + count_block_size_distribution[0], count_block_size_distribution[1], count_block_size_distribution[2], + count_block_size_distribution[3], count_block_size_distribution[4], count_block_size_distribution[5], + count_block_size_distribution[6], count_block_size_distribution[7], count_block_size_distribution[8], + count_block_size_distribution[9], count_block_size_distribution[10], count_block_size_distribution[11], + count_block_size_distribution[12], count_block_size_distribution[13], count_block_size_distribution[14], + count_block_size_distribution[15], count_block_size_distribution[16], count_block_size_distribution[17]); + log_text(logtext); + sprintf(logtext, "Size of Code Area (Kb): %10.3f", (float) count_code_len / 1024); + log_text(logtext); + sprintf(logtext, "Size of data Area (Kb): %10.3f", (float) count_data_len / 1024); + log_text(logtext); + sprintf(logtext, "Size of Class Infos (Kb):%10.3f", (float) (count_class_infos) / 1024); + log_text(logtext); + sprintf(logtext, "Size of Const Pool (Kb): %10.3f", (float) (count_const_pool_len + count_utf_len) / 1024); + log_text(logtext); + sprintf(logtext, "Size of Vftbl (Kb): %10.3f", (float) count_vftbl_len / 1024); + log_text(logtext); + sprintf(logtext, "Size of comp stub (Kb): %10.3f", (float) count_cstub_len / 1024); + log_text(logtext); + sprintf(logtext, "Size of native stub (Kb):%10.3f", (float) count_nstub_len / 1024); + log_text(logtext); + sprintf(logtext, "Size of Utf (Kb): %10.3f", (float) count_utf_len / 1024); + log_text(logtext); + sprintf(logtext, "Size of VMCode (Kb): %10.3f(%d)", (float) count_vmcode_len / 1024, + count_vmcode_len - 18 * count_all_methods); + log_text(logtext); + sprintf(logtext, "Size of ExTable (Kb): %10.3f", (float) count_extable_len / 1024); + log_text(logtext); + sprintf(logtext, "Number of class loads: %d", count_class_loads); + log_text(logtext); + sprintf(logtext, "Number of class inits: %d", count_class_inits); + log_text(logtext); + sprintf(logtext, "Number of loaded Methods: %d\n\n", count_all_methods); + log_text(logtext); + + sprintf(logtext, "Calls of utf_new: %22d", count_utf_new); + log_text(logtext); + sprintf(logtext, "Calls of utf_new (element found): %6d\n\n", count_utf_new_found); + log_text(logtext); } /********** Function: class_compile_methods (debugging only) ********/ -void class_compile_methods () +void class_compile_methods() { int i; classinfo *c; methodinfo *m; - c = list_first (&linkedclasses); + c = list_first(&linkedclasses); while (c) { for (i = 0; i < c -> methodscount; i++) { m = &(c->methods[i]); if (m->jcode) { -#ifdef OLD_COMPILER - if (newcompiler) -#endif - (void) jit_compile(m); -#ifdef OLD_COMPILER - else - (void) compiler_compile(m); -#endif - } + (void) jit_compile(m); } - c = list_next (&linkedclasses, c); } + c = list_next(&linkedclasses, c); + } } +#ifdef TYPECHECK_STATISTICS +void typecheck_print_statistics(FILE *file); +#endif + /* * void exit_handler(void) * ----------------------- * The exit_handler function is called upon program termination to shutdown * the various subsystems and release the resources allocated to the VM. */ - void exit_handler(void) { /********************* Print debug tables ************************/ - if (showmethods) class_showmethods (topclass); - if (showconstantpool) class_showconstantpool (topclass); - if (showutf) utf_show (); + if (showmethods) class_showmethods(topclass); + if (showconstantpool) class_showconstantpool(topclass); + if (showutf) utf_show(); -#ifdef USE_THREADS +#if defined(USE_THREADS) && !defined(NATIVE_THREADS) clear_thread_flags(); /* restores standard file descriptor - flags */ + flags */ #endif /************************ Free all resources *******************/ - heap_close (); /* must be called before compiler_close and - loader_close because finalization occurs - here */ + heap_close(); /* must be called before compiler_close and + loader_close because finalization occurs + here */ -#ifdef OLD_COMPILER - compiler_close (); -#endif - loader_close (); - tables_close ( literalstring_free ); + loader_close(); + tables_close(literalstring_free); if (verbose || getcompilingtime || statistics) { - log_text ("CACAO terminated"); - if (statistics) - print_stats (); + log_text("CACAO terminated"); + if (statistics) { + print_stats(); +#ifdef TYPECHECK_STATISTICS + typecheck_print_statistics(get_logfile()); +#endif + } if (getcompilingtime) - print_times (); + print_times(); mem_usagelog(1); } } + /************************** Function: main ******************************* The main program. @@ -516,22 +607,21 @@ void exit_handler(void) int main(int argc, char **argv) { - s4 i,j; + s4 i, j; char *cp; - java_objectheader *local_exceptionptr = 0; void *dummy; /********** interne (nur fuer main relevante Optionen) **************/ char logfilename[200] = ""; - u4 heapsize = 64000000; + u4 heapmaxsize = 64000000; u4 heapstartsize = 200000; - char classpath[500] = ".:/usr/local/lib/java/classes"; + char classpath[500] = "."; bool startit = true; char *specificmethodname = NULL; char *specificsignature = NULL; -#ifndef USE_THREADS +#if defined(USE_THREADS) && !defined(NATIVE_THREADS) stackbottom = &dummy; #endif @@ -540,33 +630,33 @@ int main(int argc, char **argv) /************ Collect info from the environment ************************/ - cp = getenv ("CLASSPATH"); + cp = getenv("CLASSPATH"); if (cp) { - strcpy (classpath, cp); + strcpy(classpath, cp); } /***************** Interpret the command line *****************/ checknull = false; - checkfloats = false; - - while ( (i = get_opt(argc,argv)) != OPT_DONE) { + opt_noieee = false; + while ((i = get_opt(argc, argv)) != OPT_DONE) { switch (i) { case OPT_IGNORE: break; case OPT_CLASSPATH: - strcpy (classpath + strlen(classpath), ":"); - strcpy (classpath + strlen(classpath), opt_arg); + strcpy(classpath + strlen(classpath), ":"); + strcpy(classpath + strlen(classpath), opt_arg); break; case OPT_D: { - int n,l=strlen(opt_arg); - for (n=0; n= argc) { - print_usage (); + print_usage(); exit(10); } + cp = argv[opt_ind++]; + for (i = strlen(cp) - 1; i >= 0; i--) { /* Transform dots into slashes */ + if (cp[i] == '.') cp[i] = '/'; /* in the class name */ + } + + strcpy(mainString,cp); - /**************************** Program start *****************************/ - log_init (logfilename); + /**************************** Program start *****************************/ + log_init(logfilename); if (verbose) { - log_text ( - "CACAO started -------------------------------------------------------"); + log_text("CACAO started -------------------------------------------------------"); } - - suck_init (classpath); - native_setclasspath (classpath); + + /* initalize the gc heap */ + heap_init(heapmaxsize, heapstartsize); + + native_setclasspath(classpath); tables_init(); - heap_init(heapsize, heapstartsize, &dummy); -#ifdef OLD_COMPILER - compiler_init(); -#endif + suck_init(classpath); + jit_init(); - loader_init(); - native_loadclasses (); +#if defined(USE_THREADS) && defined(NATIVE_THREADS) + initThreadsEarly(); +#endif + loader_init((u1 *) &dummy); - /*********************** Load JAVA classes ***************************/ - - cp = argv[opt_ind++]; - for (i=strlen(cp)-1; i>=0; i--) { /* Transform dots into slashes */ - if (cp[i]=='.') cp[i]='/'; /* in the class name */ - } + native_loadclasses(); - topclass = loader_load ( utf_new_char (cp) ); + /* initialize the garbage collector */ + gc_init(); - if (exceptionptr != 0) - { - printf ("#### Class loader has thrown: "); - utf_display (exceptionptr->vftbl->class->name); - printf ("\n"); +#if defined(USE_THREADS) + initThreads((u1*) &dummy); +#endif - exceptionptr = 0; - } + /*********************** Load JAVA classes ***************************/ + + /*printf("-------------------->%s\n",cp);*/ + topclass = loader_load(utf_new_char(cp)); + /*class_showmethods(topclass); */ - if (topclass == 0) - { - printf("#### Could not find top class - exiting\n"); - exit(1); + if (*exceptionptr) { + throw_exception_exit(); } + /* initialize the garbage collector */ gc_init(); -#ifdef USE_THREADS - initThreads((u1*)&dummy); /* schani */ +#if defined(USE_THREADS) && !defined(NATIVE_THREADS) + initThreads((u1*) &dummy); #endif + /************************* Start worker routines ********************/ if (startit) { methodinfo *mainmethod; java_objectarray *a; - heap_addreference((void**) &a); +/* heap_addreference((void**) &a); */ - mainmethod = class_findmethod ( - topclass, - utf_new_char ("main"), - utf_new_char ("([Ljava/lang/String;)V") - ); - if (!mainmethod) panic ("Can not find method 'void main(String[])'"); - if ((mainmethod->flags & ACC_STATIC) != ACC_STATIC) panic ("main is not static!"); - - a = builtin_anewarray (argc - opt_ind, class_java_lang_String); - for (i=opt_ind; idata[i-opt_ind] = javastring_new (utf_new_char (argv[i]) ); + mainmethod = class_resolveclassmethod(topclass, + utf_new_char("main"), + utf_new_char("([Ljava/lang/String;)V"), + topclass, + true + ); + + /* there is no main method or it isn't static */ + if (!mainmethod || !(mainmethod->flags & ACC_STATIC)) { + printf("Exception in thread \"main\" java.lang.NoSuchMethodError: main\n"); + exit(1); } - local_exceptionptr = asm_calljavamethod (mainmethod, a, NULL,NULL,NULL ); - - if (local_exceptionptr) { - printf ("#### Program has thrown: "); - utf_display (local_exceptionptr->vftbl->class->name); - printf ("\n"); + + a = builtin_anewarray(argc - opt_ind, class_java_lang_String); + for (i = opt_ind; i < argc; i++) { + a->data[i - opt_ind] = + (java_objectheader *) javastring_new(utf_new_char(argv[i])); } - /*RTAprint*/ if ((pCallgraph >= 1) && (opt_rt)) { - /*RTAprint*/ printCallgraph (); } - /*RTprint*/ if ((pClassHeir >= 1) && (opt_rt)) { - /*RTprint*/ printf("Last RTA Class Heirarchy -"); - /*RTprint*/ printRThierarchyInfo(mainmethod); - /*RTprint*/ } - /*RTprint*/ printObjectClassHeirarchy1( ); +#ifdef TYPEINFO_DEBUG_TEST + /* test the typeinfo system */ + typeinfo_test(); +#endif + /*class_showmethods(currentThread->group->header.vftbl->class); */ + *threadrootmethod = mainmethod; -#ifdef USE_THREADS - killThread(currentThread); -#endif + /* here we go... */ + asm_calljavafunction(mainmethod, a, NULL, NULL, NULL); + + if (*exceptionptr) { + methodinfo *main_unhandled_print = + class_resolvemethod_approx((*exceptionptr)->vftbl->class, + utf_new_char("printStackTrace"), + utf_new_char("()V")); + + if (main_unhandled_print) { + java_objectheader *exo = *exceptionptr; + *exceptionptr = NULL; + asm_calljavafunction(main_unhandled_print, exo, NULL, NULL, NULL); + + } else { + java_lang_String *msg; + + printf("Exception in thread \"main\" "); + utf_display_classname((*exceptionptr)->vftbl->class->name); + + /* do we have a detail message? */ + msg = ((java_lang_Throwable *) *exceptionptr)->detailMessage; + if (msg) { + printf(": "); + utf_display(javastring_toutf(msg, false)); + } + printf("\n"); + } + } + +#if defined(USE_THREADS) +#if defined(NATIVE_THREADS) + joinAllThreads(); +#else + killThread(currentThread); fprintf(stderr, "still here\n"); +#endif +#endif + exit(0); } /************* If requested, compile all methods ********************/ @@ -848,22 +1003,20 @@ int main(int argc, char **argv) if (specificmethodname) { methodinfo *m; - if (specificsignature) + if (specificsignature) { m = class_findmethod(topclass, utf_new_char(specificmethodname), utf_new_char(specificsignature)); - else + } else { m = class_findmethod(topclass, - utf_new_char(specificmethodname), NULL); - if (!m) panic ("Specific method not found"); -#ifdef OLD_COMPILER - if (newcompiler) -#endif - (void) jit_compile(m); -#ifdef OLD_COMPILER - else - (void) compiler_compile(m); -#endif + utf_new_char(specificmethodname), + NULL); + } + + if (!m) + panic("Specific method not found"); + + jit_compile(m); } exit(0); @@ -880,23 +1033,17 @@ int main(int argc, char **argv) void cacao_shutdown(s4 status) { - /*RTAprint*/ if ((pCallgraph >= 1) && (opt_rt)) { - /*RTAprint*/ printCallgraph (NULL); } - - /*RTprint*/ if ((pClassHeir >= 1) && (opt_rt)) { - /*RTprint*/ printf("Last RTA Class Heirarchy -"); - /*RTprint*/ printRThierarchyInfo(NULL); } + /**** RTAprint ***/ if (verbose || getcompilingtime || statistics) { log_text ("CACAO terminated by shutdown"); if (statistics) - print_stats (); + print_stats(); if (getcompilingtime) - print_times (); + print_times(); mem_usagelog(0); - sprintf (logtext, "Exit status: %d\n", (int) status); - dolog(); - } + dolog("Exit status: %d\n", (int) status); + } exit(status); }