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 7228 2007-01-19 01:13:48Z edwin $
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 #define INLINELOG(code) do { if (opt_inline_debug_log) { code } } while (0)
72 #define INLINELOG(code)
76 /* global variables ***********************************************************/
78 static s4 interfaceindex; /* sequential numbering of interfaces */
82 /* primitivetype_table *********************************************************
84 Structure for primitive classes: contains the class for wrapping
85 the primitive type, the primitive class, the name of the class for
86 wrapping, the one character type signature and the name of the
89 CAUTION: Don't change the order of the types. This table is indexed
90 by the ARRAYTYPE_ constants (except ARRAYTYPE_OBJECT).
92 *******************************************************************************/
94 primitivetypeinfo primitivetype_table[PRIMITIVETYPE_COUNT] = {
95 { NULL, NULL, "java/lang/Integer", 'I', "int" , "[I", NULL, NULL },
96 { NULL, NULL, "java/lang/Long", 'J', "long" , "[J", NULL, NULL },
97 { NULL, NULL, "java/lang/Float", 'F', "float" , "[F", NULL, NULL },
98 { NULL, NULL, "java/lang/Double", 'D', "double" , "[D", NULL, NULL },
99 { NULL, NULL, NULL, 0 , NULL , NULL, NULL, NULL },
100 { NULL, NULL, "java/lang/Byte", 'B', "byte" , "[B", NULL, NULL },
101 { NULL, NULL, "java/lang/Character", 'C', "char" , "[C", NULL, NULL },
102 { NULL, NULL, "java/lang/Short", 'S', "short" , "[S", NULL, NULL },
103 { NULL, NULL, "java/lang/Boolean", 'Z', "boolean" , "[Z", NULL, NULL },
104 { NULL, NULL, NULL, 0 , NULL , NULL, NULL, NULL },
105 #if defined(ENABLE_JAVASE)
106 { NULL, NULL, "java/lang/Void", 'V', "void" , NULL, NULL, NULL }
108 { NULL, NULL, NULL, 0 , NULL , NULL, NULL, NULL },
113 /* private functions **********************************************************/
115 static bool link_primitivetype_table(void);
116 static classinfo *link_class_intern(classinfo *c);
117 static arraydescriptor *link_array(classinfo *c);
118 static void linker_compute_class_values(classinfo *c);
119 static void linker_compute_subclasses(classinfo *c);
120 static bool linker_addinterface(classinfo *c, classinfo *ic);
121 static s4 class_highestinterface(classinfo *c);
124 /* linker_init *****************************************************************
126 Initializes the linker subsystem.
128 *******************************************************************************/
130 bool linker_init(void)
132 /* reset interface index */
136 /* link java.lang.Class as first class of the system, because we
137 need it's vftbl for all other classes so we can use a class as
140 if (!link_class(class_java_lang_Class))
143 /* now set the header.vftbl of all classes which were created
144 before java.lang.Class was linked */
146 class_postset_header_vftbl();
149 /* link important system classes */
151 if (!link_class(class_java_lang_Object))
154 if (!link_class(class_java_lang_String))
157 #if defined(ENABLE_JAVASE)
158 if (!link_class(class_java_lang_Cloneable))
161 if (!link_class(class_java_io_Serializable))
166 /* link classes for wrapping primitive types */
168 #if defined(ENABLE_JAVASE)
169 if (!link_class(class_java_lang_Void))
173 if (!link_class(class_java_lang_Boolean))
176 if (!link_class(class_java_lang_Byte))
179 if (!link_class(class_java_lang_Character))
182 if (!link_class(class_java_lang_Short))
185 if (!link_class(class_java_lang_Integer))
188 if (!link_class(class_java_lang_Long))
191 if (!link_class(class_java_lang_Float))
194 if (!link_class(class_java_lang_Double))
198 /* load some other important classes */
200 #if defined(ENABLE_JAVASE)
201 if (!link_class(class_java_lang_ClassLoader))
204 if (!link_class(class_java_lang_SecurityManager))
208 if (!link_class(class_java_lang_System))
211 if (!link_class(class_java_lang_Thread))
214 #if defined(ENABLE_JAVASE)
215 if (!link_class(class_java_lang_ThreadGroup))
219 #if defined(WITH_CLASSPATH_GNU)
220 if (!link_class(class_java_lang_VMSystem))
223 if (!link_class(class_java_lang_VMThread))
228 /* some classes which may be used more often */
230 #if defined(ENABLE_JAVASE)
231 if (!link_class(class_java_lang_StackTraceElement))
234 if (!link_class(class_java_lang_reflect_Constructor))
237 if (!link_class(class_java_lang_reflect_Field))
240 if (!link_class(class_java_lang_reflect_Method))
243 if (!link_class(class_java_security_PrivilegedAction))
246 if (!link_class(class_java_util_Vector))
249 if (!link_class(arrayclass_java_lang_Object))
254 /* create pseudo classes used by the typechecker */
256 /* pseudo class for Arraystubs (extends java.lang.Object) */
258 pseudo_class_Arraystub =
259 class_create_classinfo(utf_new_char("$ARRAYSTUB$"));
260 pseudo_class_Arraystub->state |= CLASS_LOADED;
261 pseudo_class_Arraystub->super.cls = class_java_lang_Object;
263 #if defined(ENABLE_JAVASE)
264 pseudo_class_Arraystub->interfacescount = 2;
265 pseudo_class_Arraystub->interfaces = MNEW(classref_or_classinfo, 2);
266 pseudo_class_Arraystub->interfaces[0].cls = class_java_lang_Cloneable;
267 pseudo_class_Arraystub->interfaces[1].cls = class_java_io_Serializable;
268 #elif defined(ENABLE_JAVAME_CLDC1_1)
269 pseudo_class_Arraystub->interfacescount = 0;
270 pseudo_class_Arraystub->interfaces = NULL;
273 if (!classcache_store_unique(pseudo_class_Arraystub)) {
274 log_text("could not cache pseudo_class_Arraystub");
278 if (!link_class(pseudo_class_Arraystub))
281 /* pseudo class representing the null type */
283 pseudo_class_Null = class_create_classinfo(utf_new_char("$NULL$"));
284 pseudo_class_Null->state |= CLASS_LOADED;
285 pseudo_class_Null->super.cls = class_java_lang_Object;
287 if (!classcache_store_unique(pseudo_class_Null)) {
288 log_text("could not cache pseudo_class_Null");
292 if (!link_class(pseudo_class_Null))
295 /* pseudo class representing new uninitialized objects */
297 pseudo_class_New = class_create_classinfo(utf_new_char("$NEW$"));
298 pseudo_class_New->state |= CLASS_LOADED;
299 pseudo_class_New->state |= CLASS_LINKED; /* XXX is this allright? */
300 pseudo_class_New->super.cls = class_java_lang_Object;
302 if (!classcache_store_unique(pseudo_class_New)) {
303 log_text("could not cache pseudo_class_New");
307 /* create classes representing primitive types */
309 if (!link_primitivetype_table())
313 /* Correct vftbl-entries (retarded loading and linking of class */
314 /* java/lang/String). */
316 stringtable_update();
322 /* link_primitivetype_table ****************************************************
324 Create classes representing primitive types.
326 *******************************************************************************/
328 static bool link_primitivetype_table(void)
334 for (i = 0; i < PRIMITIVETYPE_COUNT; i++) {
337 if (!primitivetype_table[i].name)
340 /* create primitive class */
342 c = class_create_classinfo(utf_new_char(primitivetype_table[i].name));
344 c->flags = ACC_PUBLIC | ACC_FINAL | ACC_ABSTRACT;
346 /* prevent loader from loading primitive class */
348 c->state |= CLASS_LOADED;
350 /* INFO: don't put primitive classes into the classcache */
355 primitivetype_table[i].class_primitive = c;
357 /* create class for wrapping the primitive type */
359 u = utf_new_char(primitivetype_table[i].wrapname);
361 if (!(c = load_class_bootstrap(u)))
364 primitivetype_table[i].class_wrap = c;
366 /* create the primitive array class */
368 if (primitivetype_table[i].arrayname) {
369 u = utf_new_char(primitivetype_table[i].arrayname);
370 c = class_create_classinfo(u);
371 c = load_newly_created_array(c, NULL);
375 primitivetype_table[i].arrayclass = c;
377 assert(c->state & CLASS_LOADED);
379 if (!(c->state & CLASS_LINKED))
383 primitivetype_table[i].arrayvftbl = c->vftbl;
391 /* link_class ******************************************************************
393 Wrapper function for link_class_intern to ease monitor enter/exit
394 and exception handling.
396 *******************************************************************************/
398 classinfo *link_class(classinfo *c)
401 #if defined(ENABLE_RT_TIMING)
402 struct timespec time_start, time_end;
405 RT_TIMING_GET_TIME(time_start);
408 exceptions_throw_nullpointerexception();
412 LOCK_MONITOR_ENTER(c);
414 /* maybe the class is already linked */
416 if (c->state & CLASS_LINKED) {
417 LOCK_MONITOR_EXIT(c);
422 #if defined(ENABLE_STATISTICS)
425 if (opt_getcompilingtime)
426 compilingtime_stop();
428 if (opt_getloadingtime)
432 /* call the internal function */
434 r = link_class_intern(c);
436 /* if return value is NULL, we had a problem and the class is not linked */
439 c->state &= ~CLASS_LINKING;
441 #if defined(ENABLE_STATISTICS)
444 if (opt_getloadingtime)
447 if (opt_getcompilingtime)
448 compilingtime_start();
451 LOCK_MONITOR_EXIT(c);
453 RT_TIMING_GET_TIME(time_end);
455 RT_TIMING_TIME_DIFF(time_start,time_end,RT_TIMING_LINK_TOTAL);
461 /* linker_overwrite_method *****************************************************
463 Overwrite a method with another one, update method flags and check
467 mg................the general method being overwritten
468 ms................the overwriting (more specialized) method
469 wl................worklist where to add invalidated methods
472 true..............everything ok
473 false.............an exception has been thrown
475 *******************************************************************************/
477 static bool linker_overwrite_method(methodinfo *mg,
479 method_worklist **wl)
487 /* overriding a final method is illegal */
489 if (mg->flags & ACC_FINAL) {
491 new_exception(string_java_lang_VerifyError);
495 /* method ms overwrites method mg */
497 #if defined(ENABLE_VERIFIER)
498 /* Add loading constraints (for the more general types of method mg). */
499 /* Not for <init>, as it is not invoked virtually. */
501 if ((ms->name != utf_init)
502 && !classcache_add_constraints_for_params(
503 cs->classloader, cg->classloader, mg))
509 /* inherit the vftbl index, and record the overwriting */
511 ms->vftblindex = mg->vftblindex;
514 /* update flags and check assumptions */
515 /* <init> methods are a special case, as they are never dispatched dynamically */
517 if ((ms->flags & ACC_METHOD_IMPLEMENTED) && ms->name != utf_init) {
519 if (mg->flags & ACC_METHOD_IMPLEMENTED) {
520 /* this adds another implementation */
522 mg->flags &= ~ACC_METHOD_MONOMORPHIC;
524 INLINELOG( printf("becomes polymorphic: "); method_println(mg); );
526 method_break_assumption_monomorphic(mg, wl);
529 /* this is the first implementation */
531 mg->flags |= ACC_METHOD_IMPLEMENTED;
533 INLINELOG( printf("becomes implemented: "); method_println(mg); );
538 } while (mg != NULL);
545 /* link_class_intern ***********************************************************
547 Tries to link a class. The function calculates the length in bytes
548 that an instance of this class requires as well as the VTBL for
549 methods and interface methods.
551 *******************************************************************************/
553 static classinfo *link_class_intern(classinfo *c)
555 classinfo *super; /* super class */
556 classinfo *tc; /* temporary class variable */
557 s4 supervftbllength; /* vftbllegnth of super class */
558 s4 vftbllength; /* vftbllength of current class */
559 s4 interfacetablelength; /* interface table length */
560 vftbl_t *v; /* vftbl of current class */
561 s4 i; /* interface/method/field counter */
562 arraydescriptor *arraydesc; /* descriptor for array classes */
563 method_worklist *worklist; /* worklist for recompilation */
564 #if defined(ENABLE_RT_TIMING)
565 struct timespec time_start, time_resolving, time_compute_vftbl,
566 time_abstract, time_compute_iftbl, time_fill_vftbl,
567 time_offsets, time_fill_iftbl, time_finalizer,
571 RT_TIMING_GET_TIME(time_start);
573 /* the class is already linked */
575 if (c->state & CLASS_LINKED)
580 log_message_class("Linking class: ", c);
583 /* the class must be loaded */
585 /* XXX should this be a specific exception? */
586 assert(c->state & CLASS_LOADED);
588 /* cache the self-reference of this class */
589 /* we do this for cases where the defining loader of the class */
590 /* has not yet been recorded as an initiating loader for the class */
591 /* this is needed so subsequent code can assume that self-refs */
592 /* will always resolve lazily */
593 /* No need to do it for the bootloader - it is always registered */
594 /* as initiating loader for the classes it loads. */
596 classcache_store(c->classloader,c,false);
598 /* this class is currently linking */
600 c->state |= CLASS_LINKING;
605 /* check interfaces */
607 for (i = 0; i < c->interfacescount; i++) {
608 /* resolve this super interface */
610 if (!resolve_classref_or_classinfo(NULL, c->interfaces[i], resolveEager,
614 c->interfaces[i].cls = tc;
616 /* detect circularity */
620 new_exception_utfmessage(string_java_lang_ClassCircularityError,
625 assert(tc->state & CLASS_LOADED);
627 if (!(tc->flags & ACC_INTERFACE)) {
629 new_exception_message(string_java_lang_IncompatibleClassChangeError,
630 "Implementing class");
634 if (!(tc->state & CLASS_LINKED))
639 /* check super class */
643 if (c->super.any == NULL) { /* class java.lang.Object */
645 c->instancesize = sizeof(java_objectheader);
647 vftbllength = supervftbllength = 0;
652 /* resolve super class */
654 if (!resolve_classref_or_classinfo(NULL, c->super, resolveEager, true, false,
657 c->super.cls = super;
659 /* detect circularity */
663 new_exception_utfmessage(string_java_lang_ClassCircularityError,
668 assert(super->state & CLASS_LOADED);
670 if (super->flags & ACC_INTERFACE) {
671 /* java.lang.IncompatibleClassChangeError: class a has interface java.lang.Cloneable as super class */
672 log_text("Interface specified as super class");
676 /* Don't allow extending final classes */
678 if (super->flags & ACC_FINAL) {
680 new_exception_message(string_java_lang_VerifyError,
681 "Cannot inherit from final class");
685 /* link the superclass if necessary */
687 if (!(super->state & CLASS_LINKED))
688 if (!link_class(super))
691 /* OR the ACC_CLASS_HAS_POINTERS flag */
693 c->flags |= (super->flags & ACC_CLASS_HAS_POINTERS);
695 /* handle array classes */
697 if (c->name->text[0] == '[')
698 if (!(arraydesc = link_array(c)))
701 if (c->flags & ACC_INTERFACE)
702 c->index = interfaceindex++;
704 c->index = super->index + 1;
706 c->instancesize = super->instancesize;
708 vftbllength = supervftbllength = super->vftbl->vftbllength;
710 c->finalizer = super->finalizer;
712 RT_TIMING_GET_TIME(time_resolving);
715 /* compute vftbl length */
717 for (i = 0; i < c->methodscount; i++) {
718 methodinfo *m = &(c->methods[i]);
720 if (!(m->flags & ACC_STATIC)) { /* is instance method */
726 for (j = 0; j < tc->methodscount; j++) {
727 if (method_canoverwrite(m, &(tc->methods[j]))) {
728 if (tc->methods[j].flags & ACC_PRIVATE)
729 goto notfoundvftblindex;
731 /* package-private methods in other packages */
732 /* must not be overridden */
733 /* (see Java Language Specification 8.4.8.1) */
734 if ( !(tc->methods[j].flags & (ACC_PUBLIC | ACC_PROTECTED))
735 && !SAME_PACKAGE(c,tc) )
737 goto notfoundvftblindex;
740 if (!linker_overwrite_method(&(tc->methods[j]), m, &worklist))
743 goto foundvftblindex;
751 m->vftblindex = (vftbllength++);
756 RT_TIMING_GET_TIME(time_compute_vftbl);
759 /* Check all interfaces of an abstract class (maybe be an
760 interface too) for unimplemented methods. Such methods are
761 called miranda-methods and are marked with the ACC_MIRANDA
762 flag. VMClass.getDeclaredMethods does not return such
765 if (c->flags & ACC_ABSTRACT) {
768 s4 abstractmethodscount;
772 abstractmethodscount = 0;
774 /* check all interfaces of the abstract class */
776 for (i = 0; i < c->interfacescount; i++) {
777 ic = c->interfaces[i].cls;
779 for (j = 0; j < ic->methodscount; j++) {
780 im = &(ic->methods[j]);
782 /* skip `<clinit>' and `<init>' */
784 if ((im->name == utf_clinit) || (im->name == utf_init))
787 for (tc = c; tc != NULL; tc = tc->super.cls) {
788 for (k = 0; k < tc->methodscount; k++) {
789 if (method_canoverwrite(im, &(tc->methods[k])))
790 goto noabstractmethod;
794 abstractmethodscount++;
801 if (abstractmethodscount > 0) {
804 /* reallocate methods memory */
806 c->methods = MREALLOC(c->methods, methodinfo, c->methodscount,
807 c->methodscount + abstractmethodscount);
809 for (i = 0; i < c->interfacescount; i++) {
810 ic = c->interfaces[i].cls;
812 for (j = 0; j < ic->methodscount; j++) {
813 im = &(ic->methods[j]);
815 /* skip `<clinit>' and `<init>' */
817 if ((im->name == utf_clinit) || (im->name == utf_init))
820 for (tc = c; tc != NULL; tc = tc->super.cls) {
821 for (k = 0; k < tc->methodscount; k++) {
822 if (method_canoverwrite(im, &(tc->methods[k])))
823 goto noabstractmethod2;
827 /* Copy the method found into the new c->methods
828 array and tag it as miranda-method. */
830 am = &(c->methods[c->methodscount]);
833 MCOPY(am, im, methodinfo, 1);
835 am->vftblindex = (vftbllength++);
837 am->flags |= ACC_MIRANDA;
845 RT_TIMING_GET_TIME(time_abstract);
848 #if defined(ENABLE_STATISTICS)
851 sizeof(vftbl_t) + (sizeof(methodptr) * (vftbllength - 1));
854 /* compute interfacetable length */
856 interfacetablelength = 0;
858 for (tc = c; tc != NULL; tc = tc->super.cls) {
859 for (i = 0; i < tc->interfacescount; i++) {
860 s4 h = class_highestinterface(tc->interfaces[i].cls) + 1;
862 if (h > interfacetablelength)
863 interfacetablelength = h;
866 RT_TIMING_GET_TIME(time_compute_iftbl);
868 /* allocate virtual function table */
870 v = (vftbl_t *) mem_alloc(sizeof(vftbl_t) +
871 sizeof(methodptr) * (vftbllength - 1) +
872 sizeof(methodptr*) * (interfacetablelength - (interfacetablelength > 0)));
873 v = (vftbl_t *) (((methodptr *) v) +
874 (interfacetablelength - 1) * (interfacetablelength > 1));
878 v->vftbllength = vftbllength;
879 v->interfacetablelength = interfacetablelength;
880 v->arraydesc = arraydesc;
882 /* store interface index in vftbl */
884 if (c->flags & ACC_INTERFACE)
885 v->baseval = -(c->index);
887 /* copy virtual function table of super class */
889 for (i = 0; i < supervftbllength; i++)
890 v->table[i] = super->vftbl->table[i];
892 /* Fill the remaining vftbl slots with the AbstractMethodError
893 stub (all after the super class slots, because they are already
896 for (; i < vftbllength; i++) {
897 #if defined(ENABLE_JIT)
898 # if defined(ENABLE_INTRP)
900 v->table[i] = (methodptr) (ptrint) &intrp_asm_abstractmethoderror;
903 v->table[i] = (methodptr) (ptrint) &asm_abstractmethoderror;
905 v->table[i] = (methodptr) (ptrint) &intrp_asm_abstractmethoderror;
909 /* add method stubs into virtual function table */
911 for (i = 0; i < c->methodscount; i++) {
912 methodinfo *m = &(c->methods[i]);
914 assert(m->stubroutine == NULL);
916 /* Don't create a compiler stub for abstract methods as they
917 throw an AbstractMethodError with the default stub in the
918 vftbl. This entry is simply copied by sub-classes. */
920 if (m->flags & ACC_ABSTRACT)
923 #if defined(ENABLE_JIT)
924 # if defined(ENABLE_INTRP)
926 m->stubroutine = intrp_createcompilerstub(m);
929 m->stubroutine = createcompilerstub(m);
931 m->stubroutine = intrp_createcompilerstub(m);
934 /* static methods are not in the vftbl */
936 if (m->flags & ACC_STATIC)
939 /* insert the stubroutine into the vftbl */
941 v->table[m->vftblindex] = (methodptr) (ptrint) m->stubroutine;
943 RT_TIMING_GET_TIME(time_fill_vftbl);
945 /* compute instance size and offset of each field */
947 for (i = 0; i < c->fieldscount; i++) {
949 fieldinfo *f = &(c->fields[i]);
951 if (!(f->flags & ACC_STATIC)) {
952 dsize = descriptor_typesize(f->parseddesc);
954 /* On i386 we only align to 4 bytes even for double and s8. */
955 /* This matches what gcc does for struct members. We must */
956 /* do the same as gcc here because the offsets in native */
957 /* header structs like java_lang_Double must match the offsets */
958 /* of the Java fields (eg. java.lang.Double.value). */
959 #if defined(__I386__)
960 c->instancesize = MEMORY_ALIGN(c->instancesize, 4);
962 c->instancesize = MEMORY_ALIGN(c->instancesize, dsize);
965 f->offset = c->instancesize;
966 c->instancesize += dsize;
969 RT_TIMING_GET_TIME(time_offsets);
971 /* initialize interfacetable and interfacevftbllength */
973 v->interfacevftbllength = MNEW(s4, interfacetablelength);
975 #if defined(ENABLE_STATISTICS)
977 count_vftbl_len += (4 + sizeof(s4)) * v->interfacetablelength;
980 for (i = 0; i < interfacetablelength; i++) {
981 v->interfacevftbllength[i] = 0;
982 v->interfacetable[-i] = NULL;
987 for (tc = c; tc != NULL; tc = tc->super.cls)
988 for (i = 0; i < tc->interfacescount; i++)
989 if (!linker_addinterface(c, tc->interfaces[i].cls))
992 RT_TIMING_GET_TIME(time_fill_iftbl);
994 /* add finalizer method (not for java.lang.Object) */
999 fi = class_findmethod(c, utf_finalize, utf_void__void);
1002 if (!(fi->flags & ACC_STATIC))
1005 RT_TIMING_GET_TIME(time_finalizer);
1009 linker_compute_subclasses(c);
1011 RT_TIMING_GET_TIME(time_subclasses);
1013 /* revert the linking state and class is linked */
1015 c->state = (c->state & ~CLASS_LINKING) | CLASS_LINKED;
1017 /* check worklist */
1019 /* XXX must this also be done in case of exception? */
1021 while (worklist != NULL) {
1022 method_worklist *wi = worklist;
1024 worklist = worklist->next;
1026 INLINELOG( printf("MUST BE RECOMPILED: "); method_println(wi->m); );
1027 jit_invalidate_code(wi->m);
1029 /* XXX put worklist into dump memory? */
1030 FREE(wi, method_worklist);
1033 #if !defined(NDEBUG)
1035 log_message_class("Linking done class: ", c);
1038 RT_TIMING_TIME_DIFF(time_start ,time_resolving ,RT_TIMING_LINK_RESOLVE);
1039 RT_TIMING_TIME_DIFF(time_resolving ,time_compute_vftbl,RT_TIMING_LINK_C_VFTBL);
1040 RT_TIMING_TIME_DIFF(time_compute_vftbl,time_abstract ,RT_TIMING_LINK_ABSTRACT);
1041 RT_TIMING_TIME_DIFF(time_abstract ,time_compute_iftbl,RT_TIMING_LINK_C_IFTBL);
1042 RT_TIMING_TIME_DIFF(time_compute_iftbl,time_fill_vftbl ,RT_TIMING_LINK_F_VFTBL);
1043 RT_TIMING_TIME_DIFF(time_fill_vftbl ,time_offsets ,RT_TIMING_LINK_OFFSETS);
1044 RT_TIMING_TIME_DIFF(time_offsets ,time_fill_iftbl ,RT_TIMING_LINK_F_IFTBL);
1045 RT_TIMING_TIME_DIFF(time_fill_iftbl ,time_finalizer ,RT_TIMING_LINK_FINALIZER);
1046 RT_TIMING_TIME_DIFF(time_finalizer ,time_subclasses ,RT_TIMING_LINK_SUBCLASS);
1048 /* just return c to show that we didn't had a problem */
1054 /* link_array ******************************************************************
1056 This function is called by link_class to create the arraydescriptor
1059 This function returns NULL if the array cannot be linked because
1060 the component type has not been linked yet.
1062 *******************************************************************************/
1064 static arraydescriptor *link_array(classinfo *c)
1068 arraydescriptor *desc;
1073 namelen = c->name->blength;
1075 /* Check the component type */
1077 switch (c->name->text[1]) {
1079 /* c is an array of arrays. */
1080 u = utf_new(c->name->text + 1, namelen - 1);
1081 if (!(comp = load_class_from_classloader(u, c->classloader)))
1086 /* c is an array of objects. */
1087 u = utf_new(c->name->text + 2, namelen - 3);
1088 if (!(comp = load_class_from_classloader(u, c->classloader)))
1093 /* If the component type has not been linked, link it now */
1095 assert(!comp || (comp->state & CLASS_LOADED));
1097 if (comp && !(comp->state & CLASS_LINKED))
1098 if (!link_class(comp))
1101 /* Allocate the arraydescriptor */
1103 desc = NEW(arraydescriptor);
1106 /* c is an array of references */
1107 desc->arraytype = ARRAYTYPE_OBJECT;
1108 desc->componentsize = sizeof(void*);
1109 desc->dataoffset = OFFSET(java_objectarray, data);
1111 compvftbl = comp->vftbl;
1114 log_text("Component class has no vftbl");
1118 desc->componentvftbl = compvftbl;
1120 if (compvftbl->arraydesc) {
1121 desc->elementvftbl = compvftbl->arraydesc->elementvftbl;
1123 if (compvftbl->arraydesc->dimension >= 255) {
1124 log_text("Creating array of dimension >255");
1128 desc->dimension = compvftbl->arraydesc->dimension + 1;
1129 desc->elementtype = compvftbl->arraydesc->elementtype;
1132 desc->elementvftbl = compvftbl;
1133 desc->dimension = 1;
1134 desc->elementtype = ARRAYTYPE_OBJECT;
1138 /* c is an array of a primitive type */
1139 switch (c->name->text[1]) {
1141 desc->arraytype = ARRAYTYPE_BOOLEAN;
1142 desc->dataoffset = OFFSET(java_booleanarray,data);
1143 desc->componentsize = sizeof(u1);
1147 desc->arraytype = ARRAYTYPE_BYTE;
1148 desc->dataoffset = OFFSET(java_bytearray,data);
1149 desc->componentsize = sizeof(u1);
1153 desc->arraytype = ARRAYTYPE_CHAR;
1154 desc->dataoffset = OFFSET(java_chararray,data);
1155 desc->componentsize = sizeof(u2);
1159 desc->arraytype = ARRAYTYPE_DOUBLE;
1160 desc->dataoffset = OFFSET(java_doublearray,data);
1161 desc->componentsize = sizeof(double);
1165 desc->arraytype = ARRAYTYPE_FLOAT;
1166 desc->dataoffset = OFFSET(java_floatarray,data);
1167 desc->componentsize = sizeof(float);
1171 desc->arraytype = ARRAYTYPE_INT;
1172 desc->dataoffset = OFFSET(java_intarray,data);
1173 desc->componentsize = sizeof(s4);
1177 desc->arraytype = ARRAYTYPE_LONG;
1178 desc->dataoffset = OFFSET(java_longarray,data);
1179 desc->componentsize = sizeof(s8);
1183 desc->arraytype = ARRAYTYPE_SHORT;
1184 desc->dataoffset = OFFSET(java_shortarray,data);
1185 desc->componentsize = sizeof(s2);
1189 *exceptionptr = new_noclassdeffounderror(c->name);
1193 desc->componentvftbl = NULL;
1194 desc->elementvftbl = NULL;
1195 desc->dimension = 1;
1196 desc->elementtype = desc->arraytype;
1203 /* linker_compute_subclasses ***************************************************
1207 *******************************************************************************/
1209 static void linker_compute_subclasses(classinfo *c)
1211 #if defined(ENABLE_THREADS)
1215 if (!(c->flags & ACC_INTERFACE)) {
1220 if (!(c->flags & ACC_INTERFACE) && (c->super.any != NULL)) {
1221 c->nextsub = c->super.cls->sub;
1222 c->super.cls->sub = c;
1227 /* compute class values */
1229 linker_compute_class_values(class_java_lang_Object);
1231 #if defined(ENABLE_THREADS)
1237 /* linker_compute_class_values *************************************************
1241 *******************************************************************************/
1243 static void linker_compute_class_values(classinfo *c)
1247 c->vftbl->baseval = ++classvalue;
1252 linker_compute_class_values(subs);
1254 subs = subs->nextsub;
1257 c->vftbl->diffval = classvalue - c->vftbl->baseval;
1261 /* linker_addinterface *********************************************************
1263 Is needed by link_class for adding a VTBL to a class. All
1264 interfaces implemented by ic are added as well.
1267 true.........everything ok
1268 false........an exception has been thrown
1270 *******************************************************************************/
1272 static bool linker_addinterface(classinfo *c, classinfo *ic)
1283 if (i >= v->interfacetablelength)
1284 vm_abort("Internal error: interfacetable overflow");
1286 /* if this interface has already been added, return immediately */
1288 if (v->interfacetable[-i] != NULL)
1291 if (ic->methodscount == 0) { /* fake entry needed for subtype test */
1292 v->interfacevftbllength[i] = 1;
1293 v->interfacetable[-i] = MNEW(methodptr, 1);
1294 v->interfacetable[-i][0] = NULL;
1297 v->interfacevftbllength[i] = ic->methodscount;
1298 v->interfacetable[-i] = MNEW(methodptr, ic->methodscount);
1300 #if defined(ENABLE_STATISTICS)
1302 count_vftbl_len += sizeof(methodptr) *
1303 (ic->methodscount + (ic->methodscount == 0));
1306 for (j = 0; j < ic->methodscount; j++) {
1307 for (sc = c; sc != NULL; sc = sc->super.cls) {
1308 for (k = 0; k < sc->methodscount; k++) {
1309 m = &(sc->methods[k]);
1311 if (method_canoverwrite(m, &(ic->methods[j]))) {
1312 /* method m overwrites the (abstract) method */
1313 #if defined(ENABLE_VERIFIER)
1314 /* Add loading constraints (for the more
1315 general types of the method
1317 if (!classcache_add_constraints_for_params(
1318 c->classloader, ic->classloader,
1325 /* XXX taken from gcj */
1326 /* check for ACC_STATIC: IncompatibleClassChangeError */
1328 /* check for !ACC_PUBLIC: IllegalAccessError */
1330 /* check for ACC_ABSTRACT: AbstracMethodError,
1331 not sure about that one */
1333 v->interfacetable[-i][j] = v->table[m->vftblindex];
1339 /* If no method was found, insert the AbstractMethodError
1342 #if defined(ENABLE_JIT)
1343 # if defined(ENABLE_INTRP)
1345 v->interfacetable[-i][j] =
1346 (methodptr) (ptrint) &intrp_asm_abstractmethoderror;
1349 v->interfacetable[-i][j] =
1350 (methodptr) (ptrint) &asm_abstractmethoderror;
1352 v->interfacetable[-i][j] =
1353 (methodptr) (ptrint) &intrp_asm_abstractmethoderror;
1361 /* add superinterfaces of this interface */
1363 for (j = 0; j < ic->interfacescount; j++)
1364 if (!linker_addinterface(c, ic->interfaces[j].cls))
1373 /* class_highestinterface ******************************************************
1375 Used by the function link_class to determine the amount of memory
1376 needed for the interface table.
1378 *******************************************************************************/
1380 static s4 class_highestinterface(classinfo *c)
1386 /* check for ACC_INTERFACE bit already done in link_class_intern */
1390 for (i = 0; i < c->interfacescount; i++) {
1391 h2 = class_highestinterface(c->interfaces[i].cls);
1402 * These are local overrides for various environment variables in Emacs.
1403 * Please do not remove this and leave it at the end of the file, where
1404 * Emacs will automagically detect them.
1405 * ---------------------------------------------------------------------
1408 * indent-tabs-mode: t
1412 * vim:noexpandtab:sw=4:ts=4: