1 /* src/vm/linker.cpp - class linker functions
3 Copyright (C) 1996-2005, 2006, 2007, 2008
4 CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
6 This file is part of CACAO.
8 This program is free software; you can redistribute it and/or
9 modify it under the terms of the GNU General Public License as
10 published by the Free Software Foundation; either version 2, or (at
11 your option) any later version.
13 This program is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
20 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
33 #include "mm/memory.hpp"
35 #include "native/native.hpp"
37 #include "threads/lock.hpp"
38 #include "threads/mutex.hpp"
40 #include "toolbox/logging.hpp"
42 #include "vm/access.hpp"
43 #include "vm/array.hpp"
44 #include "vm/class.hpp"
45 #include "vm/classcache.hpp"
46 #include "vm/exceptions.hpp"
47 #include "vm/globals.hpp"
48 #include "vm/hook.hpp"
49 #include "vm/loader.hpp"
50 #include "vm/options.h"
51 #include "vm/primitive.hpp"
52 #include "vm/rt-timing.h"
53 #include "vm/string.hpp"
56 #include "vm/jit/asmpart.h"
57 #include "vm/jit/stubs.hpp"
60 /* debugging macros ***********************************************************/
63 # define TRACELINKCLASS(c) \
65 if (opt_TraceLinkClass) { \
67 log_print("[Linking "); \
74 # define TRACELINKCLASS(c)
78 /* #include "vm/resolve.hpp" */
79 /* copied prototype to avoid bootstrapping problem: */
80 classinfo *resolve_classref_or_classinfo_eager(classref_or_classinfo cls, bool checkaccess);
82 #if defined(ENABLE_STATISTICS)
83 # include "vm/statistics.h"
86 #if !defined(NDEBUG) && defined(ENABLE_INLINING)
87 #define INLINELOG(code) do { if (opt_TraceInlining) { code } } while (0)
89 #define INLINELOG(code)
93 /* global variables ***********************************************************/
95 static s4 interfaceindex; /* sequential numbering of interfaces */
99 Mutex *linker_classrenumber_lock;
102 #if defined(__cplusplus)
106 /* private functions **********************************************************/
108 static classinfo *link_class_intern(classinfo *c);
109 static arraydescriptor *link_array(classinfo *c);
110 static void linker_compute_class_values(classinfo *c);
111 static void linker_compute_subclasses(classinfo *c);
112 static bool linker_addinterface(classinfo *c, classinfo *ic);
113 static s4 class_highestinterface(classinfo *c);
116 /* linker_init *****************************************************************
118 Initializes the linker subsystem and links classes required for the
121 *******************************************************************************/
123 void linker_preinit(void)
125 TRACESUBSYSTEMINITIALIZATION("linker_preinit");
127 /* Reset interface index. */
131 #if defined(ENABLE_THREADS) && !USES_NEW_SUBTYPE
132 /* create the global mutex */
134 linker_classrenumber_lock = new Mutex();
137 /* Link the most basic classes. */
139 if (!link_class(class_java_lang_Object))
140 vm_abort("linker_preinit: linking java/lang/Object failed");
142 #if defined(ENABLE_JAVASE)
143 if (!link_class(class_java_lang_Cloneable))
144 vm_abort("linker_preinit: linking java/lang/Cloneable failed");
146 if (!link_class(class_java_io_Serializable))
147 vm_abort("linker_preinit: linking java/io/Serializable failed");
152 /* linker_init *****************************************************************
154 Links all classes required in the VM.
156 *******************************************************************************/
158 void linker_init(void)
160 TRACESUBSYSTEMINITIALIZATION("linker_init");
162 /* Link java.lang.Class as first class of the system, because we
163 need it's vftbl for all other classes so we can use a class as
166 if (!link_class(class_java_lang_Class))
167 vm_abort("linker_init: linking java/lang/Class failed");
169 /* Now set the header.vftbl of all classes which were created
170 before java.lang.Class was linked. */
172 class_postset_header_vftbl();
174 /* Link primitive-type wrapping classes. */
176 #if defined(ENABLE_JAVASE)
177 if (!link_class(class_java_lang_Void))
178 vm_abort("linker_init: linking failed");
181 if (!link_class(class_java_lang_Boolean))
182 vm_abort("linker_init: linking failed");
184 if (!link_class(class_java_lang_Byte))
185 vm_abort("linker_init: linking failed");
187 if (!link_class(class_java_lang_Character))
188 vm_abort("linker_init: linking failed");
190 if (!link_class(class_java_lang_Short))
191 vm_abort("linker_init: linking failed");
193 if (!link_class(class_java_lang_Integer))
194 vm_abort("linker_init: linking failed");
196 if (!link_class(class_java_lang_Long))
197 vm_abort("linker_init: linking failed");
199 if (!link_class(class_java_lang_Float))
200 vm_abort("linker_init: linking failed");
202 if (!link_class(class_java_lang_Double))
203 vm_abort("linker_init: linking failed");
205 /* Link important system classes. */
207 if (!link_class(class_java_lang_String))
208 vm_abort("linker_init: linking java/lang/String failed");
210 #if defined(ENABLE_JAVASE)
211 if (!link_class(class_java_lang_ClassLoader))
212 vm_abort("linker_init: linking failed");
214 if (!link_class(class_java_lang_SecurityManager))
215 vm_abort("linker_init: linking failed");
218 if (!link_class(class_java_lang_System))
219 vm_abort("linker_init: linking failed");
221 if (!link_class(class_java_lang_Thread))
222 vm_abort("linker_init: linking failed");
224 #if defined(ENABLE_JAVASE)
225 if (!link_class(class_java_lang_ThreadGroup))
226 vm_abort("linker_init: linking failed");
229 if (!link_class(class_java_lang_Throwable))
230 vm_abort("linker_init: linking failed");
232 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
233 if (!link_class(class_java_lang_VMSystem))
234 vm_abort("linker_init: linking failed");
236 if (!link_class(class_java_lang_VMThread))
237 vm_abort("linker_init: linking failed");
239 if (!link_class(class_java_lang_VMThrowable))
240 vm_abort("linker_init: linking failed");
243 /* Important system exceptions. */
245 if (!link_class(class_java_lang_Exception))
246 vm_abort("linker_init: linking failed");
248 if (!link_class(class_java_lang_ClassNotFoundException))
249 vm_abort("linker_init: linking failed");
251 if (!link_class(class_java_lang_RuntimeException))
252 vm_abort("linker_init: linking failed");
254 /* some classes which may be used more often */
256 #if defined(ENABLE_JAVASE)
257 if (!link_class(class_java_lang_StackTraceElement))
258 vm_abort("linker_init: linking failed");
260 if (!link_class(class_java_lang_reflect_Constructor))
261 vm_abort("linker_init: linking failed");
263 if (!link_class(class_java_lang_reflect_Field))
264 vm_abort("linker_init: linking failed");
266 if (!link_class(class_java_lang_reflect_Method))
267 vm_abort("linker_init: linking failed");
269 # if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
270 if (!link_class(class_java_lang_reflect_VMConstructor))
271 vm_abort("linker_init: linking failed");
273 if (!link_class(class_java_lang_reflect_VMField))
274 vm_abort("linker_init: linking failed");
276 if (!link_class(class_java_lang_reflect_VMMethod))
277 vm_abort("linker_init: linking failed");
280 if (!link_class(class_java_security_PrivilegedAction))
281 vm_abort("linker_init: linking failed");
283 if (!link_class(class_java_util_Vector))
284 vm_abort("linker_init: linking failed");
286 if (!link_class(class_java_util_HashMap))
287 vm_abort("linker_init: linking failed");
289 # if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
290 if (!link_class(class_sun_misc_Signal))
291 vm_abort("linker_init: linking failed");
293 if (!link_class(class_sun_reflect_MagicAccessorImpl))
294 vm_abort("linker_init: linking failed");
297 if (!link_class(arrayclass_java_lang_Object))
298 vm_abort("linker_init: linking failed");
302 /* create pseudo classes used by the typechecker */
304 /* pseudo class for Arraystubs (extends java.lang.Object) */
306 pseudo_class_Arraystub =
307 class_create_classinfo(utf_new_char("$ARRAYSTUB$"));
308 pseudo_class_Arraystub->state |= CLASS_LOADED;
309 pseudo_class_Arraystub->super = class_java_lang_Object;
311 #if defined(ENABLE_JAVASE)
313 pseudo_class_Arraystub->interfacescount = 2;
314 pseudo_class_Arraystub->interfaces = MNEW(classinfo*, 2);
315 pseudo_class_Arraystub->interfaces[0] = class_java_lang_Cloneable;
316 pseudo_class_Arraystub->interfaces[1] = class_java_io_Serializable;
318 #elif defined(ENABLE_JAVAME_CLDC1_1)
320 pseudo_class_Arraystub->interfacescount = 0;
321 pseudo_class_Arraystub->interfaces = NULL;
324 # error unknown Java configuration
327 if (!classcache_store_unique(pseudo_class_Arraystub))
328 vm_abort("linker_init: could not cache pseudo_class_Arraystub");
330 if (!link_class(pseudo_class_Arraystub))
331 vm_abort("linker_init: linking pseudo_class_Arraystub failed");
333 /* pseudo class representing the null type */
335 pseudo_class_Null = class_create_classinfo(utf_new_char("$NULL$"));
336 pseudo_class_Null->state |= CLASS_LOADED;
337 pseudo_class_Null->super = class_java_lang_Object;
339 if (!classcache_store_unique(pseudo_class_Null))
340 vm_abort("linker_init: could not cache pseudo_class_Null");
342 if (!link_class(pseudo_class_Null))
343 vm_abort("linker_init: linking failed");
345 /* pseudo class representing new uninitialized objects */
347 pseudo_class_New = class_create_classinfo(utf_new_char("$NEW$"));
348 pseudo_class_New->state |= CLASS_LOADED;
349 pseudo_class_New->state |= CLASS_LINKED; /* XXX is this allright? */
350 pseudo_class_New->super = class_java_lang_Object;
352 if (!classcache_store_unique(pseudo_class_New))
353 vm_abort("linker_init: could not cache pseudo_class_New");
355 /* Correct vftbl-entries (retarded loading and linking of class
356 java/lang/String). */
358 stringtable_update();
362 /* link_class ******************************************************************
364 Wrapper function for link_class_intern to ease monitor enter/exit
365 and exception handling.
367 *******************************************************************************/
369 classinfo *link_class(classinfo *c)
372 #if defined(ENABLE_RT_TIMING)
373 struct timespec time_start, time_end;
376 RT_TIMING_GET_TIME(time_start);
379 exceptions_throw_nullpointerexception();
383 LOCK_MONITOR_ENTER(c);
385 /* Maybe the class is currently linking or is already linked.*/
387 if ((c->state & CLASS_LINKING) || (c->state & CLASS_LINKED)) {
388 LOCK_MONITOR_EXIT(c);
393 #if defined(ENABLE_STATISTICS)
396 if (opt_getcompilingtime)
397 compilingtime_stop();
399 if (opt_getloadingtime)
403 /* call the internal function */
405 r = link_class_intern(c);
407 /* If return value is NULL, we had a problem and the class is not
411 c->state &= ~CLASS_LINKING;
413 #if defined(ENABLE_STATISTICS)
416 if (opt_getloadingtime)
419 if (opt_getcompilingtime)
420 compilingtime_start();
423 LOCK_MONITOR_EXIT(c);
425 RT_TIMING_GET_TIME(time_end);
427 RT_TIMING_TIME_DIFF(time_start,time_end,RT_TIMING_LINK_TOTAL);
429 // Hook point just after a class was linked.
430 Hook::class_linked(r);
436 /* linker_overwrite_method *****************************************************
438 Overwrite a method with another one, update method flags and check
442 mg................the general method being overwritten
443 ms................the overwriting (more specialized) method
444 wl................worklist where to add invalidated methods
447 true..............everything ok
448 false.............an exception has been thrown
450 *******************************************************************************/
452 static bool linker_overwrite_method(methodinfo *mg,
454 method_worklist **wl)
462 /* overriding a final method is illegal */
464 if (mg->flags & ACC_FINAL) {
465 exceptions_throw_verifyerror(mg, "Overriding final method");
469 /* method ms overwrites method mg */
471 #if defined(ENABLE_VERIFIER)
472 /* Add loading constraints (for the more general types of method mg). */
473 /* Not for <init>, as it is not invoked virtually. */
475 if ((ms->name != utf_init)
476 && !classcache_add_constraints_for_params(
477 cs->classloader, cg->classloader, mg))
483 /* inherit the vftbl index, and record the overwriting */
485 ms->vftblindex = mg->vftblindex;
488 /* update flags and check assumptions */
489 /* <init> methods are a special case, as they are never dispatched dynamically */
491 if ((ms->flags & ACC_METHOD_IMPLEMENTED) && ms->name != utf_init) {
494 #if defined(ENABLE_TLH)
495 if (mg->flags & ACC_METHOD_MONOMORPHY_USED) {
496 printf("%s/%s is evil! the siner is %s/%s\n", mg->clazz->name->text, mg->name->text,
497 ms->clazz->name->text, ms->name->text);
498 ms->flags |= ACC_METHOD_PARENT_MONOMORPHY_USED;
502 if (mg->flags & ACC_METHOD_IMPLEMENTED) {
503 /* this adds another implementation */
505 mg->flags &= ~ACC_METHOD_MONOMORPHIC;
507 INLINELOG( printf("becomes polymorphic: "); method_println(mg); );
509 method_break_assumption_monomorphic(mg, wl);
512 /* this is the first implementation */
514 mg->flags |= ACC_METHOD_IMPLEMENTED;
516 INLINELOG( printf("becomes implemented: "); method_println(mg); );
521 } while (mg != NULL);
529 /* build_display ***************************************************************
531 Builds the entire display for a class. This entails filling the fixed part
532 as well as allocating and initializing the overflow part.
534 See Cliff Click and John Rose: Fast subtype checking in the Hotspot JVM.
536 *******************************************************************************/
538 static classinfo *build_display(classinfo *c)
546 if (c->vftbl->arraydesc) {
547 arraydescriptor *a = c->vftbl->arraydesc;
548 if (a->elementvftbl && a->elementvftbl->clazz->super) {
549 classinfo *cls = a->elementvftbl->clazz->super;
551 for (n=0; n<a->dimension; n++)
552 cls = class_array_of(cls, true);
556 if (a->componentvftbl && a->elementvftbl) {
557 super = a->componentvftbl->clazz;
561 /* Normal classes. */
565 if (!link_class(super))
567 depth = super->vftbl->subtype_depth + 1;
569 /* java.lang.Object doesn't have a super class. */
572 /* Now copy super's display, append c->vftbl and initialize the remaining fields. */
573 if (depth >= DISPLAY_SIZE) {
574 c->vftbl->subtype_overflow = MNEW(vftbl_t *, depth - DISPLAY_SIZE + 1);
575 #if defined(ENABLE_STATISTICS)
577 count_vftbl_len += sizeof(vftbl_t*) * (depth - DISPLAY_SIZE + 1);
579 memcpy(c->vftbl->subtype_overflow, super->vftbl->subtype_overflow, sizeof(vftbl_t*) * (depth - DISPLAY_SIZE));
580 c->vftbl->subtype_overflow[depth - DISPLAY_SIZE] = c->vftbl;
581 depth_fixed = DISPLAY_SIZE;
585 c->vftbl->subtype_display[depth] = c->vftbl;
589 memcpy(c->vftbl->subtype_display, super->vftbl->subtype_display, sizeof(vftbl_t*) * depth_fixed);
590 for (i=depth_fixed+1; i<=DISPLAY_SIZE; i++)
591 c->vftbl->subtype_display[i] = NULL;
592 c->vftbl->subtype_offset = OFFSET(vftbl_t, subtype_display[0]) + sizeof(vftbl_t*) * depth_fixed;
593 c->vftbl->subtype_depth = depth;
599 /* link_class_intern ***********************************************************
601 Tries to link a class. The function calculates the length in bytes
602 that an instance of this class requires as well as the VTBL for
603 methods and interface methods.
605 *******************************************************************************/
607 static classinfo *link_class_intern(classinfo *c)
609 classinfo *super; /* super class */
610 classinfo *tc; /* temporary class variable */
611 s4 supervftbllength; /* vftbllegnth of super class */
612 s4 vftbllength; /* vftbllength of current class */
613 s4 interfacetablelength; /* interface table length */
614 vftbl_t *v; /* vftbl of current class */
615 s4 i; /* interface/method/field counter */
616 arraydescriptor *arraydesc; /* descriptor for array classes */
617 method_worklist *worklist; /* worklist for recompilation */
618 #if defined(ENABLE_RT_TIMING)
619 struct timespec time_start, time_resolving, time_compute_vftbl,
620 time_abstract, time_compute_iftbl, time_fill_vftbl,
621 time_offsets, time_fill_iftbl, time_finalizer,
625 RT_TIMING_GET_TIME(time_start);
629 /* the class must be loaded */
631 /* XXX should this be a specific exception? */
632 assert(c->state & CLASS_LOADED);
634 /* This is check in link_class. */
636 assert(!(c->state & CLASS_LINKED));
638 /* cache the self-reference of this class */
639 /* we do this for cases where the defining loader of the class */
640 /* has not yet been recorded as an initiating loader for the class */
641 /* this is needed so subsequent code can assume that self-refs */
642 /* will always resolve lazily */
643 /* No need to do it for the bootloader - it is always registered */
644 /* as initiating loader for the classes it loads. */
646 classcache_store(c->classloader,c,false);
648 /* this class is currently linking */
650 c->state |= CLASS_LINKING;
655 /* Link the super interfaces. */
657 for (i = 0; i < c->interfacescount; i++) {
658 tc = c->interfaces[i];
660 if (!(tc->state & CLASS_LINKED))
665 /* check super class */
669 /* Check for java/lang/Object. */
671 if (c->super == NULL) {
673 c->instancesize = sizeof(java_object_t);
675 vftbllength = supervftbllength = 0;
680 /* Get super class. */
684 /* Link the super class if necessary. */
686 if (!(super->state & CLASS_LINKED))
687 if (!link_class(super))
690 /* OR the ACC_CLASS_HAS_POINTERS and the ACC_CLASS_REFERENCE_*
693 c->flags |= (super->flags &
694 (ACC_CLASS_HAS_POINTERS | ACC_CLASS_REFERENCE_MASK));
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];
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) {
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 = (methodinfo*) MREALLOC(c->methods, methodinfo, c->methodscount,
808 c->methodscount + abstractmethodscount);
810 for (i = 0; i < c->interfacescount; i++) {
811 ic = c->interfaces[i];
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) {
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) {
860 for (i = 0; i < tc->interfacescount; i++) {
861 s4 h = class_highestinterface(tc->interfaces[i]) + 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 = (u1*) CompilerStub::generate(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);
954 c->instancesize = MEMORY_ALIGN(c->instancesize, dsize);
955 f->offset = c->instancesize;
956 c->instancesize += dsize;
959 RT_TIMING_GET_TIME(time_offsets);
961 /* initialize interfacetable and interfacevftbllength */
963 v->interfacevftbllength = MNEW(s4, interfacetablelength);
965 #if defined(ENABLE_STATISTICS)
967 count_vftbl_len += (4 + sizeof(s4)) * v->interfacetablelength;
970 for (i = 0; i < interfacetablelength; i++) {
971 v->interfacevftbllength[i] = 0;
972 v->interfacetable[-i] = NULL;
977 for (tc = c; tc != NULL; tc = tc->super)
978 for (i = 0; i < tc->interfacescount; i++)
979 if (!linker_addinterface(c, tc->interfaces[i]))
982 RT_TIMING_GET_TIME(time_fill_iftbl);
984 /* add finalizer method (not for java.lang.Object) */
989 fi = class_findmethod(c, utf_finalize, utf_void__void);
992 if (!(fi->flags & ACC_STATIC))
995 RT_TIMING_GET_TIME(time_finalizer);
999 linker_compute_subclasses(c);
1001 /* FIXME: this is completely useless now */
1002 RT_TIMING_GET_TIME(time_subclasses);
1004 #if USES_NEW_SUBTYPE
1005 if (!build_display(c))
1009 /* revert the linking state and class is linked */
1011 c->state = (c->state & ~CLASS_LINKING) | CLASS_LINKED;
1013 /* check worklist */
1015 /* XXX must this also be done in case of exception? */
1017 while (worklist != NULL) {
1018 method_worklist *wi = worklist;
1020 worklist = worklist->next;
1022 INLINELOG( printf("MUST BE RECOMPILED: "); method_println(wi->m); );
1023 jit_invalidate_code(wi->m);
1025 /* XXX put worklist into dump memory? */
1026 FREE(wi, method_worklist);
1029 RT_TIMING_TIME_DIFF(time_start ,time_resolving ,RT_TIMING_LINK_RESOLVE);
1030 RT_TIMING_TIME_DIFF(time_resolving ,time_compute_vftbl,RT_TIMING_LINK_C_VFTBL);
1031 RT_TIMING_TIME_DIFF(time_compute_vftbl,time_abstract ,RT_TIMING_LINK_ABSTRACT);
1032 RT_TIMING_TIME_DIFF(time_abstract ,time_compute_iftbl,RT_TIMING_LINK_C_IFTBL);
1033 RT_TIMING_TIME_DIFF(time_compute_iftbl,time_fill_vftbl ,RT_TIMING_LINK_F_VFTBL);
1034 RT_TIMING_TIME_DIFF(time_fill_vftbl ,time_offsets ,RT_TIMING_LINK_OFFSETS);
1035 RT_TIMING_TIME_DIFF(time_offsets ,time_fill_iftbl ,RT_TIMING_LINK_F_IFTBL);
1036 RT_TIMING_TIME_DIFF(time_fill_iftbl ,time_finalizer ,RT_TIMING_LINK_FINALIZER);
1037 RT_TIMING_TIME_DIFF(time_finalizer ,time_subclasses ,RT_TIMING_LINK_SUBCLASS);
1039 /* just return c to show that we didn't had a problem */
1045 /* link_array ******************************************************************
1047 This function is called by link_class to create the arraydescriptor
1050 This function returns NULL if the array cannot be linked because
1051 the component type has not been linked yet.
1053 *******************************************************************************/
1055 static arraydescriptor *link_array(classinfo *c)
1059 arraydescriptor *desc;
1064 namelen = c->name->blength;
1066 /* Check the component type */
1068 switch (c->name->text[1]) {
1070 /* c is an array of arrays. */
1071 u = utf_new(c->name->text + 1, namelen - 1);
1072 if (!(comp = load_class_from_classloader(u, c->classloader)))
1077 /* c is an array of objects. */
1078 u = utf_new(c->name->text + 2, namelen - 3);
1079 if (!(comp = load_class_from_classloader(u, c->classloader)))
1084 /* If the component type has not been linked, link it now */
1086 assert(!comp || (comp->state & CLASS_LOADED));
1088 if (comp && !(comp->state & CLASS_LINKED))
1089 if (!link_class(comp))
1092 /* Allocate the arraydescriptor */
1094 desc = NEW(arraydescriptor);
1097 /* c is an array of references */
1098 desc->arraytype = ARRAYTYPE_OBJECT;
1099 desc->componentsize = sizeof(void*);
1100 desc->dataoffset = OFFSET(java_objectarray_t, data);
1102 compvftbl = comp->vftbl;
1105 log_text("Component class has no vftbl");
1109 desc->componentvftbl = compvftbl;
1111 if (compvftbl->arraydesc) {
1112 desc->elementvftbl = compvftbl->arraydesc->elementvftbl;
1114 if (compvftbl->arraydesc->dimension >= 255) {
1115 exceptions_throw_illegalargumentexception();
1119 desc->dimension = compvftbl->arraydesc->dimension + 1;
1120 desc->elementtype = compvftbl->arraydesc->elementtype;
1123 desc->elementvftbl = compvftbl;
1124 desc->dimension = 1;
1125 desc->elementtype = ARRAYTYPE_OBJECT;
1129 /* c is an array of a primitive type */
1130 switch (c->name->text[1]) {
1132 desc->arraytype = ARRAYTYPE_BOOLEAN;
1133 desc->dataoffset = OFFSET(java_booleanarray_t,data);
1134 desc->componentsize = sizeof(u1);
1138 desc->arraytype = ARRAYTYPE_BYTE;
1139 desc->dataoffset = OFFSET(java_bytearray_t,data);
1140 desc->componentsize = sizeof(u1);
1144 desc->arraytype = ARRAYTYPE_CHAR;
1145 desc->dataoffset = OFFSET(java_chararray_t,data);
1146 desc->componentsize = sizeof(u2);
1150 desc->arraytype = ARRAYTYPE_DOUBLE;
1151 desc->dataoffset = OFFSET(java_doublearray_t,data);
1152 desc->componentsize = sizeof(double);
1156 desc->arraytype = ARRAYTYPE_FLOAT;
1157 desc->dataoffset = OFFSET(java_floatarray_t,data);
1158 desc->componentsize = sizeof(float);
1162 desc->arraytype = ARRAYTYPE_INT;
1163 desc->dataoffset = OFFSET(java_intarray_t,data);
1164 desc->componentsize = sizeof(s4);
1168 desc->arraytype = ARRAYTYPE_LONG;
1169 desc->dataoffset = OFFSET(java_longarray_t,data);
1170 desc->componentsize = sizeof(s8);
1174 desc->arraytype = ARRAYTYPE_SHORT;
1175 desc->dataoffset = OFFSET(java_shortarray_t,data);
1176 desc->componentsize = sizeof(s2);
1180 exceptions_throw_noclassdeffounderror(c->name);
1184 desc->componentvftbl = NULL;
1185 desc->elementvftbl = NULL;
1186 desc->dimension = 1;
1187 desc->elementtype = desc->arraytype;
1194 /* linker_compute_subclasses ***************************************************
1198 ATTENTION: DO NOT REMOVE ANY OF THE LOCKING MECHANISMS BELOW:
1199 This function needs to take the class renumber lock and stop the
1200 world during class renumbering. The lock is used in C code which
1201 is not that performance critical. Whereas JIT code uses critical
1202 sections to atomically access the class values.
1204 *******************************************************************************/
1206 static void linker_compute_subclasses(classinfo *c)
1209 LOCK_CLASSRENUMBER_LOCK;
1211 if (!(c->flags & ACC_INTERFACE)) {
1214 #if USES_NEW_SUBTYPE
1215 c->vftbl->baseval = 1; /* so it does not look like an interface */
1219 if (!(c->flags & ACC_INTERFACE) && (c->super != NULL)) {
1220 c->nextsub = c->super->sub;
1226 #if !USES_NEW_SUBTYPE
1227 /* compute class values */
1229 linker_compute_class_values(class_java_lang_Object);
1232 UNLOCK_CLASSRENUMBER_LOCK;
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) {
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]))
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]);
1400 #if defined(__cplusplus)
1405 * These are local overrides for various environment variables in Emacs.
1406 * Please do not remove this and leave it at the end of the file, where
1407 * Emacs will automagically detect them.
1408 * ---------------------------------------------------------------------
1411 * indent-tabs-mode: t
1415 * vim:noexpandtab:sw=4:ts=4: