1 /* src/vm/linker.cpp - class linker functions
3 Copyright (C) 1996-2005, 2006, 2007, 2008, 2010
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"
63 /* debugging macros ***********************************************************/
66 # define TRACELINKCLASS(c) \
68 if (opt_TraceLinkClass) { \
70 log_print("[Linking "); \
77 # define TRACELINKCLASS(c)
81 /* #include "vm/resolve.hpp" */
82 /* copied prototype to avoid bootstrapping problem: */
83 classinfo *resolve_classref_or_classinfo_eager(classref_or_classinfo cls, bool checkaccess);
85 #if defined(ENABLE_STATISTICS)
86 # include "vm/statistics.h"
89 #if !defined(NDEBUG) && defined(ENABLE_INLINING)
90 #define INLINELOG(code) do { if (opt_TraceInlining) { code } } while (0)
92 #define INLINELOG(code)
96 /* global variables ***********************************************************/
98 static s4 interfaceindex; /* sequential numbering of interfaces */
101 #if !USES_NEW_SUBTYPE
102 Mutex *linker_classrenumber_lock;
105 #if defined(__cplusplus)
109 /* private functions **********************************************************/
111 static classinfo *link_class_intern(classinfo *c);
112 static arraydescriptor *link_array(classinfo *c);
113 static void linker_compute_class_values(classinfo *c);
114 static void linker_compute_subclasses(classinfo *c);
115 static bool linker_addinterface(classinfo *c, classinfo *ic);
116 static s4 class_highestinterface(classinfo *c);
119 typedef std::vector<std::pair<java_object_t**, utf*> > deferred_strings_vec_t;
120 static deferred_strings_vec_t deferred_strings;
122 /* linker_init *****************************************************************
124 Initializes the linker subsystem and links classes required for the
127 *******************************************************************************/
129 void linker_preinit(void)
131 TRACESUBSYSTEMINITIALIZATION("linker_preinit");
133 /* Reset interface index. */
137 #if defined(ENABLE_THREADS) && !USES_NEW_SUBTYPE
138 /* create the global mutex */
140 linker_classrenumber_lock = new Mutex();
143 /* Link the most basic classes. */
145 if (!link_class(class_java_lang_Object))
146 vm_abort("linker_preinit: linking java/lang/Object failed");
148 #if defined(ENABLE_JAVASE)
149 if (!link_class(class_java_lang_Cloneable))
150 vm_abort("linker_preinit: linking java/lang/Cloneable failed");
152 if (!link_class(class_java_io_Serializable))
153 vm_abort("linker_preinit: linking java/io/Serializable failed");
158 /* linker_init *****************************************************************
160 Links all classes required in the VM.
162 *******************************************************************************/
164 void linker_init(void)
166 TRACESUBSYSTEMINITIALIZATION("linker_init");
168 /* Link java.lang.Class as first class of the system, because we
169 need it's vftbl for all other classes so we can use a class as
172 if (!link_class(class_java_lang_Class))
173 vm_abort("linker_init: linking java/lang/Class failed");
175 /* Now set the header.vftbl of all classes which were created
176 before java.lang.Class was linked. */
178 class_postset_header_vftbl();
180 /* Link primitive-type wrapping classes. */
182 #if defined(ENABLE_JAVASE)
183 if (!link_class(class_java_lang_Void))
184 vm_abort("linker_init: linking failed");
187 if (!link_class(class_java_lang_Boolean))
188 vm_abort("linker_init: linking failed");
190 if (!link_class(class_java_lang_Byte))
191 vm_abort("linker_init: linking failed");
193 if (!link_class(class_java_lang_Character))
194 vm_abort("linker_init: linking failed");
196 if (!link_class(class_java_lang_Short))
197 vm_abort("linker_init: linking failed");
199 if (!link_class(class_java_lang_Integer))
200 vm_abort("linker_init: linking failed");
202 if (!link_class(class_java_lang_Long))
203 vm_abort("linker_init: linking failed");
205 if (!link_class(class_java_lang_Float))
206 vm_abort("linker_init: linking failed");
208 if (!link_class(class_java_lang_Double))
209 vm_abort("linker_init: linking failed");
211 /* Link important system classes. */
213 if (!link_class(class_java_lang_String))
214 vm_abort("linker_init: linking java/lang/String failed");
216 #if defined(ENABLE_JAVASE)
217 if (!link_class(class_java_lang_ClassLoader))
218 vm_abort("linker_init: linking failed");
220 if (!link_class(class_java_lang_SecurityManager))
221 vm_abort("linker_init: linking failed");
224 if (!link_class(class_java_lang_System))
225 vm_abort("linker_init: linking failed");
227 if (!link_class(class_java_lang_Thread))
228 vm_abort("linker_init: linking failed");
230 #if defined(ENABLE_JAVASE)
231 if (!link_class(class_java_lang_ThreadGroup))
232 vm_abort("linker_init: linking failed");
235 if (!link_class(class_java_lang_Throwable))
236 vm_abort("linker_init: linking failed");
238 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
239 if (!link_class(class_java_lang_VMSystem))
240 vm_abort("linker_init: linking failed");
242 if (!link_class(class_java_lang_VMThread))
243 vm_abort("linker_init: linking failed");
245 if (!link_class(class_java_lang_VMThrowable))
246 vm_abort("linker_init: linking failed");
249 /* Important system exceptions. */
251 if (!link_class(class_java_lang_Exception))
252 vm_abort("linker_init: linking failed");
254 if (!link_class(class_java_lang_ClassNotFoundException))
255 vm_abort("linker_init: linking failed");
257 if (!link_class(class_java_lang_RuntimeException))
258 vm_abort("linker_init: linking failed");
260 /* some classes which may be used more often */
262 #if defined(ENABLE_JAVASE)
263 if (!link_class(class_java_lang_StackTraceElement))
264 vm_abort("linker_init: linking failed");
266 if (!link_class(class_java_lang_reflect_Constructor))
267 vm_abort("linker_init: linking failed");
269 if (!link_class(class_java_lang_reflect_Field))
270 vm_abort("linker_init: linking failed");
272 if (!link_class(class_java_lang_reflect_Method))
273 vm_abort("linker_init: linking failed");
275 # if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
276 if (!link_class(class_java_lang_reflect_VMConstructor))
277 vm_abort("linker_init: linking failed");
279 if (!link_class(class_java_lang_reflect_VMField))
280 vm_abort("linker_init: linking failed");
282 if (!link_class(class_java_lang_reflect_VMMethod))
283 vm_abort("linker_init: linking failed");
286 if (!link_class(class_java_security_PrivilegedAction))
287 vm_abort("linker_init: linking failed");
289 if (!link_class(class_java_util_Vector))
290 vm_abort("linker_init: linking failed");
292 if (!link_class(class_java_util_HashMap))
293 vm_abort("linker_init: linking failed");
295 # if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
296 if (!link_class(class_sun_misc_Signal))
297 vm_abort("linker_init: linking failed");
299 if (!link_class(class_sun_reflect_MagicAccessorImpl))
300 vm_abort("linker_init: linking failed");
303 if (!link_class(arrayclass_java_lang_Object))
304 vm_abort("linker_init: linking failed");
308 /* create pseudo classes used by the typechecker */
310 /* pseudo class for Arraystubs (extends java.lang.Object) */
312 pseudo_class_Arraystub =
313 class_create_classinfo(utf_new_char("$ARRAYSTUB$"));
314 pseudo_class_Arraystub->state |= CLASS_LOADED;
315 pseudo_class_Arraystub->super = class_java_lang_Object;
317 #if defined(ENABLE_JAVASE)
319 pseudo_class_Arraystub->interfacescount = 2;
320 pseudo_class_Arraystub->interfaces = MNEW(classinfo*, 2);
321 pseudo_class_Arraystub->interfaces[0] = class_java_lang_Cloneable;
322 pseudo_class_Arraystub->interfaces[1] = class_java_io_Serializable;
324 #elif defined(ENABLE_JAVAME_CLDC1_1)
326 pseudo_class_Arraystub->interfacescount = 0;
327 pseudo_class_Arraystub->interfaces = NULL;
330 # error unknown Java configuration
333 if (!classcache_store_unique(pseudo_class_Arraystub))
334 vm_abort("linker_init: could not cache pseudo_class_Arraystub");
336 if (!link_class(pseudo_class_Arraystub))
337 vm_abort("linker_init: linking pseudo_class_Arraystub failed");
339 /* pseudo class representing the null type */
341 pseudo_class_Null = class_create_classinfo(utf_new_char("$NULL$"));
342 pseudo_class_Null->state |= CLASS_LOADED;
343 pseudo_class_Null->super = class_java_lang_Object;
345 if (!classcache_store_unique(pseudo_class_Null))
346 vm_abort("linker_init: could not cache pseudo_class_Null");
348 if (!link_class(pseudo_class_Null))
349 vm_abort("linker_init: linking failed");
351 /* pseudo class representing new uninitialized objects */
353 pseudo_class_New = class_create_classinfo(utf_new_char("$NEW$"));
354 pseudo_class_New->state |= CLASS_LOADED;
355 pseudo_class_New->state |= CLASS_LINKED; /* XXX is this allright? */
356 pseudo_class_New->super = class_java_lang_Object;
358 if (!classcache_store_unique(pseudo_class_New))
359 vm_abort("linker_init: could not cache pseudo_class_New");
361 /* Correct vftbl-entries (retarded loading and linking of class
362 java/lang/String). */
364 stringtable_update();
368 /* link_class ******************************************************************
370 Wrapper function for link_class_intern to ease monitor enter/exit
371 and exception handling.
373 *******************************************************************************/
375 classinfo *link_class(classinfo *c)
378 #if defined(ENABLE_RT_TIMING)
379 struct timespec time_start, time_end;
382 RT_TIMING_GET_TIME(time_start);
385 exceptions_throw_nullpointerexception();
389 LOCK_MONITOR_ENTER(c);
391 /* Maybe the class is currently linking or is already linked.*/
393 if ((c->state & CLASS_LINKING) || (c->state & CLASS_LINKED)) {
394 LOCK_MONITOR_EXIT(c);
399 #if defined(ENABLE_STATISTICS)
402 if (opt_getcompilingtime)
403 compilingtime_stop();
405 if (opt_getloadingtime)
409 /* call the internal function */
411 r = link_class_intern(c);
413 /* If return value is NULL, we had a problem and the class is not
417 c->state &= ~CLASS_LINKING;
419 #if defined(ENABLE_STATISTICS)
422 if (opt_getloadingtime)
425 if (opt_getcompilingtime)
426 compilingtime_start();
429 LOCK_MONITOR_EXIT(c);
431 RT_TIMING_GET_TIME(time_end);
433 RT_TIMING_TIME_DIFF(time_start,time_end,RT_TIMING_LINK_TOTAL);
435 // Hook point just after a class was linked.
436 Hook::class_linked(r);
442 /* linker_overwrite_method *****************************************************
444 Overwrite a method with another one, update method flags and check
448 mg................the general method being overwritten
449 ms................the overwriting (more specialized) method
450 wl................worklist where to add invalidated methods
453 true..............everything ok
454 false.............an exception has been thrown
456 *******************************************************************************/
458 static bool linker_overwrite_method(methodinfo *mg,
460 method_worklist **wl)
468 /* overriding a final method is illegal */
470 if (mg->flags & ACC_FINAL) {
471 exceptions_throw_verifyerror(mg, "Overriding final method");
475 /* method ms overwrites method mg */
477 #if defined(ENABLE_VERIFIER)
478 /* Add loading constraints (for the more general types of method mg). */
479 /* Not for <init>, as it is not invoked virtually. */
481 if ((ms->name != utf_init)
482 && !classcache_add_constraints_for_params(
483 cs->classloader, cg->classloader, mg))
489 /* inherit the vftbl index, and record the overwriting */
491 ms->vftblindex = mg->vftblindex;
494 /* update flags and check assumptions */
495 /* <init> methods are a special case, as they are never dispatched dynamically */
497 if ((ms->flags & ACC_METHOD_IMPLEMENTED) && ms->name != utf_init) {
500 #if defined(ENABLE_TLH)
501 if (mg->flags & ACC_METHOD_MONOMORPHY_USED) {
502 printf("%s/%s is evil! the siner is %s/%s\n", mg->clazz->name->text, mg->name->text,
503 ms->clazz->name->text, ms->name->text);
504 ms->flags |= ACC_METHOD_PARENT_MONOMORPHY_USED;
508 if (mg->flags & ACC_METHOD_IMPLEMENTED) {
509 /* this adds another implementation */
511 mg->flags &= ~ACC_METHOD_MONOMORPHIC;
513 INLINELOG( printf("becomes polymorphic: "); method_println(mg); );
515 method_break_assumption_monomorphic(mg, wl);
518 /* this is the first implementation */
520 mg->flags |= ACC_METHOD_IMPLEMENTED;
522 INLINELOG( printf("becomes implemented: "); method_println(mg); );
527 } while (mg != NULL);
535 /* build_display ***************************************************************
537 Builds the entire display for a class. This entails filling the fixed part
538 as well as allocating and initializing the overflow part.
540 See Cliff Click and John Rose: Fast subtype checking in the Hotspot JVM.
542 *******************************************************************************/
544 static classinfo *build_display(classinfo *c)
552 if (c->vftbl->arraydesc) {
553 arraydescriptor *a = c->vftbl->arraydesc;
554 if (a->elementvftbl && a->elementvftbl->clazz->super) {
555 classinfo *cls = a->elementvftbl->clazz->super;
557 for (n=0; n<a->dimension; n++)
558 cls = class_array_of(cls, true);
562 if (a->componentvftbl && a->elementvftbl) {
563 super = a->componentvftbl->clazz;
567 /* Normal classes. */
571 if (!link_class(super))
573 depth = super->vftbl->subtype_depth + 1;
575 /* java.lang.Object doesn't have a super class. */
578 /* Now copy super's display, append c->vftbl and initialize the remaining fields. */
579 if (depth >= DISPLAY_SIZE) {
580 c->vftbl->subtype_overflow = MNEW(vftbl_t *, depth - DISPLAY_SIZE + 1);
581 #if defined(ENABLE_STATISTICS)
583 count_vftbl_len += sizeof(vftbl_t*) * (depth - DISPLAY_SIZE + 1);
585 memcpy(c->vftbl->subtype_overflow, super->vftbl->subtype_overflow, sizeof(vftbl_t*) * (depth - DISPLAY_SIZE));
586 c->vftbl->subtype_overflow[depth - DISPLAY_SIZE] = c->vftbl;
587 depth_fixed = DISPLAY_SIZE;
591 c->vftbl->subtype_display[depth] = c->vftbl;
595 memcpy(c->vftbl->subtype_display, super->vftbl->subtype_display, sizeof(vftbl_t*) * depth_fixed);
596 for (i=depth_fixed+1; i<=DISPLAY_SIZE; i++)
597 c->vftbl->subtype_display[i] = NULL;
598 c->vftbl->subtype_offset = OFFSET(vftbl_t, subtype_display[0]) + sizeof(vftbl_t*) * depth_fixed;
599 c->vftbl->subtype_depth = depth;
605 /* link_class_intern ***********************************************************
607 Tries to link a class. The function calculates the length in bytes
608 that an instance of this class requires as well as the VTBL for
609 methods and interface methods.
611 *******************************************************************************/
613 static classinfo *link_class_intern(classinfo *c)
615 classinfo *super; /* super class */
616 classinfo *tc; /* temporary class variable */
617 s4 supervftbllength; /* vftbllegnth of super class */
618 s4 vftbllength; /* vftbllength of current class */
619 s4 interfacetablelength; /* interface table length */
620 vftbl_t *v; /* vftbl of current class */
621 s4 i; /* interface/method/field counter */
622 arraydescriptor *arraydesc; /* descriptor for array classes */
623 method_worklist *worklist; /* worklist for recompilation */
624 #if defined(ENABLE_RT_TIMING)
625 struct timespec time_start, time_resolving, time_compute_vftbl,
626 time_abstract, time_compute_iftbl, time_fill_vftbl,
627 time_offsets, time_fill_iftbl, time_finalizer,
631 RT_TIMING_GET_TIME(time_start);
635 /* the class must be loaded */
637 /* XXX should this be a specific exception? */
638 assert(c->state & CLASS_LOADED);
640 /* This is check in link_class. */
642 assert(!(c->state & CLASS_LINKED));
644 /* cache the self-reference of this class */
645 /* we do this for cases where the defining loader of the class */
646 /* has not yet been recorded as an initiating loader for the class */
647 /* this is needed so subsequent code can assume that self-refs */
648 /* will always resolve lazily */
649 /* No need to do it for the bootloader - it is always registered */
650 /* as initiating loader for the classes it loads. */
652 classcache_store(c->classloader,c,false);
654 /* this class is currently linking */
656 c->state |= CLASS_LINKING;
661 /* Link the super interfaces. */
663 for (i = 0; i < c->interfacescount; i++) {
664 tc = c->interfaces[i];
666 if (!(tc->state & CLASS_LINKED))
671 /* check super class */
675 /* Check for java/lang/Object. */
677 if (c->super == NULL) {
679 c->instancesize = sizeof(java_object_t);
681 vftbllength = supervftbllength = 0;
686 /* Get super class. */
690 /* Link the super class if necessary. */
692 if (!(super->state & CLASS_LINKED))
693 if (!link_class(super))
696 /* OR the ACC_CLASS_HAS_POINTERS and the ACC_CLASS_REFERENCE_*
699 c->flags |= (super->flags &
700 (ACC_CLASS_HAS_POINTERS | ACC_CLASS_REFERENCE_MASK));
702 /* handle array classes */
704 if (c->name->text[0] == '[')
705 if (!(arraydesc = link_array(c)))
708 if (c->flags & ACC_INTERFACE)
709 c->index = interfaceindex++;
711 c->index = super->index + 1;
713 c->instancesize = super->instancesize;
715 vftbllength = supervftbllength = super->vftbl->vftbllength;
717 c->finalizer = super->finalizer;
719 RT_TIMING_GET_TIME(time_resolving);
722 /* compute vftbl length */
724 for (i = 0; i < c->methodscount; i++) {
725 methodinfo *m = &(c->methods[i]);
727 if (!(m->flags & ACC_STATIC)) { /* is instance method */
733 for (j = 0; j < tc->methodscount; j++) {
734 if (method_canoverwrite(m, &(tc->methods[j]))) {
735 if (tc->methods[j].flags & ACC_PRIVATE)
736 goto notfoundvftblindex;
738 /* package-private methods in other packages */
739 /* must not be overridden */
740 /* (see Java Language Specification 8.4.8.1) */
741 if ( !(tc->methods[j].flags & (ACC_PUBLIC | ACC_PROTECTED))
742 && !SAME_PACKAGE(c,tc) )
744 goto notfoundvftblindex;
747 if (!linker_overwrite_method(&(tc->methods[j]), m, &worklist))
750 goto foundvftblindex;
758 m->vftblindex = (vftbllength++);
763 RT_TIMING_GET_TIME(time_compute_vftbl);
766 /* Check all interfaces of an abstract class (maybe be an
767 interface too) for unimplemented methods. Such methods are
768 called miranda-methods and are marked with the ACC_MIRANDA
769 flag. VMClass.getDeclaredMethods does not return such
772 if (c->flags & ACC_ABSTRACT) {
775 s4 abstractmethodscount;
779 abstractmethodscount = 0;
781 /* check all interfaces of the abstract class */
783 for (i = 0; i < c->interfacescount; i++) {
784 ic = c->interfaces[i];
786 for (j = 0; j < ic->methodscount; j++) {
787 im = &(ic->methods[j]);
789 /* skip `<clinit>' and `<init>' */
791 if ((im->name == utf_clinit) || (im->name == utf_init))
794 for (tc = c; tc != NULL; tc = tc->super) {
795 for (k = 0; k < tc->methodscount; k++) {
796 if (method_canoverwrite(im, &(tc->methods[k])))
797 goto noabstractmethod;
801 abstractmethodscount++;
808 if (abstractmethodscount > 0) {
811 /* reallocate methods memory */
813 c->methods = (methodinfo*) MREALLOC(c->methods, methodinfo, c->methodscount,
814 c->methodscount + abstractmethodscount);
816 for (i = 0; i < c->interfacescount; i++) {
817 ic = c->interfaces[i];
819 for (j = 0; j < ic->methodscount; j++) {
820 im = &(ic->methods[j]);
822 /* skip `<clinit>' and `<init>' */
824 if ((im->name == utf_clinit) || (im->name == utf_init))
827 for (tc = c; tc != NULL; tc = tc->super) {
828 for (k = 0; k < tc->methodscount; k++) {
829 if (method_canoverwrite(im, &(tc->methods[k])))
830 goto noabstractmethod2;
834 /* Copy the method found into the new c->methods
835 array and tag it as miranda-method. */
837 am = &(c->methods[c->methodscount]);
840 MCOPY(am, im, methodinfo, 1);
842 am->vftblindex = (vftbllength++);
844 am->flags |= ACC_MIRANDA;
852 RT_TIMING_GET_TIME(time_abstract);
855 #if defined(ENABLE_STATISTICS)
858 sizeof(vftbl_t) + (sizeof(methodptr) * (vftbllength - 1));
861 /* compute interfacetable length */
863 interfacetablelength = 0;
865 for (tc = c; tc != NULL; tc = tc->super) {
866 for (i = 0; i < tc->interfacescount; i++) {
867 s4 h = class_highestinterface(tc->interfaces[i]) + 1;
869 if (h > interfacetablelength)
870 interfacetablelength = h;
873 RT_TIMING_GET_TIME(time_compute_iftbl);
875 /* allocate virtual function table */
877 v = (vftbl_t *) mem_alloc(sizeof(vftbl_t) +
878 sizeof(methodptr) * (vftbllength - 1) +
879 sizeof(methodptr*) * (interfacetablelength - (interfacetablelength > 0)));
880 v = (vftbl_t *) (((methodptr *) v) +
881 (interfacetablelength - 1) * (interfacetablelength > 1));
885 v->vftbllength = vftbllength;
886 v->interfacetablelength = interfacetablelength;
887 v->arraydesc = arraydesc;
889 /* store interface index in vftbl */
891 if (c->flags & ACC_INTERFACE)
892 v->baseval = -(c->index);
894 /* copy virtual function table of super class */
896 for (i = 0; i < supervftbllength; i++)
897 v->table[i] = super->vftbl->table[i];
899 /* Fill the remaining vftbl slots with the AbstractMethodError
900 stub (all after the super class slots, because they are already
903 for (; i < vftbllength; i++) {
904 #if defined(ENABLE_JIT)
905 # if defined(ENABLE_INTRP)
907 v->table[i] = (methodptr) (ptrint) &intrp_asm_abstractmethoderror;
910 v->table[i] = (methodptr) (ptrint) &asm_abstractmethoderror;
912 v->table[i] = (methodptr) (ptrint) &intrp_asm_abstractmethoderror;
916 /* add method stubs into virtual function table */
918 for (i = 0; i < c->methodscount; i++) {
919 methodinfo *m = &(c->methods[i]);
921 assert(m->stubroutine == NULL);
923 /* Don't create a compiler stub for abstract methods as they
924 throw an AbstractMethodError with the default stub in the
925 vftbl. This entry is simply copied by sub-classes. */
927 if (m->flags & ACC_ABSTRACT)
930 #if defined(ENABLE_JIT)
931 # if defined(ENABLE_INTRP)
933 m->stubroutine = intrp_createcompilerstub(m);
936 m->stubroutine = (u1*) CompilerStub::generate(m);
938 m->stubroutine = intrp_createcompilerstub(m);
941 /* static methods are not in the vftbl */
943 if (m->flags & ACC_STATIC)
946 /* insert the stubroutine into the vftbl */
948 v->table[m->vftblindex] = (methodptr) (ptrint) m->stubroutine;
950 RT_TIMING_GET_TIME(time_fill_vftbl);
952 /* compute instance size and offset of each field */
954 for (i = 0; i < c->fieldscount; i++) {
956 fieldinfo *f = &(c->fields[i]);
958 if (!(f->flags & ACC_STATIC)) {
959 dsize = descriptor_typesize(f->parseddesc);
960 c->instancesize = MEMORY_ALIGN(c->instancesize, dsize);
961 f->offset = c->instancesize;
962 c->instancesize += dsize;
965 RT_TIMING_GET_TIME(time_offsets);
967 /* initialize interfacetable and interfacevftbllength */
969 v->interfacevftbllength = MNEW(s4, interfacetablelength);
971 #if defined(ENABLE_STATISTICS)
973 count_vftbl_len += (4 + sizeof(s4)) * v->interfacetablelength;
976 for (i = 0; i < interfacetablelength; i++) {
977 v->interfacevftbllength[i] = 0;
978 v->interfacetable[-i] = NULL;
983 for (tc = c; tc != NULL; tc = tc->super)
984 for (i = 0; i < tc->interfacescount; i++)
985 if (!linker_addinterface(c, tc->interfaces[i]))
988 RT_TIMING_GET_TIME(time_fill_iftbl);
990 /* add finalizer method (not for java.lang.Object) */
995 fi = class_findmethod(c, utf_finalize, utf_void__void);
998 if (!(fi->flags & ACC_STATIC))
1001 RT_TIMING_GET_TIME(time_finalizer);
1005 linker_compute_subclasses(c);
1007 /* FIXME: this is completely useless now */
1008 RT_TIMING_GET_TIME(time_subclasses);
1010 #if USES_NEW_SUBTYPE
1011 if (!build_display(c))
1015 /* revert the linking state and class is linked */
1017 c->state = (c->state & ~CLASS_LINKING) | CLASS_LINKED;
1019 /* check worklist */
1021 /* XXX must this also be done in case of exception? */
1023 while (worklist != NULL) {
1024 method_worklist *wi = worklist;
1026 worklist = worklist->next;
1028 INLINELOG( printf("MUST BE RECOMPILED: "); method_println(wi->m); );
1029 jit_invalidate_code(wi->m);
1031 /* XXX put worklist into dump memory? */
1032 FREE(wi, method_worklist);
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_t, 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 exceptions_throw_illegalargumentexception();
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_t,data);
1140 desc->componentsize = sizeof(u1);
1144 desc->arraytype = ARRAYTYPE_BYTE;
1145 desc->dataoffset = OFFSET(java_bytearray_t,data);
1146 desc->componentsize = sizeof(u1);
1150 desc->arraytype = ARRAYTYPE_CHAR;
1151 desc->dataoffset = OFFSET(java_chararray_t,data);
1152 desc->componentsize = sizeof(u2);
1156 desc->arraytype = ARRAYTYPE_DOUBLE;
1157 desc->dataoffset = OFFSET(java_doublearray_t,data);
1158 desc->componentsize = sizeof(double);
1162 desc->arraytype = ARRAYTYPE_FLOAT;
1163 desc->dataoffset = OFFSET(java_floatarray_t,data);
1164 desc->componentsize = sizeof(float);
1168 desc->arraytype = ARRAYTYPE_INT;
1169 desc->dataoffset = OFFSET(java_intarray_t,data);
1170 desc->componentsize = sizeof(s4);
1174 desc->arraytype = ARRAYTYPE_LONG;
1175 desc->dataoffset = OFFSET(java_longarray_t,data);
1176 desc->componentsize = sizeof(s8);
1180 desc->arraytype = ARRAYTYPE_SHORT;
1181 desc->dataoffset = OFFSET(java_shortarray_t,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;
1199 /* linker_create_string_later **************************************************
1201 A hack so we can initialize java.lang.String objects during initialization.
1203 *******************************************************************************/
1204 void linker_create_string_later(java_object_t **a, utf *u)
1206 deferred_strings.push_back(std::make_pair(a, u));
1209 void linker_initialize_deferred_strings()
1211 deferred_strings_vec_t::const_iterator it = deferred_strings.begin();
1212 for (; it != deferred_strings.end(); ++it)
1213 *it->first = literalstring_new(it->second);
1214 deferred_strings.clear();
1218 /* linker_compute_subclasses ***************************************************
1222 ATTENTION: DO NOT REMOVE ANY OF THE LOCKING MECHANISMS BELOW:
1223 This function needs to take the class renumber lock and stop the
1224 world during class renumbering. The lock is used in C code which
1225 is not that performance critical. Whereas JIT code uses critical
1226 sections to atomically access the class values.
1228 *******************************************************************************/
1230 static void linker_compute_subclasses(classinfo *c)
1233 LOCK_CLASSRENUMBER_LOCK;
1235 if (!(c->flags & ACC_INTERFACE)) {
1238 #if USES_NEW_SUBTYPE
1239 c->vftbl->baseval = 1; /* so it does not look like an interface */
1243 if (!(c->flags & ACC_INTERFACE) && (c->super != NULL)) {
1244 c->nextsub = c->super->sub;
1250 #if !USES_NEW_SUBTYPE
1251 /* compute class values */
1253 linker_compute_class_values(class_java_lang_Object);
1256 UNLOCK_CLASSRENUMBER_LOCK;
1261 /* linker_compute_class_values *************************************************
1265 *******************************************************************************/
1267 static void linker_compute_class_values(classinfo *c)
1271 c->vftbl->baseval = ++classvalue;
1276 linker_compute_class_values(subs);
1278 subs = subs->nextsub;
1281 c->vftbl->diffval = classvalue - c->vftbl->baseval;
1285 /* linker_addinterface *********************************************************
1287 Is needed by link_class for adding a VTBL to a class. All
1288 interfaces implemented by ic are added as well.
1291 true.........everything ok
1292 false........an exception has been thrown
1294 *******************************************************************************/
1296 static bool linker_addinterface(classinfo *c, classinfo *ic)
1307 if (i >= v->interfacetablelength)
1308 vm_abort("Internal error: interfacetable overflow");
1310 /* if this interface has already been added, return immediately */
1312 if (v->interfacetable[-i] != NULL)
1315 if (ic->methodscount == 0) { /* fake entry needed for subtype test */
1316 v->interfacevftbllength[i] = 1;
1317 v->interfacetable[-i] = MNEW(methodptr, 1);
1318 v->interfacetable[-i][0] = NULL;
1321 v->interfacevftbllength[i] = ic->methodscount;
1322 v->interfacetable[-i] = MNEW(methodptr, ic->methodscount);
1324 #if defined(ENABLE_STATISTICS)
1326 count_vftbl_len += sizeof(methodptr) *
1327 (ic->methodscount + (ic->methodscount == 0));
1330 for (j = 0; j < ic->methodscount; j++) {
1331 for (sc = c; sc != NULL; sc = sc->super) {
1332 for (k = 0; k < sc->methodscount; k++) {
1333 m = &(sc->methods[k]);
1335 if (method_canoverwrite(m, &(ic->methods[j]))) {
1336 /* method m overwrites the (abstract) method */
1337 #if defined(ENABLE_VERIFIER)
1338 /* Add loading constraints (for the more
1339 general types of the method
1341 if (!classcache_add_constraints_for_params(
1342 c->classloader, ic->classloader,
1349 /* XXX taken from gcj */
1350 /* check for ACC_STATIC: IncompatibleClassChangeError */
1352 /* check for !ACC_PUBLIC: IllegalAccessError */
1354 /* check for ACC_ABSTRACT: AbstracMethodError,
1355 not sure about that one */
1357 v->interfacetable[-i][j] = v->table[m->vftblindex];
1363 /* If no method was found, insert the AbstractMethodError
1366 #if defined(ENABLE_JIT)
1367 # if defined(ENABLE_INTRP)
1369 v->interfacetable[-i][j] =
1370 (methodptr) (ptrint) &intrp_asm_abstractmethoderror;
1373 v->interfacetable[-i][j] =
1374 (methodptr) (ptrint) &asm_abstractmethoderror;
1376 v->interfacetable[-i][j] =
1377 (methodptr) (ptrint) &intrp_asm_abstractmethoderror;
1385 /* add superinterfaces of this interface */
1387 for (j = 0; j < ic->interfacescount; j++)
1388 if (!linker_addinterface(c, ic->interfaces[j]))
1397 /* class_highestinterface ******************************************************
1399 Used by the function link_class to determine the amount of memory
1400 needed for the interface table.
1402 *******************************************************************************/
1404 static s4 class_highestinterface(classinfo *c)
1410 /* check for ACC_INTERFACE bit already done in link_class_intern */
1414 for (i = 0; i < c->interfacescount; i++) {
1415 h2 = class_highestinterface(c->interfaces[i]);
1424 #if defined(__cplusplus)
1429 * These are local overrides for various environment variables in Emacs.
1430 * Please do not remove this and leave it at the end of the file, where
1431 * Emacs will automagically detect them.
1432 * ---------------------------------------------------------------------
1435 * indent-tabs-mode: t
1439 * vim:noexpandtab:sw=4:ts=4: