1 /* src/vmcore/linker.c - class linker functions
3 Copyright (C) 1996-2005, 2006, 2007 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 $Id: linker.c 7601 2007-03-28 23:02:50Z michi $
36 #include "mm/memory.h"
37 #include "native/native.h"
39 #if defined(ENABLE_THREADS)
40 # include "threads/native/lock.h"
42 # include "threads/none/lock.h"
45 #include "toolbox/logging.h"
47 #include "vm/access.h"
48 #include "vm/exceptions.h"
49 #include "vm/stringlocal.h"
52 #include "vm/jit_interface.h"
54 #include "vmcore/class.h"
55 #include "vmcore/classcache.h"
56 #include "vmcore/loader.h"
57 #include "vmcore/options.h"
58 #include "vmcore/rt-timing.h"
60 /* #include "vm/resolve.h" */
61 /* copied prototype to avoid bootstrapping problem: */
62 classinfo *resolve_classref_or_classinfo_eager(classref_or_classinfo cls, bool checkaccess);
64 #if defined(ENABLE_STATISTICS)
65 # include "vmcore/statistics.h"
68 #if !defined(NDEBUG) && defined(ENABLE_INLINING)
69 #define INLINELOG(code) do { if (opt_inline_debug_log) { code } } while (0)
71 #define INLINELOG(code)
75 /* global variables ***********************************************************/
77 static s4 interfaceindex; /* sequential numbering of interfaces */
81 /* primitivetype_table *********************************************************
83 Structure for primitive classes: contains the class for wrapping
84 the primitive type, the primitive class, the name of the class for
85 wrapping, the one character type signature and the name of the
88 CAUTION: Don't change the order of the types. This table is indexed
89 by the ARRAYTYPE_ constants (except ARRAYTYPE_OBJECT).
91 *******************************************************************************/
93 primitivetypeinfo primitivetype_table[PRIMITIVETYPE_COUNT] = {
94 { NULL, NULL, "java/lang/Integer", 'I', "int" , "[I", NULL, NULL },
95 { NULL, NULL, "java/lang/Long", 'J', "long" , "[J", NULL, NULL },
96 { NULL, NULL, "java/lang/Float", 'F', "float" , "[F", NULL, NULL },
97 { NULL, NULL, "java/lang/Double", 'D', "double" , "[D", NULL, NULL },
98 { NULL, NULL, NULL, 0 , NULL , NULL, NULL, NULL },
99 { NULL, NULL, "java/lang/Byte", 'B', "byte" , "[B", NULL, NULL },
100 { NULL, NULL, "java/lang/Character", 'C', "char" , "[C", NULL, NULL },
101 { NULL, NULL, "java/lang/Short", 'S', "short" , "[S", NULL, NULL },
102 { NULL, NULL, "java/lang/Boolean", 'Z', "boolean" , "[Z", NULL, NULL },
103 { NULL, NULL, NULL, 0 , NULL , NULL, NULL, NULL },
104 #if defined(ENABLE_JAVASE)
105 { NULL, NULL, "java/lang/Void", 'V', "void" , NULL, NULL, NULL }
107 { NULL, NULL, NULL, 0 , NULL , NULL, NULL, NULL },
112 /* private functions **********************************************************/
114 static bool link_primitivetype_table(void);
115 static classinfo *link_class_intern(classinfo *c);
116 static arraydescriptor *link_array(classinfo *c);
117 static void linker_compute_class_values(classinfo *c);
118 static void linker_compute_subclasses(classinfo *c);
119 static bool linker_addinterface(classinfo *c, classinfo *ic);
120 static s4 class_highestinterface(classinfo *c);
123 /* linker_init *****************************************************************
125 Initializes the linker subsystem.
127 *******************************************************************************/
129 bool linker_init(void)
131 /* reset interface index */
135 /* link java.lang.Class as first class of the system, because we
136 need it's vftbl for all other classes so we can use a class as
139 if (!link_class(class_java_lang_Class))
142 /* now set the header.vftbl of all classes which were created
143 before java.lang.Class was linked */
145 class_postset_header_vftbl();
148 /* link important system classes */
150 if (!link_class(class_java_lang_Object))
153 if (!link_class(class_java_lang_String))
156 #if defined(ENABLE_JAVASE)
157 if (!link_class(class_java_lang_Cloneable))
160 if (!link_class(class_java_io_Serializable))
165 /* link classes for wrapping primitive types */
167 #if defined(ENABLE_JAVASE)
168 if (!link_class(class_java_lang_Void))
172 if (!link_class(class_java_lang_Boolean))
175 if (!link_class(class_java_lang_Byte))
178 if (!link_class(class_java_lang_Character))
181 if (!link_class(class_java_lang_Short))
184 if (!link_class(class_java_lang_Integer))
187 if (!link_class(class_java_lang_Long))
190 if (!link_class(class_java_lang_Float))
193 if (!link_class(class_java_lang_Double))
197 /* load some other important classes */
199 #if defined(ENABLE_JAVASE)
200 if (!link_class(class_java_lang_ClassLoader))
203 if (!link_class(class_java_lang_SecurityManager))
207 if (!link_class(class_java_lang_System))
210 if (!link_class(class_java_lang_Thread))
213 #if defined(ENABLE_JAVASE)
214 if (!link_class(class_java_lang_ThreadGroup))
218 #if defined(WITH_CLASSPATH_GNU)
219 if (!link_class(class_java_lang_VMSystem))
222 if (!link_class(class_java_lang_VMThread))
227 /* some classes which may be used more often */
229 #if defined(ENABLE_JAVASE)
230 if (!link_class(class_java_lang_StackTraceElement))
233 if (!link_class(class_java_lang_reflect_Constructor))
236 if (!link_class(class_java_lang_reflect_Field))
239 if (!link_class(class_java_lang_reflect_Method))
242 if (!link_class(class_java_security_PrivilegedAction))
245 if (!link_class(class_java_util_Vector))
248 if (!link_class(arrayclass_java_lang_Object))
253 /* create pseudo classes used by the typechecker */
255 /* pseudo class for Arraystubs (extends java.lang.Object) */
257 pseudo_class_Arraystub =
258 class_create_classinfo(utf_new_char("$ARRAYSTUB$"));
259 pseudo_class_Arraystub->state |= CLASS_LOADED;
260 pseudo_class_Arraystub->super.cls = class_java_lang_Object;
262 #if defined(ENABLE_JAVASE)
263 pseudo_class_Arraystub->interfacescount = 2;
264 pseudo_class_Arraystub->interfaces = MNEW(classref_or_classinfo, 2);
265 pseudo_class_Arraystub->interfaces[0].cls = class_java_lang_Cloneable;
266 pseudo_class_Arraystub->interfaces[1].cls = class_java_io_Serializable;
267 #elif defined(ENABLE_JAVAME_CLDC1_1)
268 pseudo_class_Arraystub->interfacescount = 0;
269 pseudo_class_Arraystub->interfaces = NULL;
272 if (!classcache_store_unique(pseudo_class_Arraystub)) {
273 log_text("could not cache pseudo_class_Arraystub");
277 if (!link_class(pseudo_class_Arraystub))
280 /* pseudo class representing the null type */
282 pseudo_class_Null = class_create_classinfo(utf_new_char("$NULL$"));
283 pseudo_class_Null->state |= CLASS_LOADED;
284 pseudo_class_Null->super.cls = class_java_lang_Object;
286 if (!classcache_store_unique(pseudo_class_Null))
287 vm_abort("linker_init: could not cache pseudo_class_Null");
289 if (!link_class(pseudo_class_Null))
292 /* pseudo class representing new uninitialized objects */
294 pseudo_class_New = class_create_classinfo(utf_new_char("$NEW$"));
295 pseudo_class_New->state |= CLASS_LOADED;
296 pseudo_class_New->state |= CLASS_LINKED; /* XXX is this allright? */
297 pseudo_class_New->super.cls = class_java_lang_Object;
299 if (!classcache_store_unique(pseudo_class_New))
300 vm_abort("linker_init: could not cache pseudo_class_New");
302 /* create classes representing primitive types */
304 if (!link_primitivetype_table())
308 /* Correct vftbl-entries (retarded loading and linking of class
309 java/lang/String). */
311 stringtable_update();
317 /* link_primitivetype_table ****************************************************
319 Create classes representing primitive types.
321 *******************************************************************************/
323 static bool link_primitivetype_table(void)
329 for (i = 0; i < PRIMITIVETYPE_COUNT; i++) {
332 if (!primitivetype_table[i].name)
335 /* create primitive class */
337 c = class_create_classinfo(utf_new_char(primitivetype_table[i].name));
339 /* primitive classes don't have a super class */
343 /* set flags and mark it as primitive class */
345 c->flags = ACC_PUBLIC | ACC_FINAL | ACC_ABSTRACT | ACC_CLASS_PRIMITIVE;
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);
361 c = load_class_bootstrap(u);
366 primitivetype_table[i].class_wrap = c;
368 /* create the primitive array class */
370 if (primitivetype_table[i].arrayname) {
371 u = utf_new_char(primitivetype_table[i].arrayname);
372 c = class_create_classinfo(u);
373 c = load_newly_created_array(c, NULL);
378 primitivetype_table[i].arrayclass = c;
380 assert(c->state & CLASS_LOADED);
382 if (!(c->state & CLASS_LINKED))
386 primitivetype_table[i].arrayvftbl = c->vftbl;
394 /* link_class ******************************************************************
396 Wrapper function for link_class_intern to ease monitor enter/exit
397 and exception handling.
399 *******************************************************************************/
401 classinfo *link_class(classinfo *c)
404 #if defined(ENABLE_RT_TIMING)
405 struct timespec time_start, time_end;
408 RT_TIMING_GET_TIME(time_start);
411 exceptions_throw_nullpointerexception();
415 LOCK_MONITOR_ENTER(c);
417 /* maybe the class is already linked */
419 if (c->state & CLASS_LINKED) {
420 LOCK_MONITOR_EXIT(c);
425 #if defined(ENABLE_STATISTICS)
428 if (opt_getcompilingtime)
429 compilingtime_stop();
431 if (opt_getloadingtime)
435 /* call the internal function */
437 r = link_class_intern(c);
439 /* if return value is NULL, we had a problem and the class is not linked */
442 c->state &= ~CLASS_LINKING;
444 #if defined(ENABLE_STATISTICS)
447 if (opt_getloadingtime)
450 if (opt_getcompilingtime)
451 compilingtime_start();
454 LOCK_MONITOR_EXIT(c);
456 RT_TIMING_GET_TIME(time_end);
458 RT_TIMING_TIME_DIFF(time_start,time_end,RT_TIMING_LINK_TOTAL);
464 /* linker_overwrite_method *****************************************************
466 Overwrite a method with another one, update method flags and check
470 mg................the general method being overwritten
471 ms................the overwriting (more specialized) method
472 wl................worklist where to add invalidated methods
475 true..............everything ok
476 false.............an exception has been thrown
478 *******************************************************************************/
480 static bool linker_overwrite_method(methodinfo *mg,
482 method_worklist **wl)
490 /* overriding a final method is illegal */
492 if (mg->flags & ACC_FINAL) {
493 exceptions_throw_verifyerror(mg, "Overriding final method");
497 /* method ms overwrites method mg */
499 #if defined(ENABLE_VERIFIER)
500 /* Add loading constraints (for the more general types of method mg). */
501 /* Not for <init>, as it is not invoked virtually. */
503 if ((ms->name != utf_init)
504 && !classcache_add_constraints_for_params(
505 cs->classloader, cg->classloader, mg))
511 /* inherit the vftbl index, and record the overwriting */
513 ms->vftblindex = mg->vftblindex;
516 /* update flags and check assumptions */
517 /* <init> methods are a special case, as they are never dispatched dynamically */
519 if ((ms->flags & ACC_METHOD_IMPLEMENTED) && ms->name != utf_init) {
521 if (mg->flags & ACC_METHOD_IMPLEMENTED) {
522 /* this adds another implementation */
524 mg->flags &= ~ACC_METHOD_MONOMORPHIC;
526 INLINELOG( printf("becomes polymorphic: "); method_println(mg); );
528 method_break_assumption_monomorphic(mg, wl);
531 /* this is the first implementation */
533 mg->flags |= ACC_METHOD_IMPLEMENTED;
535 INLINELOG( printf("becomes implemented: "); method_println(mg); );
540 } while (mg != NULL);
547 /* link_class_intern ***********************************************************
549 Tries to link a class. The function calculates the length in bytes
550 that an instance of this class requires as well as the VTBL for
551 methods and interface methods.
553 *******************************************************************************/
555 static classinfo *link_class_intern(classinfo *c)
557 classinfo *super; /* super class */
558 classinfo *tc; /* temporary class variable */
559 s4 supervftbllength; /* vftbllegnth of super class */
560 s4 vftbllength; /* vftbllength of current class */
561 s4 interfacetablelength; /* interface table length */
562 vftbl_t *v; /* vftbl of current class */
563 s4 i; /* interface/method/field counter */
564 arraydescriptor *arraydesc; /* descriptor for array classes */
565 method_worklist *worklist; /* worklist for recompilation */
566 #if defined(ENABLE_RT_TIMING)
567 struct timespec time_start, time_resolving, time_compute_vftbl,
568 time_abstract, time_compute_iftbl, time_fill_vftbl,
569 time_offsets, time_fill_iftbl, time_finalizer,
573 RT_TIMING_GET_TIME(time_start);
575 /* the class is already linked */
577 if (c->state & CLASS_LINKED)
582 log_message_class("Linking class: ", c);
585 /* the class must be loaded */
587 /* XXX should this be a specific exception? */
588 assert(c->state & CLASS_LOADED);
590 /* cache the self-reference of this class */
591 /* we do this for cases where the defining loader of the class */
592 /* has not yet been recorded as an initiating loader for the class */
593 /* this is needed so subsequent code can assume that self-refs */
594 /* will always resolve lazily */
595 /* No need to do it for the bootloader - it is always registered */
596 /* as initiating loader for the classes it loads. */
598 classcache_store(c->classloader,c,false);
600 /* this class is currently linking */
602 c->state |= CLASS_LINKING;
607 /* check interfaces */
609 for (i = 0; i < c->interfacescount; i++) {
610 /* resolve this super interface */
612 if ((tc = resolve_classref_or_classinfo_eager(c->interfaces[i], true)) == NULL)
615 c->interfaces[i].cls = tc;
617 /* detect circularity */
620 exceptions_throw_classcircularityerror(c);
624 assert(tc->state & CLASS_LOADED);
626 if (!(tc->flags & ACC_INTERFACE)) {
627 exceptions_throw_incompatibleclasschangeerror(tc,
628 "Implementing class");
632 if (!(tc->state & CLASS_LINKED))
637 /* check super class */
641 if (c->super.any == NULL) { /* class java.lang.Object */
643 c->instancesize = sizeof(java_objectheader);
645 vftbllength = supervftbllength = 0;
650 /* resolve super class */
652 if ((super = resolve_classref_or_classinfo_eager(c->super, true)) == NULL)
655 c->super.cls = super;
657 /* detect circularity */
660 exceptions_throw_classcircularityerror(c);
664 assert(super->state & CLASS_LOADED);
666 if (super->flags & ACC_INTERFACE) {
667 /* java.lang.IncompatibleClassChangeError: class a has interface java.lang.Cloneable as super class */
668 log_text("Interface specified as super class");
672 /* Don't allow extending final classes */
674 if (super->flags & ACC_FINAL) {
675 exceptions_throw_verifyerror(NULL,
676 "Cannot inherit from final class");
680 /* link the superclass if necessary */
682 if (!(super->state & CLASS_LINKED))
683 if (!link_class(super))
686 /* OR the ACC_CLASS_HAS_POINTERS flag */
688 c->flags |= (super->flags & ACC_CLASS_HAS_POINTERS);
690 /* handle array classes */
692 if (c->name->text[0] == '[')
693 if (!(arraydesc = link_array(c)))
696 if (c->flags & ACC_INTERFACE)
697 c->index = interfaceindex++;
699 c->index = super->index + 1;
701 c->instancesize = super->instancesize;
703 vftbllength = supervftbllength = super->vftbl->vftbllength;
705 c->finalizer = super->finalizer;
707 RT_TIMING_GET_TIME(time_resolving);
710 /* compute vftbl length */
712 for (i = 0; i < c->methodscount; i++) {
713 methodinfo *m = &(c->methods[i]);
715 if (!(m->flags & ACC_STATIC)) { /* is instance method */
721 for (j = 0; j < tc->methodscount; j++) {
722 if (method_canoverwrite(m, &(tc->methods[j]))) {
723 if (tc->methods[j].flags & ACC_PRIVATE)
724 goto notfoundvftblindex;
726 /* package-private methods in other packages */
727 /* must not be overridden */
728 /* (see Java Language Specification 8.4.8.1) */
729 if ( !(tc->methods[j].flags & (ACC_PUBLIC | ACC_PROTECTED))
730 && !SAME_PACKAGE(c,tc) )
732 goto notfoundvftblindex;
735 if (!linker_overwrite_method(&(tc->methods[j]), m, &worklist))
738 goto foundvftblindex;
746 m->vftblindex = (vftbllength++);
751 RT_TIMING_GET_TIME(time_compute_vftbl);
754 /* Check all interfaces of an abstract class (maybe be an
755 interface too) for unimplemented methods. Such methods are
756 called miranda-methods and are marked with the ACC_MIRANDA
757 flag. VMClass.getDeclaredMethods does not return such
760 if (c->flags & ACC_ABSTRACT) {
763 s4 abstractmethodscount;
767 abstractmethodscount = 0;
769 /* check all interfaces of the abstract class */
771 for (i = 0; i < c->interfacescount; i++) {
772 ic = c->interfaces[i].cls;
774 for (j = 0; j < ic->methodscount; j++) {
775 im = &(ic->methods[j]);
777 /* skip `<clinit>' and `<init>' */
779 if ((im->name == utf_clinit) || (im->name == utf_init))
782 for (tc = c; tc != NULL; tc = tc->super.cls) {
783 for (k = 0; k < tc->methodscount; k++) {
784 if (method_canoverwrite(im, &(tc->methods[k])))
785 goto noabstractmethod;
789 abstractmethodscount++;
796 if (abstractmethodscount > 0) {
799 /* reallocate methods memory */
801 c->methods = MREALLOC(c->methods, methodinfo, c->methodscount,
802 c->methodscount + abstractmethodscount);
804 for (i = 0; i < c->interfacescount; i++) {
805 ic = c->interfaces[i].cls;
807 for (j = 0; j < ic->methodscount; j++) {
808 im = &(ic->methods[j]);
810 /* skip `<clinit>' and `<init>' */
812 if ((im->name == utf_clinit) || (im->name == utf_init))
815 for (tc = c; tc != NULL; tc = tc->super.cls) {
816 for (k = 0; k < tc->methodscount; k++) {
817 if (method_canoverwrite(im, &(tc->methods[k])))
818 goto noabstractmethod2;
822 /* Copy the method found into the new c->methods
823 array and tag it as miranda-method. */
825 am = &(c->methods[c->methodscount]);
828 MCOPY(am, im, methodinfo, 1);
830 am->vftblindex = (vftbllength++);
832 am->flags |= ACC_MIRANDA;
840 RT_TIMING_GET_TIME(time_abstract);
843 #if defined(ENABLE_STATISTICS)
846 sizeof(vftbl_t) + (sizeof(methodptr) * (vftbllength - 1));
849 /* compute interfacetable length */
851 interfacetablelength = 0;
853 for (tc = c; tc != NULL; tc = tc->super.cls) {
854 for (i = 0; i < tc->interfacescount; i++) {
855 s4 h = class_highestinterface(tc->interfaces[i].cls) + 1;
857 if (h > interfacetablelength)
858 interfacetablelength = h;
861 RT_TIMING_GET_TIME(time_compute_iftbl);
863 /* allocate virtual function table */
865 v = (vftbl_t *) mem_alloc(sizeof(vftbl_t) +
866 sizeof(methodptr) * (vftbllength - 1) +
867 sizeof(methodptr*) * (interfacetablelength - (interfacetablelength > 0)));
868 v = (vftbl_t *) (((methodptr *) v) +
869 (interfacetablelength - 1) * (interfacetablelength > 1));
873 v->vftbllength = vftbllength;
874 v->interfacetablelength = interfacetablelength;
875 v->arraydesc = arraydesc;
877 /* store interface index in vftbl */
879 if (c->flags & ACC_INTERFACE)
880 v->baseval = -(c->index);
882 /* copy virtual function table of super class */
884 for (i = 0; i < supervftbllength; i++)
885 v->table[i] = super->vftbl->table[i];
887 /* Fill the remaining vftbl slots with the AbstractMethodError
888 stub (all after the super class slots, because they are already
891 for (; i < vftbllength; i++) {
892 #if defined(ENABLE_JIT)
893 # if defined(ENABLE_INTRP)
895 v->table[i] = (methodptr) (ptrint) &intrp_asm_abstractmethoderror;
898 v->table[i] = (methodptr) (ptrint) &asm_abstractmethoderror;
900 v->table[i] = (methodptr) (ptrint) &intrp_asm_abstractmethoderror;
904 /* add method stubs into virtual function table */
906 for (i = 0; i < c->methodscount; i++) {
907 methodinfo *m = &(c->methods[i]);
909 assert(m->stubroutine == NULL);
911 /* Don't create a compiler stub for abstract methods as they
912 throw an AbstractMethodError with the default stub in the
913 vftbl. This entry is simply copied by sub-classes. */
915 if (m->flags & ACC_ABSTRACT)
918 #if defined(ENABLE_JIT)
919 # if defined(ENABLE_INTRP)
921 m->stubroutine = intrp_createcompilerstub(m);
924 m->stubroutine = createcompilerstub(m);
926 m->stubroutine = intrp_createcompilerstub(m);
929 /* static methods are not in the vftbl */
931 if (m->flags & ACC_STATIC)
934 /* insert the stubroutine into the vftbl */
936 v->table[m->vftblindex] = (methodptr) (ptrint) m->stubroutine;
938 RT_TIMING_GET_TIME(time_fill_vftbl);
940 /* compute instance size and offset of each field */
942 for (i = 0; i < c->fieldscount; i++) {
944 fieldinfo *f = &(c->fields[i]);
946 if (!(f->flags & ACC_STATIC)) {
947 dsize = descriptor_typesize(f->parseddesc);
949 #if defined(__I386__) || defined(__ARM__)
950 /* On i386 and ARM we align double and s8 fields to
951 4-bytes. This matches what GCC does for struct
952 members. We must do the same as gcc here because the
953 offsets in native header structs like java_lang_Double
954 must match the offsets of the Java fields
955 (eg. java.lang.Double.value). */
957 c->instancesize = MEMORY_ALIGN(c->instancesize, 4);
959 c->instancesize = MEMORY_ALIGN(c->instancesize, dsize);
962 f->offset = c->instancesize;
963 c->instancesize += dsize;
966 RT_TIMING_GET_TIME(time_offsets);
968 /* initialize interfacetable and interfacevftbllength */
970 v->interfacevftbllength = MNEW(s4, interfacetablelength);
972 #if defined(ENABLE_STATISTICS)
974 count_vftbl_len += (4 + sizeof(s4)) * v->interfacetablelength;
977 for (i = 0; i < interfacetablelength; i++) {
978 v->interfacevftbllength[i] = 0;
979 v->interfacetable[-i] = NULL;
984 for (tc = c; tc != NULL; tc = tc->super.cls)
985 for (i = 0; i < tc->interfacescount; i++)
986 if (!linker_addinterface(c, tc->interfaces[i].cls))
989 RT_TIMING_GET_TIME(time_fill_iftbl);
991 /* add finalizer method (not for java.lang.Object) */
996 fi = class_findmethod(c, utf_finalize, utf_void__void);
999 if (!(fi->flags & ACC_STATIC))
1002 RT_TIMING_GET_TIME(time_finalizer);
1006 linker_compute_subclasses(c);
1008 RT_TIMING_GET_TIME(time_subclasses);
1010 /* revert the linking state and class is linked */
1012 c->state = (c->state & ~CLASS_LINKING) | CLASS_LINKED;
1014 /* check worklist */
1016 /* XXX must this also be done in case of exception? */
1018 while (worklist != NULL) {
1019 method_worklist *wi = worklist;
1021 worklist = worklist->next;
1023 INLINELOG( printf("MUST BE RECOMPILED: "); method_println(wi->m); );
1024 jit_invalidate_code(wi->m);
1026 /* XXX put worklist into dump memory? */
1027 FREE(wi, method_worklist);
1030 #if !defined(NDEBUG)
1032 log_message_class("Linking done class: ", c);
1035 RT_TIMING_TIME_DIFF(time_start ,time_resolving ,RT_TIMING_LINK_RESOLVE);
1036 RT_TIMING_TIME_DIFF(time_resolving ,time_compute_vftbl,RT_TIMING_LINK_C_VFTBL);
1037 RT_TIMING_TIME_DIFF(time_compute_vftbl,time_abstract ,RT_TIMING_LINK_ABSTRACT);
1038 RT_TIMING_TIME_DIFF(time_abstract ,time_compute_iftbl,RT_TIMING_LINK_C_IFTBL);
1039 RT_TIMING_TIME_DIFF(time_compute_iftbl,time_fill_vftbl ,RT_TIMING_LINK_F_VFTBL);
1040 RT_TIMING_TIME_DIFF(time_fill_vftbl ,time_offsets ,RT_TIMING_LINK_OFFSETS);
1041 RT_TIMING_TIME_DIFF(time_offsets ,time_fill_iftbl ,RT_TIMING_LINK_F_IFTBL);
1042 RT_TIMING_TIME_DIFF(time_fill_iftbl ,time_finalizer ,RT_TIMING_LINK_FINALIZER);
1043 RT_TIMING_TIME_DIFF(time_finalizer ,time_subclasses ,RT_TIMING_LINK_SUBCLASS);
1045 /* just return c to show that we didn't had a problem */
1051 /* link_array ******************************************************************
1053 This function is called by link_class to create the arraydescriptor
1056 This function returns NULL if the array cannot be linked because
1057 the component type has not been linked yet.
1059 *******************************************************************************/
1061 static arraydescriptor *link_array(classinfo *c)
1065 arraydescriptor *desc;
1070 namelen = c->name->blength;
1072 /* Check the component type */
1074 switch (c->name->text[1]) {
1076 /* c is an array of arrays. */
1077 u = utf_new(c->name->text + 1, namelen - 1);
1078 if (!(comp = load_class_from_classloader(u, c->classloader)))
1083 /* c is an array of objects. */
1084 u = utf_new(c->name->text + 2, namelen - 3);
1085 if (!(comp = load_class_from_classloader(u, c->classloader)))
1090 /* If the component type has not been linked, link it now */
1092 assert(!comp || (comp->state & CLASS_LOADED));
1094 if (comp && !(comp->state & CLASS_LINKED))
1095 if (!link_class(comp))
1098 /* Allocate the arraydescriptor */
1100 desc = NEW(arraydescriptor);
1103 /* c is an array of references */
1104 desc->arraytype = ARRAYTYPE_OBJECT;
1105 desc->componentsize = sizeof(void*);
1106 desc->dataoffset = OFFSET(java_objectarray, data);
1108 compvftbl = comp->vftbl;
1111 log_text("Component class has no vftbl");
1115 desc->componentvftbl = compvftbl;
1117 if (compvftbl->arraydesc) {
1118 desc->elementvftbl = compvftbl->arraydesc->elementvftbl;
1120 if (compvftbl->arraydesc->dimension >= 255) {
1121 log_text("Creating array of dimension >255");
1125 desc->dimension = compvftbl->arraydesc->dimension + 1;
1126 desc->elementtype = compvftbl->arraydesc->elementtype;
1129 desc->elementvftbl = compvftbl;
1130 desc->dimension = 1;
1131 desc->elementtype = ARRAYTYPE_OBJECT;
1135 /* c is an array of a primitive type */
1136 switch (c->name->text[1]) {
1138 desc->arraytype = ARRAYTYPE_BOOLEAN;
1139 desc->dataoffset = OFFSET(java_booleanarray,data);
1140 desc->componentsize = sizeof(u1);
1144 desc->arraytype = ARRAYTYPE_BYTE;
1145 desc->dataoffset = OFFSET(java_bytearray,data);
1146 desc->componentsize = sizeof(u1);
1150 desc->arraytype = ARRAYTYPE_CHAR;
1151 desc->dataoffset = OFFSET(java_chararray,data);
1152 desc->componentsize = sizeof(u2);
1156 desc->arraytype = ARRAYTYPE_DOUBLE;
1157 desc->dataoffset = OFFSET(java_doublearray,data);
1158 desc->componentsize = sizeof(double);
1162 desc->arraytype = ARRAYTYPE_FLOAT;
1163 desc->dataoffset = OFFSET(java_floatarray,data);
1164 desc->componentsize = sizeof(float);
1168 desc->arraytype = ARRAYTYPE_INT;
1169 desc->dataoffset = OFFSET(java_intarray,data);
1170 desc->componentsize = sizeof(s4);
1174 desc->arraytype = ARRAYTYPE_LONG;
1175 desc->dataoffset = OFFSET(java_longarray,data);
1176 desc->componentsize = sizeof(s8);
1180 desc->arraytype = ARRAYTYPE_SHORT;
1181 desc->dataoffset = OFFSET(java_shortarray,data);
1182 desc->componentsize = sizeof(s2);
1186 exceptions_throw_noclassdeffounderror(c->name);
1190 desc->componentvftbl = NULL;
1191 desc->elementvftbl = NULL;
1192 desc->dimension = 1;
1193 desc->elementtype = desc->arraytype;
1200 /* linker_compute_subclasses ***************************************************
1204 *******************************************************************************/
1206 static void linker_compute_subclasses(classinfo *c)
1208 #if defined(ENABLE_THREADS)
1212 if (!(c->flags & ACC_INTERFACE)) {
1217 if (!(c->flags & ACC_INTERFACE) && (c->super.any != NULL)) {
1218 c->nextsub = c->super.cls->sub;
1219 c->super.cls->sub = c;
1224 /* compute class values */
1226 linker_compute_class_values(class_java_lang_Object);
1228 #if defined(ENABLE_THREADS)
1234 /* linker_compute_class_values *************************************************
1238 *******************************************************************************/
1240 static void linker_compute_class_values(classinfo *c)
1244 c->vftbl->baseval = ++classvalue;
1249 linker_compute_class_values(subs);
1251 subs = subs->nextsub;
1254 c->vftbl->diffval = classvalue - c->vftbl->baseval;
1258 /* linker_addinterface *********************************************************
1260 Is needed by link_class for adding a VTBL to a class. All
1261 interfaces implemented by ic are added as well.
1264 true.........everything ok
1265 false........an exception has been thrown
1267 *******************************************************************************/
1269 static bool linker_addinterface(classinfo *c, classinfo *ic)
1280 if (i >= v->interfacetablelength)
1281 vm_abort("Internal error: interfacetable overflow");
1283 /* if this interface has already been added, return immediately */
1285 if (v->interfacetable[-i] != NULL)
1288 if (ic->methodscount == 0) { /* fake entry needed for subtype test */
1289 v->interfacevftbllength[i] = 1;
1290 v->interfacetable[-i] = MNEW(methodptr, 1);
1291 v->interfacetable[-i][0] = NULL;
1294 v->interfacevftbllength[i] = ic->methodscount;
1295 v->interfacetable[-i] = MNEW(methodptr, ic->methodscount);
1297 #if defined(ENABLE_STATISTICS)
1299 count_vftbl_len += sizeof(methodptr) *
1300 (ic->methodscount + (ic->methodscount == 0));
1303 for (j = 0; j < ic->methodscount; j++) {
1304 for (sc = c; sc != NULL; sc = sc->super.cls) {
1305 for (k = 0; k < sc->methodscount; k++) {
1306 m = &(sc->methods[k]);
1308 if (method_canoverwrite(m, &(ic->methods[j]))) {
1309 /* method m overwrites the (abstract) method */
1310 #if defined(ENABLE_VERIFIER)
1311 /* Add loading constraints (for the more
1312 general types of the method
1314 if (!classcache_add_constraints_for_params(
1315 c->classloader, ic->classloader,
1322 /* XXX taken from gcj */
1323 /* check for ACC_STATIC: IncompatibleClassChangeError */
1325 /* check for !ACC_PUBLIC: IllegalAccessError */
1327 /* check for ACC_ABSTRACT: AbstracMethodError,
1328 not sure about that one */
1330 v->interfacetable[-i][j] = v->table[m->vftblindex];
1336 /* If no method was found, insert the AbstractMethodError
1339 #if defined(ENABLE_JIT)
1340 # if defined(ENABLE_INTRP)
1342 v->interfacetable[-i][j] =
1343 (methodptr) (ptrint) &intrp_asm_abstractmethoderror;
1346 v->interfacetable[-i][j] =
1347 (methodptr) (ptrint) &asm_abstractmethoderror;
1349 v->interfacetable[-i][j] =
1350 (methodptr) (ptrint) &intrp_asm_abstractmethoderror;
1358 /* add superinterfaces of this interface */
1360 for (j = 0; j < ic->interfacescount; j++)
1361 if (!linker_addinterface(c, ic->interfaces[j].cls))
1370 /* class_highestinterface ******************************************************
1372 Used by the function link_class to determine the amount of memory
1373 needed for the interface table.
1375 *******************************************************************************/
1377 static s4 class_highestinterface(classinfo *c)
1383 /* check for ACC_INTERFACE bit already done in link_class_intern */
1387 for (i = 0; i < c->interfacescount; i++) {
1388 h2 = class_highestinterface(c->interfaces[i].cls);
1399 * These are local overrides for various environment variables in Emacs.
1400 * Please do not remove this and leave it at the end of the file, where
1401 * Emacs will automagically detect them.
1402 * ---------------------------------------------------------------------
1405 * indent-tabs-mode: t
1409 * vim:noexpandtab:sw=4:ts=4: