- Calling the class loader
- Running the main method
- $Id: main.c 696 2003-12-06 20:10:05Z edwin $
+ $Id: main.c 862 2004-01-06 23:42:01Z stefan $
*/
#include "toolbox/memory.h"
#include "parseRTstats.h"
#include "typeinfo.h" /* XXX remove debug */
+#include "nat/java_lang_Throwable.h"
+
+
+/* command line option */
-bool compileall = false;
bool verbose = false;
-bool runverbose = false;
+bool compileall = false;
+bool runverbose = 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 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 */
+
-static bool showmethods = false;
-static bool showconstantpool = false;
-static bool showutf = false;
static classinfo *topclass;
#ifndef USE_THREADS
#define OPT_XTA 27
#define OPT_VTA 28
#define OPT_VERBOSETC 29
+#define OPT_NOVERIFY 30
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},
{"oss", true, OPT_IGNORE},
{"ss", true, OPT_IGNORE},
{"v", false, OPT_VERBOSE1},
#if defined(__ALPHA__)
printf(" -noieee .............. don't use ieee compliant arithmetic\n");
#endif
+ printf(" -noverify ............ don't verify classfiles\n");
printf(" -softnull ............ use software nullpointer check\n");
printf(" -time ................ measure the runtime\n");
printf(" -stat ................ detailed compiler statistics\n");
static void print_times()
{
- long int totaltime = getcputime();
- long int runtime = totaltime - loadingtime - compilingtime;
+ s8 totaltime = getcputime();
+ s8 runtime = totaltime - loadingtime - compilingtime;
char logtext[MAXLOGTEXT];
+#if defined(__I386__)
+ 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);
- dolog(logtext);
+ log_text(logtext);
+
+#if defined(__I386__)
+ 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);
- dolog(logtext);
+ log_text(logtext);
+
+#if defined(__I386__)
+ 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);
- dolog(logtext);
+ log_text(logtext);
+
+#if defined(__I386__)
+ sprintf(logtext, "Total time: %lld secs, %lld millis",
+#else
sprintf(logtext, "Total time: %ld secs, %ld millis",
+#endif
totaltime / 1000000, (totaltime % 1000000) / 1000);
- dolog(logtext);
+ log_text(logtext);
}
char logtext[MAXLOGTEXT];
sprintf(logtext, "Number of JitCompiler Calls: %d", count_jit_calls);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of compiled Methods: %d", count_methods);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of max basic blocks per method: %d", count_max_basic_blocks);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of compiled basic blocks: %d", count_basic_blocks);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of max JavaVM-Instructions per method: %d", count_max_javainstr);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of compiled JavaVM-Instructions: %d", count_javainstr);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Size of compiled JavaVM-Instructions: %d(%d)", count_javacodesize,
count_javacodesize - count_methods * 18);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Size of compiled Exception Tables: %d", count_javaexcsize);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Value of extended instruction set var: %d", has_ext_instr_set);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of Machine-Instructions: %d", count_code_len >> 2);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of Spills: %d", count_spills);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of Activ Pseudocommands: %5d", count_pcmd_activ);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of Drop Pseudocommands: %5d", count_pcmd_drop);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of Const Pseudocommands: %5d (zero:%5d)", count_pcmd_load, count_pcmd_zero);
- dolog(logtext);
+ 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);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of Move Pseudocommands: %5d", count_pcmd_move);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of Load Pseudocommands: %5d", count_load_instruction);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of Store Pseudocommands: %5d (combined: %5d)", count_pcmd_store, count_pcmd_store - count_pcmd_store_comb);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of OP Pseudocommands: %5d", count_pcmd_op);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of DUP Pseudocommands: %5d", count_dup_instruction);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of Mem Pseudocommands: %5d", count_pcmd_mem);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of Method Pseudocommands: %5d", count_pcmd_met);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of Branch Pseudocommands: %5d (rets:%5d, Xrets: %5d)",
count_pcmd_bra, count_pcmd_return, count_pcmd_returnx);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of Table Pseudocommands: %5d", count_pcmd_table);
- dolog(logtext);
+ 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);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of Null Pointer Checks: %5d", count_check_null);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of Array Bound Checks: %5d", count_check_bound);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of Try-Blocks: %d", count_tryblocks);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Maximal count of stack elements: %d", count_max_new_stack);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Upper bound of max stack elements: %d", count_upper_bound_new_stack);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Distribution of stack sizes at block boundary");
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, " 0 1 2 3 4 5 6 7 8 9 >=10");
- dolog(logtext);
+ 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]);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Distribution of store stack depth");
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, " 0 1 2 3 4 5 6 7 8 9 >=10");
- dolog(logtext);
+ 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]);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Distribution of store creator chains first part");
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, " 0 1 2 3 4 5 6 7 8 9 ");
- dolog(logtext);
+ 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]);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Distribution of store creator chains second part");
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, " 10 11 12 13 14 15 16 17 18 19 >=20");
- dolog(logtext);
+ 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]);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Distribution of analysis iterations");
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, " 1 2 3 4 >=5");
- dolog(logtext);
+ 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]);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Distribution of basic blocks per method");
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, " <= 5 <=10 <=15 <=20 <=30 <=40 <=50 <=75 >75");
- dolog(logtext);
+ 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]);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Distribution of basic block sizes");
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext,
" 0 1 2 3 4 5 6 7 8 9 <13 <15 <17 <19 <21 <26 <31 >30");
- dolog(logtext);
+ 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[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(logtext);
+ log_text(logtext);
sprintf(logtext, "Size of Code Area (Kb): %10.3f", (float) count_code_len / 1024);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Size of data Area (Kb): %10.3f", (float) count_data_len / 1024);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Size of Class Infos (Kb):%10.3f", (float) (count_class_infos) / 1024);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Size of Const Pool (Kb): %10.3f", (float) (count_const_pool_len + count_utf_len) / 1024);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Size of Vftbl (Kb): %10.3f", (float) count_vftbl_len / 1024);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Size of comp stub (Kb): %10.3f", (float) count_cstub_len / 1024);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Size of native stub (Kb):%10.3f", (float) count_nstub_len / 1024);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Size of Utf (Kb): %10.3f", (float) count_utf_len / 1024);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Size of VMCode (Kb): %10.3f(%d)", (float) count_vmcode_len / 1024,
count_vmcode_len - 18 * count_all_methods);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Size of ExTable (Kb): %10.3f", (float) count_extable_len / 1024);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of class loads: %d", count_class_loads);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of class inits: %d", count_class_inits);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Number of loaded Methods: %d\n\n", count_all_methods);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Calls of utf_new: %22d", count_utf_new);
- dolog(logtext);
+ log_text(logtext);
sprintf(logtext, "Calls of utf_new (element found): %6d\n\n", count_utf_new_found);
- dolog(logtext);
+ 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]);
(void) jit_compile(m);
}
}
- c = list_next (&linkedclasses, c);
+ c = list_next(&linkedclasses, c);
}
}
-
/*
* void exit_handler(void)
* -----------------------
/********************* Print debug tables ************************/
if (showmethods) class_showmethods(topclass);
- if (showconstantpool) class_showconstantpool(topclass);
- if (showutf) utf_show();
+ if (showconstantpool) class_showconstantpool(topclass);
+ if (showutf) utf_show();
#ifdef USE_THREADS
clear_thread_flags(); /* restores standard file descriptor
tables_close(literalstring_free);
if (verbose || getcompilingtime || statistics) {
- log_text ("CACAO terminated");
+ log_text("CACAO terminated");
if (statistics)
print_stats();
if (getcompilingtime)
}
-
/************************** Function: main *******************************
The main program.
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 heapstartsize = 200000;
- char classpath[500] = ".:/usr/local/lib/java/classes";
+ char classpath[500] = ".";
bool startit = true;
char *specificmethodname = NULL;
char *specificsignature = NULL;
int n;
int l = strlen(opt_arg);
for (n = 0; n < l; n++) {
- if (opt_arg[n]=='=') {
+ if (opt_arg[n] == '=') {
opt_arg[n] = '\0';
attach_property(opt_arg, opt_arg + n + 1);
goto didit;
opt_noieee = true;
break;
+ case OPT_NOVERIFY:
+ opt_verify = false;
+ break;
+
case OPT_SOFTNULL:
checknull = true;
break;
log_text("CACAO started -------------------------------------------------------");
}
- suck_init (classpath);
- native_setclasspath (classpath);
+ native_setclasspath(classpath);
tables_init();
+ suck_init(classpath);
+
heap_init(heapsize, heapstartsize, &dummy);
-
-
- log_text("calling jit_init");
jit_init();
+ loader_init((u1 *) &dummy);
-
- log_text("calling loader_init");
-
- loader_init((u1*)&dummy);
-
- log_text("calling native_loadclasses");
- native_loadclasses ();
+ native_loadclasses();
/*********************** Load JAVA classes ***************************/
if (cp[i] == '.') cp[i] = '/'; /* in the class name */
}
+ /*printf("-------------------->%s\n",cp);*/
topclass = loader_load(utf_new_char(cp));
+ /*class_showmethods(topclass); */
- if (exceptionptr != 0) {
- printf("#### Class loader has thrown: ");
- utf_display(exceptionptr->vftbl->class->name);
+ if (*exceptionptr != 0) {
+ printf("Exception in thread \"main\" ");
+ utf_display((*exceptionptr)->vftbl->class->name);
+ printf(": ");
+ utf_display(javastring_toutf(((java_lang_Throwable *) *exceptionptr)->detailMessage, false));
printf("\n");
- exceptionptr = 0;
+ *exceptionptr = 0;
}
if (topclass == 0) {
- printf("#### Could not find top class - exiting\n");
+ /* should we print out something? we already have the exception */
exit(1);
}
+ /* initialize the garbage collector */
+ gc_init();
-
- gc_init();
#ifdef USE_THREADS
- initThreads((u1*) &dummy); /* schani */
+ initThreads((u1*) &dummy);
#endif
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")
+ );
+
+ /* 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);
+ }
- 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; i < argc; i++) {
- a->data[i - opt_ind] = javastring_new(utf_new_char(argv[i]));
+ a->data[i - opt_ind] =
+ (java_objectheader *) javastring_new(utf_new_char(argv[i]));
}
#ifdef TYPEINFO_DEBUG_TEST
typeinfo_test();
#endif
/*class_showmethods(currentThread->group->header.vftbl->class); */
+
+ /* here we go... */
+ asm_calljavafunction(mainmethod, a, NULL, NULL, NULL);
- local_exceptionptr = asm_calljavamethod (mainmethod, a, NULL, NULL, NULL );
-
- if (local_exceptionptr) {
+ if (*exceptionptr) {
printf("Exception in thread \"main\" ");
- utf_display(local_exceptionptr->vftbl->class->name);
+ utf_display((*exceptionptr)->vftbl->class->name);
+
+ /* do we have a detail message? */
+ if (((java_lang_Throwable *) *exceptionptr)->detailMessage) {
+ printf(": ");
+ utf_display(javastring_toutf(((java_lang_Throwable *) *exceptionptr)->detailMessage, false));
+ }
printf("\n");
}
- /*---RTAprint---*/
#ifdef USE_THREADS
- killThread(currentThread);
+ killThread(currentThread);
#endif
fprintf(stderr, "still here\n");
}
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");
- (void) jit_compile(m);
+ utf_new_char(specificmethodname),
+ NULL);
+ }
+
+ if (!m)
+ panic("Specific method not found");
+
+ jit_compile(m);
}
exit(0);