X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=src%2Fcacaoh%2Fheaders.c;h=038ccffc89354849a1e185523648a8dc1dfd2178;hb=9be1473bdee5895ef77ac897d378ed1249b1567d;hp=4f5b672b349175e0583f919e7c6cf10ca6e3dd49;hpb=8395b7e9d40e3ca38f98ff3d3684541c2c2fd87e;p=cacao.git diff --git a/src/cacaoh/headers.c b/src/cacaoh/headers.c index 4f5b672b3..038ccffc8 100644 --- a/src/cacaoh/headers.c +++ b/src/cacaoh/headers.c @@ -1,4 +1,4 @@ -/* headers.c - main for header generation (cacaoh) +/* headers.c - functions for header generation Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 R. Grafl, A. Krall, C. Kruegel, C. Oates, R. Obermaisser, @@ -28,8 +28,9 @@ Changes: Mark Probst Philipp Tomsich + Christian Thalinger - $Id: headers.c 1166 2004-06-12 13:34:06Z stefan $ + $Id: headers.c 1368 2004-08-01 21:50:08Z stefan $ */ @@ -41,43 +42,14 @@ #include "global.h" #include "tables.h" #include "loader.h" +#include "options.h" #include "builtin.h" #include "mm/boehm.h" #include "toolbox/chain.h" #include "toolbox/memory.h" #include "toolbox/logging.h" #include "nat/java_lang_String.h" - - -/* replace command line options */ - -bool verbose = false; -bool verboseexception = false; -bool compileall = false; -bool runverbose = false; -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_verify = true; /* true if classfiles should be verified */ -bool opt_liberalutf = false; /* Don't check overlong UTF-8 sequences */ - -bool opt_stat = false; -bool opt_eager = false; - -bool showmethods = false; -bool showconstantpool = false; -bool showutf = false; - -bool makeinitializations = true; - -bool getloadingtime = false; -s8 loadingtime = 0; +#include "nat/java_lang_Throwable.h" /******* replace some external functions *********/ @@ -85,84 +57,23 @@ s8 loadingtime = 0; functionptr native_findfunction(utf *cname, utf *mname, utf *desc, bool isstatic) { return NULL; } -java_objectheader *javastring_new(utf *text) -{ return NULL; } +java_objectheader *javastring_new(utf *text) { return NULL; } +java_objectheader *javastring_new_char(char *text) { return NULL; } +char *javastring_tochar(java_objectheader *so) { return NULL; } utf *javastring_toutf(java_lang_String *string, bool isclassname) { return NULL; } -/* some exception stuff */ - -char *string_java_lang_IllegalMonitorStateException = - "java/lang/IllegalMonitorStateException"; - -char *string_java_lang_NegativeArraySizeException = - "java/lang/NegativeArraySizeException"; - - -char *string_java_lang_AbstractMethodError = - "java/lang/AbstractMethodError"; - -char *string_java_lang_ClassCircularityError = - "java/lang/ClassCircularityError"; - -char *string_java_lang_ClassFormatError = - "java/lang/ClassFormatError"; - -char *string_java_lang_ExceptionInInitializerError = - "java/lang/ExceptionInInitializerError"; - -char *string_java_lang_IncompatibleClassChangeError = - "java/lang/IncompatibleClassChangeError"; - -char *string_java_lang_InternalError = - "java/lang/InternalError"; - -char *string_java_lang_LinkageError = - "java/lang/LinkageError"; - -char *string_java_lang_NoClassDefFoundError = - "java/lang/NoClassDefFoundError"; - -char *string_java_lang_NoSuchFieldError = - "java/lang/NoSuchFieldError"; - -char *string_java_lang_NoSuchMethodError = - "java/lang/NoSuchMethodError"; - -char *string_java_lang_OutOfMemoryError = - "java/lang/OutOfMemoryError"; - - -void throw_exception_exit() {} - -void throw_cacao_exception_exit(char *exception, char *message) -{ - fprintf(stderr, - "Exception in thread \"main\" %s: %s\n", exception, message); - fflush(stderr); - - /* good bye! */ - exit(1); -} - - -void new_exception(char *classname) {} -void new_exception_message(char *classname, char *message) {} -void new_exception_throwable(char *classname, java_objectheader *t) {} -void new_exception_utfmessage(char *classname, utf *message) -{ - printf("%s: ", classname); - utf_display(message); - printf("\n"); - exit(1); -} +java_objectheader *native_new_and_init(classinfo *c) { return NULL; } +java_objectheader *native_new_and_init_string(classinfo *c, java_lang_String *s) { return NULL; } +java_objectheader *native_new_and_init_int(classinfo *c, s4 i) { return NULL; } +java_objectheader *native_new_and_init_throwable(classinfo *c, java_lang_Throwable *t) { return NULL; } java_objectheader *literalstring_new(utf *u) { return NULL; } -void literalstring_free(java_objectheader *o) { } +void literalstring_free(java_objectheader *o) {} void stringtable_update() { } void synchronize_caches() { } void asm_call_jit_compiler() { } @@ -179,18 +90,27 @@ s8 asm_builtin_f2l(float a) { return 0; } s4 asm_builtin_d2i(double a) { return 0; } s8 asm_builtin_d2l(double a) { return 0; } +void use_class_as_object() {} void asm_builtin_monitorenter(java_objectheader *o) {} -void asm_builtin_monitorexit(java_objectheader *o) {} +void *asm_builtin_monitorexit(java_objectheader *o) {} -s4 asm_builtin_checkarraycast(java_objectheader *obj, vftbl *target) {return 0;} +s4 asm_builtin_checkarraycast(java_objectheader *obj, vftbl_t *target) {return 0;} -void atomic_swap() {} -void compare_and_swap() {} +#if defined(__MIPS__) +long compare_and_swap(long *p, long oldval, long newval) +{ + if (*p == oldval) { + *p = newval; + return oldval; + } else + return *p; +} +#endif #if defined(__I386__) s4 asm_builtin_arrayinstanceof(java_objectheader *obj, classinfo *class) { return 0; } -void asm_builtin_newarray(s4 size, vftbl *arrayvftbl) {} +void asm_builtin_newarray(s4 size, vftbl_t *arrayvftbl) {} #endif void asm_builtin_aastore(java_objectarray *a, s4 index, java_objectheader *o) {} @@ -217,17 +137,15 @@ int cacao_catch_Handler() {} threadcritnode asm_criticalsections; #endif -java_objectheader *native_new_and_init(void *p) { return NULL; } - /************************ global variables **********************/ THREADSPECIFIC java_objectheader *_exceptionptr; -static chain *nativemethod_chain; /* chain with native methods */ -static chain *nativeclass_chain; /* chain with processed classes */ -static chain *ident_chain; /* chain with method and field names in current class */ -static FILE *file = NULL; +chain *nativemethod_chain; /* chain with native methods */ +chain *nativeclass_chain; /* chain with processed classes */ +static chain *ident_chain; /* chain with method and field names in current class */ +FILE *file = NULL; static u4 outputsize; static bool dopadding; @@ -265,6 +183,39 @@ static void addoutputsize (int len) outputsize = newsize; } +static void printOverloadPart(utf *desc) +{ + char *utf_ptr=desc->text; + u2 c; + + fprintf(file,"__"); + while ((c=utf_nextu2(&utf_ptr))!=')') { + switch (c) { + case 'I': + case 'S': + case 'B': + case 'C': + case 'Z': + case 'J': + case 'F': + case 'D': + fprintf (file, "%c",(char)c); + break; + case '[': + fprintf(file,"_3"); + break; + case 'L': + putc('L',file); + while ( (c=utf_nextu2(&utf_ptr)) != ';') + printIDpart (c); + fprintf(file,"_2"); + break; + case '(': + break; + default: panic ("invalid method descriptor"); + } + } +} static char *printtype(char *utf_ptr) { @@ -382,7 +333,7 @@ static void printfields(classinfo *c) /***************** store prototype for native method in file ******************/ -static void printmethod(methodinfo *m) +void printmethod(methodinfo *m) { char *utf_ptr; u2 paramnum = 1; @@ -407,13 +358,11 @@ static void printmethod(methodinfo *m) fprintf(file, " JNICALL Java_"); printID(m->class->name); - /* rename overloaded method */ - if ((ident_count = searchidentchain_utf(m->name))) - fprintf(file, "%d", ident_count - 1); chain_addlast(ident_chain, m->name); fprintf(file, "_"); printID(m->name); + if (m->nativelyoverloaded) printOverloadPart(m->descriptor); fprintf(file, "(JNIEnv *env"); utf_ptr = m->descriptor->text + 1; @@ -441,13 +390,17 @@ static void printmethod(methodinfo *m) /******* remove package-name in fully-qualified classname *********************/ -static void gen_header_filename(char *buffer, utf *u) +void gen_header_filename(char *buffer, utf *u) { - int i; + s4 i; - for (i = 0;i < utf_strlen(u); i++) { - if ((u->text[i] == '/') || (u->text[i] == '$')) buffer[i] = '_'; /* convert '$' and '/' to '_' */ - else buffer[i] = u->text[i]; + for (i = 0; i < utf_strlen(u); i++) { + if ((u->text[i] == '/') || (u->text[i] == '$')) { + buffer[i] = '_'; /* convert '$' and '/' to '_' */ + + } else { + buffer[i] = u->text[i]; + } } buffer[utf_strlen(u)] = '\0'; } @@ -455,13 +408,16 @@ static void gen_header_filename(char *buffer, utf *u) /* create headerfile for classes and store native methods in chain ************/ -static void headerfile_generate(classinfo *c) +void headerfile_generate(classinfo *c) { char header_filename[1024] = ""; char classname[1024]; char uclassname[1024]; u2 i; methodinfo *m; + u2 i2; + methodinfo *m2; + u2 nativelyoverloaded; /* store class in chain */ chain_addlast(nativeclass_chain, c); @@ -508,6 +464,27 @@ static void headerfile_generate(classinfo *c) /* create method-prototypes */ + /* find overloaded methods */ + for (i = 0; i < c->methodscount; i++) { + + m = &(c->methods[i]); + + if (!(m->flags & ACC_NATIVE)) continue; + if (!m->nativelyoverloaded) { + nativelyoverloaded=false; + for (i2=i+1;i2methodscount; i2++) { + m2 = &(c->methods[i2]); + if (!(m2->flags & ACC_NATIVE)) continue; + if (m->name==m2->name) { + m2->nativelyoverloaded=true; + nativelyoverloaded=true; + } + } + m->nativelyoverloaded=nativelyoverloaded; + } + + } + for (i = 0; i < c->methodscount; i++) { m = &(c->methods[i]); @@ -548,7 +525,7 @@ void print_classname(classinfo *clazz) /*************** create table for locating native functions ****************/ -static void printnativetableentry(methodinfo *m) +void printnativetableentry(methodinfo *m) { fprintf(file, " { \""); print_classname(m->class); @@ -568,214 +545,11 @@ static void printnativetableentry(methodinfo *m) printID(m->class->name); fprintf(file,"_"); printID(m->name); + if (m->nativelyoverloaded) printOverloadPart(m->descriptor); fprintf(file,"\n },\n"); } -/*************************************************************************** - - create the nativetypes-headerfile which includes - the headerfiles of the classes stored in the classes-chain - -****************************************************************************/ - -static void headers_finish() -{ - methodinfo *m; - classinfo *c; - char classname[1024]; - - file = fopen("nativetypes.hh", "w"); - - if (!file) - panic("Can not open file 'native.h' to store header information"); - - fprintf(file, "/* Headerfile for native methods: nativetypes.hh */\n"); - fprintf(file, "/* This file is machine generated, don't edit it !*/\n\n"); - fprintf(file, "\n/* include native-Headerfiles */\n\n"); - - c = chain_first(nativeclass_chain); - while (c) { - dopadding = false; - gen_header_filename(classname, c->name); - fprintf(file, "#include \"nat/%s.h\"\n", classname); - c = chain_next(nativeclass_chain); - } - - fclose(file); - chain_free(nativeclass_chain); - - /* create table of native-methods */ - - file = fopen("nativetable.hh", "w"); - - if (!file) - panic("Can not open file 'nativetable' to store native-link-table"); - - fprintf(file, "/* Table of native methods: nativetables.hh */\n"); - fprintf(file, "/* This file is machine generated, don't edit it !*/\n\n"); - - while ((m = chain_first(nativemethod_chain)) != NULL) { - chain_remove(nativemethod_chain); - printnativetableentry(m); - } - - chain_free(nativemethod_chain); - fclose(file); -} - - -/******************** internal function: print_usage ************************ - -Prints usage information for the JAVA header generator to stdout. - -***************************************************************************/ - -static void print_usage() -{ - printf("Usage: cacaoh class [class..]\n"); -} - - - -/************************** Function: main ******************************* - - Main program. - -**************************************************************************/ - -int main(int argc, char **argv) -{ - s4 i,a; - char *cp; - classinfo *topclass; - - - /********** internal (only used by main) *****************************/ - - char classpath[500] = ""; - char offsets_filename[1024] = ""; /* phil */ - u4 heapmaxsize = 1000000; - u4 heapstartsize = 100000; - - /*********** options so only headers are generated *******************/ - - makeinitializations = false; - - - /************ Collect some info from the environment *****************/ - - cp = getenv("CLASSPATH"); - if (cp) { - strcpy(classpath + strlen(classpath), ":"); - strcpy(classpath + strlen(classpath), cp); - } - - if (argc < 2) { - print_usage(); - exit(10); - } - - - /**************************** Program start **************************/ - - log_init(NULL); - log_text("Java - header-generator started"); - - sprintf(offsets_filename, "jit/%s/offsets.h", ARCH_DIR); - file = fopen(offsets_filename, "w"); - if (file == NULL) { - fprintf(stderr, "Can not open file '%s' for write", offsets_filename); - exit(-1); - } - - fprintf(file, "/* This file is machine generated, don't edit it !*/\n\n"); - - fprintf(file, "#define offobjvftbl %3d\n", (int) OFFSET(java_objectheader, vftbl)); - fprintf(file, "#define offarraysize %3d\n", (int) OFFSET(java_arrayheader, size)); - fprintf(file, "#define offobjarrdata %3d\n\n", (int) OFFSET(java_objectarray, data[0])); - fprintf(file, "#define offbaseval %3d\n", (int) OFFSET(vftbl, baseval)); - fprintf(file, "#define offdiffval %3d\n\n", (int) OFFSET(vftbl, diffval)); - fprintf(file, "#define offclass %3d\n\n", (int) OFFSET(vftbl, class)); - - fprintf(file, "#define offclassvftbl %3d\n", (int) OFFSET(classinfo, vftbl)); - fprintf(file, "#define offclassinit %3d\n", (int) OFFSET(classinfo, initialized)); - fprintf(file, "#define offclassloaded %3d\n", (int) OFFSET(classinfo, loaded)); - fprintf(file, "#define offclasslinked %3d\n\n", (int) OFFSET(classinfo, linked)); - - fprintf(file, "#define offjniitemtype %3d\n", (int) OFFSET(jni_callblock, itemtype)); - fprintf(file, "#define offjniitem %3d\n", (int) OFFSET(jni_callblock, item)); - fprintf(file, "#define sizejniblock %3d\n\n", (int) sizeof(jni_callblock)); - - fprintf(file, "#define offclassmethodinfo %3d\n\n", (int) OFFSET(methodinfo,class)); - - fprintf(file, "#define offmethodnative %3d\n", (int) OFFSET(native_stackframeinfo,method)); -/* fprintf(file, "#define offreturnfromnative %3d\n", (int) OFFSET(native_stackframeinfo,returnFromNative)); - fprintf(file, "#define offaddrreturnfromnative %3d\n", (int) OFFSET(native_stackframeinfo,addrReturnFromNative)); - fprintf(file, "#define offprevnative %3d\n", (int) OFFSET(native_stackframeinfo,prev)); - fprintf(file, "#define offnextnative %3d\n", (int) OFFSET(native_stackframeinfo,next));*/ - - fprintf(file, "\n"); - fprintf(file, "#define offcast_super_baseval %3d\n", (int) OFFSET(castinfo, super_baseval)); - fprintf(file, "#define offcast_super_diffval %3d\n", (int) OFFSET(castinfo, super_diffval)); - fprintf(file, "#define offcast_sub_baseval %3d\n", (int) OFFSET(castinfo, sub_baseval)); - - fclose(file); - - /* initialize the garbage collector */ - gc_init(heapmaxsize, heapstartsize); - - suck_init(classpath); - - tables_init(); - -#if defined(USE_THREADS) && defined(NATIVE_THREADS) - initThreadsEarly(); -#endif - loader_init(); - - - /*********************** Load JAVA classes **************************/ - - nativemethod_chain = chain_new(); - nativeclass_chain = chain_new(); - - for (a = 1; a < argc; a++) { - cp = argv[a]; - - /* convert classname */ - for (i = strlen(cp) - 1; i >= 0; i--) { - switch (cp[i]) { - case '.': cp[i]='/'; - break; - case '_': cp[i]='$'; - } - } - -/* topclass = loader_load(utf_new_char(cp)); */ - topclass = class_load(class_new(utf_new_char(cp))); - class_link(topclass); - - headerfile_generate(topclass); - } - - headers_finish(); - - /************************ Release all resources **********************/ - - loader_close(); - tables_close(literalstring_free); - - /* Print "finished" message */ - - log_text("Java - header-generator stopped"); - log_cputime(); - mem_usagelog(1); - - return 0; -} - - void setVMClassField(classinfo *c) { }