-/* -*- mode: c; tab-width: 4; c-basic-offset: 4 -*- */
-/******************************* main.c ****************************************
+/* main.c **********************************************************************
Copyright (c) 1997 A. Krall, R. Grafl, M. Gschwind, M. Probst
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
- Last Change: 1997/10/29
+ Last Change: $Id: main.c 88 1998-11-25 11:45:40Z phil $
*******************************************************************************/
#include "global.h"
#include "tables.h"
-#include "compiler.h"
-#include "ncomp/ncomp.h"
#include "loader.h"
+#include "jit.h"
+#ifdef OLD_COMPILER
+#include "compiler.h"
+#endif
#include "asmpart.h"
#include "builtin.h"
#include "native.h"
-#include "threads/thread.h" /* schani */
+#include "threads/thread.h"
bool compileall = false;
int newcompiler = true;
bool verbose = false;
+#ifdef NEW_GC
+bool new_gc = false;
+#endif
+
+static bool showmethods = false;
+static bool showconstantpool = false;
+static bool showunicode = false;
+static classinfo *topclass;
#ifndef USE_THREADS
void **stackbottom = 0;
#endif
-/********************* interne Funktion: get_opt *****************************
+/* internal function: get_opt *************************************************
- liest die n"achste Option aus der Kommandozeile
+ decodes the next command line option
******************************************************************************/
#define OPT_IGNORE 1
#define OPT_CLASSPATH 2
-#define OPT_D 3
-#define OPT_MS 4
-#define OPT_MX 5
-#define OPT_VERBOSE1 6
-#define OPT_VERBOSE 7
-#define OPT_VERBOSEGC 8
-#define OPT_VERBOSECALL 9
+#define OPT_D 3
+#define OPT_MS 4
+#define OPT_MX 5
+#define OPT_VERBOSE1 6
+#define OPT_VERBOSE 7
+#define OPT_VERBOSEGC 8
+#define OPT_VERBOSECALL 9
#define OPT_IEEE 10
#define OPT_SOFTNULL 11
#define OPT_TIME 12
#define OPT_STAT 13
-#define OPT_LOG 14
+#define OPT_LOG 14
#define OPT_CHECK 15
-#define OPT_LOAD 16
-#define OPT_METHOD 17
-#define OPT_SIGNATURE 18
-#define OPT_SHOW 19
-#define OPT_ALL 20
-#define OPT_OLD 21
-
-struct { char *name; bool arg; int value; } opts[] = {
- { "classpath", true, OPT_CLASSPATH },
- { "D", true, OPT_D },
- { "ms", true, OPT_MS },
- { "mx", true, OPT_MX },
- { "noasyncgc", false, OPT_IGNORE },
- { "noverify", false, OPT_IGNORE },
- { "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 },
- { "softnull", false, OPT_SOFTNULL },
- { "time", false, OPT_TIME },
- { "stat", false, OPT_STAT },
- { "log", true, OPT_LOG },
- { "c", true, OPT_CHECK },
- { "l", false, OPT_LOAD },
- { "m", true, OPT_METHOD },
- { "sig", true, OPT_SIGNATURE },
- { "s", true, OPT_SHOW },
- { "all", false, OPT_ALL },
- { "old", false, OPT_OLD },
- { NULL, false, 0 }
+#define OPT_LOAD 16
+#define OPT_METHOD 17
+#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
+
+struct {char *name; bool arg; int value;} opts[] = {
+ {"classpath", true, OPT_CLASSPATH},
+ {"D", true, OPT_D},
+ {"ms", true, OPT_MS},
+ {"mx", true, OPT_MX},
+ {"noasyncgc", false, OPT_IGNORE},
+ {"noverify", false, OPT_IGNORE},
+ {"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},
+ {"softnull", false, OPT_SOFTNULL},
+ {"time", false, OPT_TIME},
+ {"stat", false, OPT_STAT},
+ {"log", true, OPT_LOG},
+ {"c", true, OPT_CHECK},
+ {"l", false, OPT_LOAD},
+ {"m", true, OPT_METHOD},
+ {"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
+ {NULL, false, 0}
};
static int opt_ind = 1;
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 */
opt_ind++;
opt_arg = argv[opt_ind];
opt_ind++;
return opts[i].value;
- }
- return OPT_ERROR;
}
+ return OPT_ERROR;
+ }
else {
size_t l = strlen(opts[i].name);
if (strlen(a+1) > l) {
opt_ind++;
opt_arg = a+1+l;
return opts[i].value;
- }
}
}
}
- } /* end for */
+ }
+ } /* end for */
return OPT_ERROR;
}
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 (" -c(heck)b(ounds) ..... don't check array bounds\n");
+ printf (" s(ync) ....... don't check for synchronization\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");
+#endif
printf (" -m ................... compile only a specific method\n");
printf (" -sig ................. specify signature for a specific method\n");
- printf (" -s(how)m(ethods) ..... show all methods&fields of a class\n");
+ printf (" -s(how)a(ssembler) ... show disassembled listing\n");
printf (" c(onstants) ... show the constant pool\n");
- printf (" a(ssembler) ... show disassembled listing\n");
printf (" d(atasegment).. show data segment listing\n");
- printf (" s(tack) ....... show stack for every javaVM-command\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");
+#endif
printf (" u(nicode) ..... show the unicode - hash\n");
}
for (i = 0; i < c -> methodscount; i++) {
m = &(c->methods[i]);
if (m->jcode) {
+#ifdef OLD_COMPILER
if (newcompiler)
- (void) new_compile(m);
+#endif
+ (void) jit_compile(m);
+#ifdef OLD_COMPILER
else
(void) compiler_compile(m);
+#endif
}
}
c = list_next (&linkedclasses, c);
}
}
+/*
+ * 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)
+{
+ /********************* Debug-Tabellen ausgeben ************************/
+
+ if (showmethods) class_showmethods (topclass);
+ if (showconstantpool) class_showconstantpool (topclass);
+ if (showunicode) unicode_show ();
+
+#ifdef USE_THREADS
+ clear_thread_flags(); /* restores standard file descriptor
+ flags */
+#endif
+
+ /************************ Freigeben aller Resourcen *******************/
+
+ heap_close (); /* must be called before compiler_close and
+ loader_close because finalization occurs
+ here */
+
+#ifdef OLD_COMPILER
+ compiler_close ();
+#endif
+ loader_close ();
+ unicode_close ( literalstring_free );
+
+ if (verbose || getcompilingtime || statistics) {
+ log_text ("CACAO terminated");
+ if (statistics)
+ print_stats ();
+ if (getcompilingtime)
+ print_times ();
+ mem_usagelog(1);
+ }
+}
/************************** Funktion: main *******************************
**************************************************************************/
-
int main(int argc, char **argv)
{
s4 i,j;
char *cp;
- classinfo *topclass;
java_objectheader *exceptionptr;
void *dummy;
- /********** interne (nur fuer main relevante Optionen) **************/
+ /********** interne (nur fuer main relevante Optionen) **************/
char logfilename[200] = "";
u4 heapsize = 16000000;
u4 heapstartsize = 200000;
char classpath[500] = ".:/usr/local/lib/java/classes";
- bool showmethods = false;
- bool showconstantpool = false;
- bool showunicode = false;
bool startit = true;
char *specificmethodname = NULL;
char *specificsignature = NULL;
#ifndef USE_THREADS
stackbottom = &dummy;
#endif
+
+ if (0 != atexit(exit_handler))
+ panic("unable to register exit_handler");
-
-#ifdef USE_THREADS
- atexit(clear_thread_flags);
-#endif
-
- /************ Infos aus der Environment lesen ************************/
+ /************ Infos aus der Environment lesen ************************/
cp = getenv ("CLASSPATH");
if (cp) {
strcpy (classpath, cp);
- }
+ }
- /***************** Interpretieren der Kommandozeile *****************/
+ /***************** Interpretieren der Kommandozeile *****************/
- checknull = false;
- checkfloats = false;
+ checknull = false;
+ checkfloats = false;
while ( (i = get_opt(argc,argv)) != OPT_DONE) {
switch (i) {
- case OPT_IGNORE: break;
+ case OPT_IGNORE: break;
- case OPT_CLASSPATH:
- strcpy (classpath + strlen(classpath), ":");
- strcpy (classpath + strlen(classpath), opt_arg);
- break;
+ case OPT_CLASSPATH:
+ strcpy (classpath + strlen(classpath), ":");
+ strcpy (classpath + strlen(classpath), opt_arg);
+ break;
- case OPT_D:
- {
+ case OPT_D:
+ {
int n,l=strlen(opt_arg);
for (n=0; n<l; n++) {
if (opt_arg[n]=='=') {
opt_arg[n] = '\0';
attach_property (opt_arg, opt_arg+n+1);
goto didit;
- }
}
+ }
print_usage();
exit(10);
- didit: ;
- }
- break;
+ didit: ;
+ }
+ break;
- case OPT_MS:
- case OPT_MX:
- if (opt_arg[strlen(opt_arg)-1] == 'k') {
- j = 1024 * atoi(opt_arg);
- }
- else if (opt_arg[strlen(opt_arg)-1] == 'm') {
- j = 1024 * 1024 * atoi(opt_arg);
- }
- else j = atoi(opt_arg);
+ case OPT_MS:
+ case OPT_MX:
+ if (opt_arg[strlen(opt_arg)-1] == 'k') {
+ j = 1024 * atoi(opt_arg);
+ }
+ else if (opt_arg[strlen(opt_arg)-1] == 'm') {
+ j = 1024 * 1024 * atoi(opt_arg);
+ }
+ else j = atoi(opt_arg);
- if (i==OPT_MX) heapsize = j;
- else heapstartsize = j;
- break;
+ if (i==OPT_MX) heapsize = j;
+ else heapstartsize = j;
+ break;
- case OPT_VERBOSE1:
- verbose = true;
- break;
+ case OPT_VERBOSE1:
+ verbose = true;
+ break;
- case OPT_VERBOSE:
- verbose = true;
- loadverbose = true;
- initverbose = true;
- compileverbose = true;
- break;
+ case OPT_VERBOSE:
+ verbose = true;
+ loadverbose = true;
+ initverbose = true;
+ compileverbose = true;
+ break;
- case OPT_VERBOSEGC:
- collectverbose = true;
- break;
+ case OPT_VERBOSEGC:
+ collectverbose = true;
+ break;
- case OPT_VERBOSECALL:
- runverbose = true;
- break;
+ case OPT_VERBOSECALL:
+ runverbose = true;
+ break;
- case OPT_IEEE:
- checkfloats = true;
- break;
-
- case OPT_SOFTNULL:
- checknull = true;
- break;
-
- case OPT_TIME:
- getcompilingtime = true;
- getloadingtime = true;
- break;
+ case OPT_IEEE:
+ checkfloats = true;
+ break;
+
+ case OPT_SOFTNULL:
+ checknull = true;
+ break;
+
+ case OPT_TIME:
+ getcompilingtime = true;
+ getloadingtime = true;
+ break;
- case OPT_STAT:
- statistics = true;
- break;
+ case OPT_STAT:
+ statistics = true;
+ break;
- case OPT_LOG:
- strcpy (logfilename, opt_arg);
- break;
+ case OPT_LOG:
+ strcpy (logfilename, opt_arg);
+ break;
- case OPT_CHECK:
- for (j=0; j<strlen(opt_arg); j++) {
- switch (opt_arg[j]) {
- case 'b': checkbounds=false; break;
- case 's': checksync=false; break;
- default: print_usage();
- exit(10);
- }
- }
- break;
+ case OPT_CHECK:
+ for (j=0; j<strlen(opt_arg); j++) {
+ switch (opt_arg[j]) {
+ case 'b': checkbounds=false; break;
+ case 's': checksync=false; break;
+ default: print_usage();
+ exit(10);
+ }
+ }
+ break;
- case OPT_LOAD:
- startit = false;
- makeinitializations = false;
- break;
-
- case OPT_METHOD:
- startit = false;
- specificmethodname = opt_arg;
- makeinitializations = false;
- break;
+ case OPT_LOAD:
+ startit = false;
+ makeinitializations = false;
+ break;
+
+ case OPT_METHOD:
+ startit = false;
+ specificmethodname = opt_arg;
+ makeinitializations = false;
+ break;
- case OPT_SIGNATURE:
- specificsignature = opt_arg;
- break;
+ case OPT_SIGNATURE:
+ specificsignature = opt_arg;
+ break;
- case OPT_ALL:
- compileall = true;
- startit = false;
- makeinitializations = false;
- break;
+ case OPT_ALL:
+ compileall = true;
+ startit = false;
+ makeinitializations = false;
+ break;
- case OPT_OLD:
- newcompiler = false;
- checknull = true;
- break;
+#ifdef OLD_COMPILER
+ case OPT_OLD:
+ newcompiler = false;
+ checknull = true;
+ break;
+#endif
+
+#ifdef NEW_GC
+ case OPT_GC2:
+ new_gc = true;
+ break;
+
+ case OPT_GC1:
+ new_gc = false;
+ break;
+#endif
- case OPT_SHOW: /* Anzeigeoptionen */
- for (j=0; j<strlen(opt_arg); j++) {
- switch (opt_arg[j]) {
- case 'm': showmethods=true; break;
- case 'c': showconstantpool=true; break;
- case 'a': showdisassemble=true; compileverbose=true; break;
- case 's': showstack=true; compileverbose=true; break;
- case 'i': showintermediate=true; compileverbose=true; break;
- case 'u': showunicode=true; break;
- default: print_usage();
- exit(10);
- }
- }
- break;
-
- default:
- print_usage();
- exit(10);
+ case OPT_SHOW: /* Anzeigeoptionen */
+ for (j=0; j<strlen(opt_arg); j++) {
+ switch (opt_arg[j]) {
+ case 'a': showdisassemble=true; compileverbose=true; break;
+ case 'c': showconstantpool=true; break;
+ case 'd': showddatasegment=true; break;
+ case 'i': showintermediate=true; compileverbose=true; break;
+ case 'm': showmethods=true; break;
+#ifdef OLD_COMPILER
+ case 's': showstack=true; compileverbose=true; break;
+#endif
+ case 'u': showunicode=true; break;
+ default: print_usage();
+ exit(10);
+ }
}
+ break;
-
+ default:
+ print_usage();
+ exit(10);
}
+
+
+ }
if (opt_ind >= argc) {
print_usage ();
exit(10);
- }
+ }
- /**************************** Programmstart *****************************/
+ /**************************** Programmstart *****************************/
log_init (logfilename);
if (verbose) {
log_text (
- "CACAO started -------------------------------------------------------");
- }
+ "CACAO started -------------------------------------------------------");
+ }
suck_init (classpath);
native_setclasspath (classpath);
unicode_init();
heap_init(heapsize, heapstartsize, &dummy);
loader_init();
+#ifdef OLD_COMPILER
compiler_init();
- ncomp_init();
+#endif
+ jit_init();
native_loadclasses ();
- /*********************** JAVA-Klassen laden ***************************/
+ /*********************** JAVA-Klassen laden ***************************/
cp = argv[opt_ind++];
for (i=strlen(cp)-1; i>=0; i--) { /* Punkte im Klassennamen */
if (cp[i]=='.') cp[i]='/'; /* auf slashes umbauen */
- }
+ }
topclass = loader_load ( unicode_new_char (cp) );
initThreads((u1*)&dummy); /* schani */
#endif
- /************************* Arbeitsroutinen starten ********************/
+ /************************* Arbeitsroutinen starten ********************/
if (startit) {
methodinfo *mainmethod;
heap_addreference((void**) &a);
mainmethod = class_findmethod (
- topclass,
- unicode_new_char ("main"),
- unicode_new_char ("([Ljava/lang/String;)V")
- );
+ topclass,
+ unicode_new_char ("main"),
+ unicode_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 (unicode_new_char (argv[i]) );
- }
+ }
exceptionptr = asm_calljavamethod (mainmethod, a, NULL,NULL,NULL );
if (exceptionptr) {
printf ("#### Program has thrown: ");
unicode_display (exceptionptr->vftbl->class->name);
printf ("\n");
- }
-
-/* killThread(currentThread); */
-
}
+#ifdef USE_THREADS
+ killThread(currentThread);
+#endif
+ fprintf(stderr, "still here\n");
+ }
+
/************* Auf Wunsch alle Methode "ubersetzen ********************/
if (compileall) {
class_compile_methods();
- }
+ }
/******** Auf Wunsch eine spezielle Methode "ubersetzen ***************/
methodinfo *m;
if (specificsignature)
m = class_findmethod(topclass,
- unicode_new_char(specificmethodname),
- unicode_new_char(specificsignature));
+ unicode_new_char(specificmethodname),
+ unicode_new_char(specificsignature));
else
m = class_findmethod(topclass,
- unicode_new_char(specificmethodname), NULL);
+ unicode_new_char(specificmethodname), NULL);
if (!m) panic ("Specific method not found");
+#ifdef OLD_COMPILER
if (newcompiler)
- (void) new_compile(m);
+#endif
+ (void) jit_compile(m);
+#ifdef OLD_COMPILER
else
(void) compiler_compile(m);
- }
-
- /********************* Debug-Tabellen ausgeben ************************/
-
- if (showmethods) class_showmethods (topclass);
- if (showconstantpool) class_showconstantpool (topclass);
- if (showunicode) unicode_show ();
-
-
-
- /************************ Freigeben aller Resourcen *******************/
-
- compiler_close ();
- loader_close ();
- heap_close ();
- unicode_close ( literalstring_free );
-
-
- /* Endemeldung ausgeben und mit entsprechendem exit-Status terminieren */
+#endif
+ }
- if (verbose || getcompilingtime || statistics) {
- log_text ("CACAO terminated");
- if (statistics)
- print_stats ();
- if (getcompilingtime)
- print_times ();
- mem_usagelog(1);
- }
-
exit(0);
- return 1;
}
sprintf (logtext, "Exit status: %d\n", (int) status);
dolog();
}
-
+
exit(status);
}
+
+
+/*
+ * These are local overrides for various environment variables in Emacs.
+ * Please do not remove this and leave it at the end of the file, where
+ * Emacs will automagically detect them.
+ * ---------------------------------------------------------------------
+ * Local variables:
+ * mode: c
+ * indent-tabs-mode: t
+ * c-basic-offset: 4
+ * tab-width: 4
+ * End:
+ */