1 /* src/vm/linker.c - class linker functions
3 Copyright (C) 1996-2005, 2006 R. Grafl, A. Krall, C. Kruegel,
4 C. Oates, R. Obermaisser, M. Platter, M. Probst, S. Ring,
5 E. Steiner, C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich,
6 J. Wenninger, Institut f. Computersprachen - TU Wien
8 This file is part of CACAO.
10 This program is free software; you can redistribute it and/or
11 modify it under the terms of the GNU General Public License as
12 published by the Free Software Foundation; either version 2, or (at
13 your option) any later version.
15 This program is distributed in the hope that it will be useful, but
16 WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
25 Contact: cacao@cacaojvm.org
27 Authors: Reinhard Grafl
29 Changes: Andreas Krall
35 $Id: linker.c 6251 2006-12-27 23:15:56Z twisti $
46 #include "mm/memory.h"
47 #include "native/native.h"
49 #if defined(ENABLE_THREADS)
50 # include "threads/native/lock.h"
52 # include "threads/none/lock.h"
56 #include "vm/classcache.h"
57 #include "vm/exceptions.h"
58 #include "vm/loader.h"
59 #include "vm/options.h"
60 #include "vm/resolve.h"
61 #include "vm/statistics.h"
62 #include "vm/stringlocal.h"
63 #include "vm/access.h"
64 #include "vm/rt-timing.h"
66 #include "vm/jit/asmpart.h"
69 #if !defined(NDEBUG) && defined(ENABLE_INLINING)
70 extern bool inline_debug_log;
71 #define INLINELOG(code) do { if (inline_debug_log) { code } } while (0)
73 #define INLINELOG(code)
77 /* global variables ***********************************************************/
79 static s4 interfaceindex; /* sequential numbering of interfaces */
83 /* primitivetype_table *********************************************************
85 Structure for primitive classes: contains the class for wrapping
86 the primitive type, the primitive class, the name of the class for
87 wrapping, the one character type signature and the name of the
90 CAUTION: Don't change the order of the types. This table is indexed
91 by the ARRAYTYPE_ constants (except ARRAYTYPE_OBJECT).
93 *******************************************************************************/
95 primitivetypeinfo primitivetype_table[PRIMITIVETYPE_COUNT] = {
96 { NULL, NULL, "java/lang/Integer", 'I', "int" , "[I", NULL, NULL },
97 { NULL, NULL, "java/lang/Long", 'J', "long" , "[J", NULL, NULL },
98 { NULL, NULL, "java/lang/Float", 'F', "float" , "[F", NULL, NULL },
99 { NULL, NULL, "java/lang/Double", 'D', "double" , "[D", NULL, NULL },
100 { NULL, NULL, NULL, 0 , NULL , NULL, NULL, NULL },
101 { NULL, NULL, "java/lang/Byte", 'B', "byte" , "[B", NULL, NULL },
102 { NULL, NULL, "java/lang/Character", 'C', "char" , "[C", NULL, NULL },
103 { NULL, NULL, "java/lang/Short", 'S', "short" , "[S", NULL, NULL },
104 { NULL, NULL, "java/lang/Boolean", 'Z', "boolean" , "[Z", NULL, NULL },
105 { NULL, NULL, NULL, 0 , NULL , NULL, NULL, NULL },
106 #if defined(ENABLE_JAVASE)
107 { NULL, NULL, "java/lang/Void", 'V', "void" , NULL, NULL, NULL }
109 { NULL, NULL, NULL, 0 , NULL , NULL, NULL, NULL },
114 /* private functions **********************************************************/
116 static bool link_primitivetype_table(void);
117 static classinfo *link_class_intern(classinfo *c);
118 static arraydescriptor *link_array(classinfo *c);
119 static void linker_compute_class_values(classinfo *c);
120 static void linker_compute_subclasses(classinfo *c);
121 static bool linker_addinterface(classinfo *c, classinfo *ic);
122 static s4 class_highestinterface(classinfo *c);
125 /* linker_init *****************************************************************
127 Initializes the linker subsystem.
129 *******************************************************************************/
131 bool linker_init(void)
133 /* reset interface index */
137 /* link java.lang.Class as first class of the system, because we
138 need it's vftbl for all other classes so we can use a class as
141 if (!link_class(class_java_lang_Class))
144 /* now set the header.vftbl of all classes which were created
145 before java.lang.Class was linked */
147 class_postset_header_vftbl();
150 /* link important system classes */
152 if (!link_class(class_java_lang_Object))
155 if (!link_class(class_java_lang_String))
158 #if defined(ENABLE_JAVASE)
159 if (!link_class(class_java_lang_Cloneable))
162 if (!link_class(class_java_io_Serializable))
167 /* link classes for wrapping primitive types */
169 #if defined(ENABLE_JAVASE)
170 if (!link_class(class_java_lang_Void))
174 if (!link_class(class_java_lang_Boolean))
177 if (!link_class(class_java_lang_Byte))
180 if (!link_class(class_java_lang_Character))
183 if (!link_class(class_java_lang_Short))
186 if (!link_class(class_java_lang_Integer))
189 if (!link_class(class_java_lang_Long))
192 if (!link_class(class_java_lang_Float))
195 if (!link_class(class_java_lang_Double))
199 /* load some other important classes */
201 #if defined(ENABLE_JAVASE)
202 if (!link_class(class_java_lang_ClassLoader))
205 if (!link_class(class_java_lang_SecurityManager))
209 if (!link_class(class_java_lang_System))
212 if (!link_class(class_java_lang_Thread))
215 #if defined(ENABLE_JAVASE)
216 if (!link_class(class_java_lang_ThreadGroup))
220 #if defined(WITH_CLASSPATH_GNU)
221 if (!link_class(class_java_lang_VMSystem))
224 if (!link_class(class_java_lang_VMThread))
229 /* some classes which may be used more often */
231 #if defined(ENABLE_JAVASE)
232 if (!link_class(class_java_lang_StackTraceElement))
235 if (!link_class(class_java_lang_reflect_Constructor))
238 if (!link_class(class_java_lang_reflect_Field))
241 if (!link_class(class_java_lang_reflect_Method))
244 if (!link_class(class_java_security_PrivilegedAction))
247 if (!link_class(class_java_util_Vector))
250 if (!link_class(arrayclass_java_lang_Object))
255 /* create pseudo classes used by the typechecker */
257 /* pseudo class for Arraystubs (extends java.lang.Object) */
259 pseudo_class_Arraystub =
260 class_create_classinfo(utf_new_char("$ARRAYSTUB$"));
261 pseudo_class_Arraystub->state |= CLASS_LOADED;
262 pseudo_class_Arraystub->super.cls = class_java_lang_Object;
264 #if defined(ENABLE_JAVASE)
265 pseudo_class_Arraystub->interfacescount = 2;
266 pseudo_class_Arraystub->interfaces = MNEW(classref_or_classinfo, 2);
267 pseudo_class_Arraystub->interfaces[0].cls = class_java_lang_Cloneable;
268 pseudo_class_Arraystub->interfaces[1].cls = class_java_io_Serializable;
269 #elif defined(ENABLE_JAVAME_CLDC1_1)
270 pseudo_class_Arraystub->interfacescount = 0;
271 pseudo_class_Arraystub->interfaces = NULL;
274 if (!classcache_store_unique(pseudo_class_Arraystub)) {
275 log_text("could not cache pseudo_class_Arraystub");
279 if (!link_class(pseudo_class_Arraystub))
282 /* pseudo class representing the null type */
284 pseudo_class_Null = class_create_classinfo(utf_new_char("$NULL$"));
285 pseudo_class_Null->state |= CLASS_LOADED;
286 pseudo_class_Null->super.cls = class_java_lang_Object;
288 if (!classcache_store_unique(pseudo_class_Null)) {
289 log_text("could not cache pseudo_class_Null");
293 if (!link_class(pseudo_class_Null))
296 /* pseudo class representing new uninitialized objects */
298 pseudo_class_New = class_create_classinfo(utf_new_char("$NEW$"));
299 pseudo_class_New->state |= CLASS_LOADED;
300 pseudo_class_New->state |= CLASS_LINKED; /* XXX is this allright? */
301 pseudo_class_New->super.cls = class_java_lang_Object;
303 if (!classcache_store_unique(pseudo_class_New)) {
304 log_text("could not cache pseudo_class_New");
308 /* create classes representing primitive types */
310 if (!link_primitivetype_table())
314 /* Correct vftbl-entries (retarded loading and linking of class */
315 /* java/lang/String). */
317 stringtable_update();
323 /* link_primitivetype_table ****************************************************
325 Create classes representing primitive types.
327 *******************************************************************************/
329 static bool link_primitivetype_table(void)
335 for (i = 0; i < PRIMITIVETYPE_COUNT; i++) {
338 if (!primitivetype_table[i].name)
341 /* create primitive class */
343 c = class_create_classinfo(utf_new_char(primitivetype_table[i].name));
345 c->flags = ACC_PUBLIC | ACC_FINAL | ACC_ABSTRACT;
347 /* prevent loader from loading primitive class */
349 c->state |= CLASS_LOADED;
351 /* INFO: don't put primitive classes into the classcache */
356 primitivetype_table[i].class_primitive = c;
358 /* create class for wrapping the primitive type */
360 u = utf_new_char(primitivetype_table[i].wrapname);
362 if (!(c = load_class_bootstrap(u)))
365 primitivetype_table[i].class_wrap = c;
367 /* create the primitive array class */
369 if (primitivetype_table[i].arrayname) {
370 u = utf_new_char(primitivetype_table[i].arrayname);
371 c = class_create_classinfo(u);
372 c = load_newly_created_array(c, NULL);
376 primitivetype_table[i].arrayclass = c;
378 assert(c->state & CLASS_LOADED);
380 if (!(c->state & CLASS_LINKED))
384 primitivetype_table[i].arrayvftbl = c->vftbl;
392 /* link_class ******************************************************************
394 Wrapper function for link_class_intern to ease monitor enter/exit
395 and exception handling.
397 *******************************************************************************/
399 classinfo *link_class(classinfo *c)
402 #if defined(ENABLE_RT_TIMING)
403 struct timespec time_start, time_end;
406 RT_TIMING_GET_TIME(time_start);
409 exceptions_throw_nullpointerexception();
413 LOCK_MONITOR_ENTER(c);
415 /* maybe the class is already linked */
417 if (c->state & CLASS_LINKED) {
418 LOCK_MONITOR_EXIT(c);
423 #if defined(ENABLE_STATISTICS)
426 if (opt_getcompilingtime)
427 compilingtime_stop();
429 if (opt_getloadingtime)
433 /* call the internal function */
435 r = link_class_intern(c);
437 /* if return value is NULL, we had a problem and the class is not linked */
440 c->state &= ~CLASS_LINKING;
442 #if defined(ENABLE_STATISTICS)
445 if (opt_getloadingtime)
448 if (opt_getcompilingtime)
449 compilingtime_start();
452 LOCK_MONITOR_EXIT(c);
454 RT_TIMING_GET_TIME(time_end);
456 RT_TIMING_TIME_DIFF(time_start,time_end,RT_TIMING_LINK_TOTAL);
462 /* linker_overwrite_method *****************************************************
464 Overwrite a method with another one, update method flags and check
468 mg................the general method being overwritten
469 ms................the overwriting (more specialized) method
470 wl................worklist where to add invalidated methods
473 true..............everything ok
474 false.............an exception has been thrown
476 *******************************************************************************/
478 static bool linker_overwrite_method(methodinfo *mg,
480 method_worklist **wl)
488 /* overriding a final method is illegal */
490 if (mg->flags & ACC_FINAL) {
492 new_exception(string_java_lang_VerifyError);
496 /* method ms overwrites method mg */
498 #if defined(ENABLE_VERIFIER)
499 /* Add loading constraints (for the more general types of method mg). */
500 /* Not for <init>, as it is not invoked virtually. */
502 if ((ms->name != utf_init)
503 && !classcache_add_constraints_for_params(
504 cs->classloader, cg->classloader, mg))
510 /* inherit the vftbl index, and record the overwriting */
512 ms->vftblindex = mg->vftblindex;
515 /* update flags and check assumptions */
516 /* <init> methods are a special case, as they are never dispatched dynamically */
518 if ((ms->flags & ACC_METHOD_IMPLEMENTED) && ms->name != utf_init) {
520 if (mg->flags & ACC_METHOD_IMPLEMENTED) {
521 /* this adds another implementation */
523 mg->flags &= ~ACC_METHOD_MONOMORPHIC;
525 INLINELOG( printf("becomes polymorphic: "); method_println(mg); );
527 method_break_assumption_monomorphic(mg, wl);
530 /* this is the first implementation */
532 mg->flags |= ACC_METHOD_IMPLEMENTED;
534 INLINELOG( printf("becomes implemented: "); method_println(mg); );
539 } while (mg != NULL);
546 /* link_class_intern ***********************************************************
548 Tries to link a class. The function calculates the length in bytes
549 that an instance of this class requires as well as the VTBL for
550 methods and interface methods.
552 *******************************************************************************/
554 static classinfo *link_class_intern(classinfo *c)
556 classinfo *super; /* super class */
557 classinfo *tc; /* temporary class variable */
558 s4 supervftbllength; /* vftbllegnth of super class */
559 s4 vftbllength; /* vftbllength of current class */
560 s4 interfacetablelength; /* interface table length */
561 vftbl_t *v; /* vftbl of current class */
562 s4 i; /* interface/method/field counter */
563 arraydescriptor *arraydesc; /* descriptor for array classes */
564 method_worklist *worklist; /* worklist for recompilation */
565 #if defined(ENABLE_RT_TIMING)
566 struct timespec time_start, time_resolving, time_compute_vftbl,
567 time_abstract, time_compute_iftbl, time_fill_vftbl,
568 time_offsets, time_fill_iftbl, time_finalizer,
572 RT_TIMING_GET_TIME(time_start);
574 /* the class is already linked */
576 if (c->state & CLASS_LINKED)
581 log_message_class("Linking class: ", c);
584 /* the class must be loaded */
586 /* XXX should this be a specific exception? */
587 assert(c->state & CLASS_LOADED);
589 /* cache the self-reference of this class */
590 /* we do this for cases where the defining loader of the class */
591 /* has not yet been recorded as an initiating loader for the class */
592 /* this is needed so subsequent code can assume that self-refs */
593 /* will always resolve lazily */
594 /* No need to do it for the bootloader - it is always registered */
595 /* as initiating loader for the classes it loads. */
597 classcache_store(c->classloader,c,false);
599 /* this class is currently linking */
601 c->state |= CLASS_LINKING;
606 /* check interfaces */
608 for (i = 0; i < c->interfacescount; i++) {
609 /* resolve this super interface */
611 if (!resolve_classref_or_classinfo(NULL, c->interfaces[i], resolveEager,
615 c->interfaces[i].cls = tc;
617 /* detect circularity */
621 new_exception_utfmessage(string_java_lang_ClassCircularityError,
626 assert(tc->state & CLASS_LOADED);
628 if (!(tc->flags & ACC_INTERFACE)) {
630 new_exception_message(string_java_lang_IncompatibleClassChangeError,
631 "Implementing class");
635 if (!(tc->state & CLASS_LINKED))
640 /* check super class */
644 if (c->super.any == NULL) { /* class java.lang.Object */
646 c->instancesize = sizeof(java_objectheader);
648 vftbllength = supervftbllength = 0;
653 /* resolve super class */
655 if (!resolve_classref_or_classinfo(NULL, c->super, resolveEager, true, false,
658 c->super.cls = super;
660 /* detect circularity */
664 new_exception_utfmessage(string_java_lang_ClassCircularityError,
669 assert(super->state & CLASS_LOADED);
671 if (super->flags & ACC_INTERFACE) {
672 /* java.lang.IncompatibleClassChangeError: class a has interface java.lang.Cloneable as super class */
673 log_text("Interface specified as super class");
677 /* Don't allow extending final classes */
679 if (super->flags & ACC_FINAL) {
681 new_exception_message(string_java_lang_VerifyError,
682 "Cannot inherit from final class");
686 /* link the superclass if necessary */
688 if (!(super->state & CLASS_LINKED))
689 if (!link_class(super))
692 /* OR the ACC_CLASS_HAS_POINTERS flag */
694 c->flags |= (super->flags & ACC_CLASS_HAS_POINTERS);
696 /* handle array classes */
698 if (c->name->text[0] == '[')
699 if (!(arraydesc = link_array(c)))
702 if (c->flags & ACC_INTERFACE)
703 c->index = interfaceindex++;
705 c->index = super->index + 1;
707 c->instancesize = super->instancesize;
709 vftbllength = supervftbllength = super->vftbl->vftbllength;
711 c->finalizer = super->finalizer;
713 RT_TIMING_GET_TIME(time_resolving);
716 /* compute vftbl length */
718 for (i = 0; i < c->methodscount; i++) {
719 methodinfo *m = &(c->methods[i]);
721 if (!(m->flags & ACC_STATIC)) { /* is instance method */
727 for (j = 0; j < tc->methodscount; j++) {
728 if (method_canoverwrite(m, &(tc->methods[j]))) {
729 if (tc->methods[j].flags & ACC_PRIVATE)
730 goto notfoundvftblindex;
732 /* package-private methods in other packages */
733 /* must not be overridden */
734 /* (see Java Language Specification 8.4.8.1) */
735 if ( !(tc->methods[j].flags & (ACC_PUBLIC | ACC_PROTECTED))
736 && !SAME_PACKAGE(c,tc) )
738 goto notfoundvftblindex;
741 if (!linker_overwrite_method(&(tc->methods[j]), m, &worklist))
744 goto foundvftblindex;
752 m->vftblindex = (vftbllength++);
757 RT_TIMING_GET_TIME(time_compute_vftbl);
760 /* Check all interfaces of an abstract class (maybe be an
761 interface too) for unimplemented methods. Such methods are
762 called miranda-methods and are marked with the ACC_MIRANDA
763 flag. VMClass.getDeclaredMethods does not return such
766 if (c->flags & ACC_ABSTRACT) {
769 s4 abstractmethodscount;
773 abstractmethodscount = 0;
775 /* check all interfaces of the abstract class */
777 for (i = 0; i < c->interfacescount; i++) {
778 ic = c->interfaces[i].cls;
780 for (j = 0; j < ic->methodscount; j++) {
781 im = &(ic->methods[j]);
783 /* skip `<clinit>' and `<init>' */
785 if ((im->name == utf_clinit) || (im->name == utf_init))
788 for (tc = c; tc != NULL; tc = tc->super.cls) {
789 for (k = 0; k < tc->methodscount; k++) {
790 if (method_canoverwrite(im, &(tc->methods[k])))
791 goto noabstractmethod;
795 abstractmethodscount++;
802 if (abstractmethodscount > 0) {
805 /* reallocate methods memory */
807 c->methods = MREALLOC(c->methods, methodinfo, c->methodscount,
808 c->methodscount + abstractmethodscount);
810 for (i = 0; i < c->interfacescount; i++) {
811 ic = c->interfaces[i].cls;
813 for (j = 0; j < ic->methodscount; j++) {
814 im = &(ic->methods[j]);
816 /* skip `<clinit>' and `<init>' */
818 if ((im->name == utf_clinit) || (im->name == utf_init))
821 for (tc = c; tc != NULL; tc = tc->super.cls) {
822 for (k = 0; k < tc->methodscount; k++) {
823 if (method_canoverwrite(im, &(tc->methods[k])))
824 goto noabstractmethod2;
828 /* Copy the method found into the new c->methods
829 array and tag it as miranda-method. */
831 am = &(c->methods[c->methodscount]);
834 MCOPY(am, im, methodinfo, 1);
836 am->vftblindex = (vftbllength++);
838 am->flags |= ACC_MIRANDA;
846 RT_TIMING_GET_TIME(time_abstract);
849 #if defined(ENABLE_STATISTICS)
852 sizeof(vftbl_t) + (sizeof(methodptr) * (vftbllength - 1));
855 /* compute interfacetable length */
857 interfacetablelength = 0;
859 for (tc = c; tc != NULL; tc = tc->super.cls) {
860 for (i = 0; i < tc->interfacescount; i++) {
861 s4 h = class_highestinterface(tc->interfaces[i].cls) + 1;
863 if (h > interfacetablelength)
864 interfacetablelength = h;
867 RT_TIMING_GET_TIME(time_compute_iftbl);
869 /* allocate virtual function table */
871 v = (vftbl_t *) mem_alloc(sizeof(vftbl_t) +
872 sizeof(methodptr) * (vftbllength - 1) +
873 sizeof(methodptr*) * (interfacetablelength - (interfacetablelength > 0)));
874 v = (vftbl_t *) (((methodptr *) v) +
875 (interfacetablelength - 1) * (interfacetablelength > 1));
879 v->vftbllength = vftbllength;
880 v->interfacetablelength = interfacetablelength;
881 v->arraydesc = arraydesc;
883 /* store interface index in vftbl */
885 if (c->flags & ACC_INTERFACE)
886 v->baseval = -(c->index);
888 /* copy virtual function table of super class */
890 for (i = 0; i < supervftbllength; i++)
891 v->table[i] = super->vftbl->table[i];
893 /* Fill the remaining vftbl slots with the AbstractMethodError
894 stub (all after the super class slots, because they are already
897 for (; i < vftbllength; i++) {
898 #if defined(ENABLE_JIT)
899 # if defined(ENABLE_INTRP)
901 v->table[i] = (methodptr) (ptrint) &intrp_asm_abstractmethoderror;
904 v->table[i] = (methodptr) (ptrint) &asm_abstractmethoderror;
906 v->table[i] = (methodptr) (ptrint) &intrp_asm_abstractmethoderror;
910 /* add method stubs into virtual function table */
912 for (i = 0; i < c->methodscount; i++) {
913 methodinfo *m = &(c->methods[i]);
915 assert(m->stubroutine == NULL);
917 /* Don't create a compiler stub for abstract methods as they
918 throw an AbstractMethodError with the default stub in the
919 vftbl. This entry is simply copied by sub-classes. */
921 if (m->flags & ACC_ABSTRACT)
924 #if defined(ENABLE_JIT)
925 # if defined(ENABLE_INTRP)
927 m->stubroutine = intrp_createcompilerstub(m);
930 m->stubroutine = createcompilerstub(m);
932 m->stubroutine = intrp_createcompilerstub(m);
935 /* static methods are not in the vftbl */
937 if (m->flags & ACC_STATIC)
940 /* insert the stubroutine into the vftbl */
942 v->table[m->vftblindex] = (methodptr) (ptrint) m->stubroutine;
944 RT_TIMING_GET_TIME(time_fill_vftbl);
946 /* compute instance size and offset of each field */
948 for (i = 0; i < c->fieldscount; i++) {
950 fieldinfo *f = &(c->fields[i]);
952 if (!(f->flags & ACC_STATIC)) {
953 dsize = descriptor_typesize(f->parseddesc);
955 /* On i386 we only align to 4 bytes even for double and s8. */
956 /* This matches what gcc does for struct members. We must */
957 /* do the same as gcc here because the offsets in native */
958 /* header structs like java_lang_Double must match the offsets */
959 /* of the Java fields (eg. java.lang.Double.value). */
960 #if defined(__I386__)
961 c->instancesize = MEMORY_ALIGN(c->instancesize, 4);
963 c->instancesize = MEMORY_ALIGN(c->instancesize, dsize);
966 f->offset = c->instancesize;
967 c->instancesize += dsize;
970 RT_TIMING_GET_TIME(time_offsets);
972 /* initialize interfacetable and interfacevftbllength */
974 v->interfacevftbllength = MNEW(s4, interfacetablelength);
976 #if defined(ENABLE_STATISTICS)
978 count_vftbl_len += (4 + sizeof(s4)) * v->interfacetablelength;
981 for (i = 0; i < interfacetablelength; i++) {
982 v->interfacevftbllength[i] = 0;
983 v->interfacetable[-i] = NULL;
988 for (tc = c; tc != NULL; tc = tc->super.cls)
989 for (i = 0; i < tc->interfacescount; i++)
990 if (!linker_addinterface(c, tc->interfaces[i].cls))
993 RT_TIMING_GET_TIME(time_fill_iftbl);
995 /* add finalizer method (not for java.lang.Object) */
1000 fi = class_findmethod(c, utf_finalize, utf_void__void);
1003 if (!(fi->flags & ACC_STATIC))
1006 RT_TIMING_GET_TIME(time_finalizer);
1010 linker_compute_subclasses(c);
1012 RT_TIMING_GET_TIME(time_subclasses);
1014 /* revert the linking state and class is linked */
1016 c->state = (c->state & ~CLASS_LINKING) | CLASS_LINKED;
1018 /* check worklist */
1020 /* XXX must this also be done in case of exception? */
1022 while (worklist != NULL) {
1023 method_worklist *wi = worklist;
1025 worklist = worklist->next;
1027 INLINELOG( printf("MUST BE RECOMPILED: "); method_println(wi->m); );
1028 jit_invalidate_code(wi->m);
1030 /* XXX put worklist into dump memory? */
1031 FREE(wi, method_worklist);
1034 #if !defined(NDEBUG)
1036 log_message_class("Linking done class: ", c);
1039 RT_TIMING_TIME_DIFF(time_start ,time_resolving ,RT_TIMING_LINK_RESOLVE);
1040 RT_TIMING_TIME_DIFF(time_resolving ,time_compute_vftbl,RT_TIMING_LINK_C_VFTBL);
1041 RT_TIMING_TIME_DIFF(time_compute_vftbl,time_abstract ,RT_TIMING_LINK_ABSTRACT);
1042 RT_TIMING_TIME_DIFF(time_abstract ,time_compute_iftbl,RT_TIMING_LINK_C_IFTBL);
1043 RT_TIMING_TIME_DIFF(time_compute_iftbl,time_fill_vftbl ,RT_TIMING_LINK_F_VFTBL);
1044 RT_TIMING_TIME_DIFF(time_fill_vftbl ,time_offsets ,RT_TIMING_LINK_OFFSETS);
1045 RT_TIMING_TIME_DIFF(time_offsets ,time_fill_iftbl ,RT_TIMING_LINK_F_IFTBL);
1046 RT_TIMING_TIME_DIFF(time_fill_iftbl ,time_finalizer ,RT_TIMING_LINK_FINALIZER);
1047 RT_TIMING_TIME_DIFF(time_finalizer ,time_subclasses ,RT_TIMING_LINK_SUBCLASS);
1049 /* just return c to show that we didn't had a problem */
1055 /* link_array ******************************************************************
1057 This function is called by link_class to create the arraydescriptor
1060 This function returns NULL if the array cannot be linked because
1061 the component type has not been linked yet.
1063 *******************************************************************************/
1065 static arraydescriptor *link_array(classinfo *c)
1069 arraydescriptor *desc;
1074 namelen = c->name->blength;
1076 /* Check the component type */
1078 switch (c->name->text[1]) {
1080 /* c is an array of arrays. */
1081 u = utf_new(c->name->text + 1, namelen - 1);
1082 if (!(comp = load_class_from_classloader(u, c->classloader)))
1087 /* c is an array of objects. */
1088 u = utf_new(c->name->text + 2, namelen - 3);
1089 if (!(comp = load_class_from_classloader(u, c->classloader)))
1094 /* If the component type has not been linked, link it now */
1096 assert(!comp || (comp->state & CLASS_LOADED));
1098 if (comp && !(comp->state & CLASS_LINKED))
1099 if (!link_class(comp))
1102 /* Allocate the arraydescriptor */
1104 desc = NEW(arraydescriptor);
1107 /* c is an array of references */
1108 desc->arraytype = ARRAYTYPE_OBJECT;
1109 desc->componentsize = sizeof(void*);
1110 desc->dataoffset = OFFSET(java_objectarray, data);
1112 compvftbl = comp->vftbl;
1115 log_text("Component class has no vftbl");
1119 desc->componentvftbl = compvftbl;
1121 if (compvftbl->arraydesc) {
1122 desc->elementvftbl = compvftbl->arraydesc->elementvftbl;
1124 if (compvftbl->arraydesc->dimension >= 255) {
1125 log_text("Creating array of dimension >255");
1129 desc->dimension = compvftbl->arraydesc->dimension + 1;
1130 desc->elementtype = compvftbl->arraydesc->elementtype;
1133 desc->elementvftbl = compvftbl;
1134 desc->dimension = 1;
1135 desc->elementtype = ARRAYTYPE_OBJECT;
1139 /* c is an array of a primitive type */
1140 switch (c->name->text[1]) {
1142 desc->arraytype = ARRAYTYPE_BOOLEAN;
1143 desc->dataoffset = OFFSET(java_booleanarray,data);
1144 desc->componentsize = sizeof(u1);
1148 desc->arraytype = ARRAYTYPE_BYTE;
1149 desc->dataoffset = OFFSET(java_bytearray,data);
1150 desc->componentsize = sizeof(u1);
1154 desc->arraytype = ARRAYTYPE_CHAR;
1155 desc->dataoffset = OFFSET(java_chararray,data);
1156 desc->componentsize = sizeof(u2);
1160 desc->arraytype = ARRAYTYPE_DOUBLE;
1161 desc->dataoffset = OFFSET(java_doublearray,data);
1162 desc->componentsize = sizeof(double);
1166 desc->arraytype = ARRAYTYPE_FLOAT;
1167 desc->dataoffset = OFFSET(java_floatarray,data);
1168 desc->componentsize = sizeof(float);
1172 desc->arraytype = ARRAYTYPE_INT;
1173 desc->dataoffset = OFFSET(java_intarray,data);
1174 desc->componentsize = sizeof(s4);
1178 desc->arraytype = ARRAYTYPE_LONG;
1179 desc->dataoffset = OFFSET(java_longarray,data);
1180 desc->componentsize = sizeof(s8);
1184 desc->arraytype = ARRAYTYPE_SHORT;
1185 desc->dataoffset = OFFSET(java_shortarray,data);
1186 desc->componentsize = sizeof(s2);
1190 *exceptionptr = new_noclassdeffounderror(c->name);
1194 desc->componentvftbl = NULL;
1195 desc->elementvftbl = NULL;
1196 desc->dimension = 1;
1197 desc->elementtype = desc->arraytype;
1204 /* linker_compute_subclasses ***************************************************
1208 *******************************************************************************/
1210 static void linker_compute_subclasses(classinfo *c)
1212 #if defined(ENABLE_THREADS)
1216 if (!(c->flags & ACC_INTERFACE)) {
1221 if (!(c->flags & ACC_INTERFACE) && (c->super.any != NULL)) {
1222 c->nextsub = c->super.cls->sub;
1223 c->super.cls->sub = c;
1228 /* compute class values */
1230 linker_compute_class_values(class_java_lang_Object);
1232 #if defined(ENABLE_THREADS)
1238 /* linker_compute_class_values *************************************************
1242 *******************************************************************************/
1244 static void linker_compute_class_values(classinfo *c)
1248 c->vftbl->baseval = ++classvalue;
1253 linker_compute_class_values(subs);
1255 subs = subs->nextsub;
1258 c->vftbl->diffval = classvalue - c->vftbl->baseval;
1262 /* linker_addinterface *********************************************************
1264 Is needed by link_class for adding a VTBL to a class. All
1265 interfaces implemented by ic are added as well.
1268 true.........everything ok
1269 false........an exception has been thrown
1271 *******************************************************************************/
1273 static bool linker_addinterface(classinfo *c, classinfo *ic)
1284 if (i >= v->interfacetablelength)
1285 vm_abort("Internal error: interfacetable overflow");
1287 /* if this interface has already been added, return immediately */
1289 if (v->interfacetable[-i] != NULL)
1292 if (ic->methodscount == 0) { /* fake entry needed for subtype test */
1293 v->interfacevftbllength[i] = 1;
1294 v->interfacetable[-i] = MNEW(methodptr, 1);
1295 v->interfacetable[-i][0] = NULL;
1298 v->interfacevftbllength[i] = ic->methodscount;
1299 v->interfacetable[-i] = MNEW(methodptr, ic->methodscount);
1301 #if defined(ENABLE_STATISTICS)
1303 count_vftbl_len += sizeof(methodptr) *
1304 (ic->methodscount + (ic->methodscount == 0));
1307 for (j = 0; j < ic->methodscount; j++) {
1308 for (sc = c; sc != NULL; sc = sc->super.cls) {
1309 for (k = 0; k < sc->methodscount; k++) {
1310 m = &(sc->methods[k]);
1312 if (method_canoverwrite(m, &(ic->methods[j]))) {
1313 /* method m overwrites the (abstract) method */
1314 #if defined(ENABLE_VERIFIER)
1315 /* Add loading constraints (for the more
1316 general types of the method
1318 if (!classcache_add_constraints_for_params(
1319 c->classloader, ic->classloader,
1326 /* XXX taken from gcj */
1327 /* check for ACC_STATIC: IncompatibleClassChangeError */
1329 /* check for !ACC_PUBLIC: IllegalAccessError */
1331 /* check for ACC_ABSTRACT: AbstracMethodError,
1332 not sure about that one */
1334 v->interfacetable[-i][j] = v->table[m->vftblindex];
1340 /* If no method was found, insert the AbstractMethodError
1343 #if defined(ENABLE_JIT)
1344 # if defined(ENABLE_INTRP)
1346 v->interfacetable[-i][j] =
1347 (methodptr) (ptrint) &intrp_asm_abstractmethoderror;
1350 v->interfacetable[-i][j] =
1351 (methodptr) (ptrint) &asm_abstractmethoderror;
1353 v->interfacetable[-i][j] =
1354 (methodptr) (ptrint) &intrp_asm_abstractmethoderror;
1362 /* add superinterfaces of this interface */
1364 for (j = 0; j < ic->interfacescount; j++)
1365 if (!linker_addinterface(c, ic->interfaces[j].cls))
1374 /* class_highestinterface ******************************************************
1376 Used by the function link_class to determine the amount of memory
1377 needed for the interface table.
1379 *******************************************************************************/
1381 static s4 class_highestinterface(classinfo *c)
1387 /* check for ACC_INTERFACE bit already done in link_class_intern */
1391 for (i = 0; i < c->interfacescount; i++) {
1392 h2 = class_highestinterface(c->interfaces[i].cls);
1403 * These are local overrides for various environment variables in Emacs.
1404 * Please do not remove this and leave it at the end of the file, where
1405 * Emacs will automagically detect them.
1406 * ---------------------------------------------------------------------
1409 * indent-tabs-mode: t
1413 * vim:noexpandtab:sw=4:ts=4: