63 using namespace cacao;
72 # define TRACELINKCLASS(c) \
74 if (opt_TraceLinkClass) { \
76 log_print("[Linking "); \
83 # define TRACELINKCLASS(c)
93 #if !defined(NDEBUG) && defined(ENABLE_INLINING)
94 #define INLINELOG(code) do { if (opt_TraceInlining) { code } } while (0)
96 #define INLINELOG(code)
105 #if !USES_NEW_SUBTYPE
113 #if !USES_NEW_SUBTYPE
139 #if !USES_NEW_SUBTYPE
148 vm_abort(
"linker_preinit: linking java/lang/Object failed");
150 #if defined(ENABLE_JAVASE)
152 vm_abort(
"linker_preinit: linking java/lang/Cloneable failed");
155 vm_abort(
"linker_preinit: linking java/io/Serializable failed");
175 vm_abort(
"linker_init: linking java/lang/Class failed");
184 #if defined(ENABLE_JAVASE)
186 vm_abort(
"linker_init: linking failed");
190 vm_abort(
"linker_init: linking failed");
193 vm_abort(
"linker_init: linking failed");
196 vm_abort(
"linker_init: linking failed");
199 vm_abort(
"linker_init: linking failed");
202 vm_abort(
"linker_init: linking failed");
205 vm_abort(
"linker_init: linking failed");
208 vm_abort(
"linker_init: linking failed");
211 vm_abort(
"linker_init: linking failed");
216 vm_abort(
"linker_init: linking java/lang/String failed");
218 #if defined(ENABLE_JAVASE)
220 vm_abort(
"linker_init: linking failed");
223 vm_abort(
"linker_init: linking failed");
227 vm_abort(
"linker_init: linking failed");
230 vm_abort(
"linker_init: linking failed");
232 #if defined(ENABLE_JAVASE)
234 vm_abort(
"linker_init: linking failed");
238 vm_abort(
"linker_init: linking failed");
240 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
242 vm_abort(
"linker_init: linking failed");
245 vm_abort(
"linker_init: linking failed");
248 vm_abort(
"linker_init: linking failed");
254 vm_abort(
"linker_init: linking failed");
257 vm_abort(
"linker_init: linking failed");
260 vm_abort(
"linker_init: linking failed");
264 #if defined(ENABLE_JAVASE)
266 vm_abort(
"linker_init: linking failed");
269 vm_abort(
"linker_init: linking failed");
272 vm_abort(
"linker_init: linking failed");
275 vm_abort(
"linker_init: linking failed");
277 # if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
279 vm_abort(
"linker_init: linking failed");
282 vm_abort(
"linker_init: linking failed");
285 vm_abort(
"linker_init: linking failed");
289 vm_abort(
"linker_init: linking failed");
292 vm_abort(
"linker_init: linking failed");
295 vm_abort(
"linker_init: linking failed");
297 # if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
299 vm_abort(
"linker_init: linking failed");
301 if (!
link_class(class_sun_reflect_MagicAccessorImpl))
302 vm_abort(
"linker_init: linking failed");
304 if (!
link_class(class_sun_reflect_MethodAccessorImpl))
305 vm_abort(
"linker_init: linking failed");
307 if (!
link_class(class_sun_reflect_ConstructorAccessorImpl))
308 vm_abort(
"linker_init: linking failed");
312 vm_abort(
"linker_init: linking failed");
325 #if defined(ENABLE_JAVASE)
332 #elif defined(ENABLE_JAVAME_CLDC1_1)
338 # error unknown Java configuration
342 vm_abort(
"linker_init: could not cache pseudo_class_Arraystub");
345 vm_abort(
"linker_init: linking pseudo_class_Arraystub failed");
354 vm_abort(
"linker_init: could not cache pseudo_class_Null");
357 vm_abort(
"linker_init: linking failed");
367 vm_abort(
"linker_init: could not cache pseudo_class_New");
397 #if defined(ENABLE_STATISTICS)
400 if (opt_getcompilingtime)
403 if (opt_getloadingtime)
417 #if defined(ENABLE_STATISTICS)
420 if (opt_getloadingtime)
423 if (opt_getcompilingtime)
467 #if defined(ENABLE_VERIFIER)
471 if ((ms->
name != utf8::init)
490 #if defined(ENABLE_TLH)
492 printf(
"%s/%s is evil! the sinner is %s/%s\n",
520 }
while (mg != NULL);
566 depth = super->
vftbl->subtype_depth + 1;
572 if (depth >= DISPLAY_SIZE) {
575 memcpy(c->
vftbl->subtype_overflow, super->
vftbl->subtype_overflow,
sizeof(
vftbl_t*) * (depth - DISPLAY_SIZE));
576 c->
vftbl->subtype_overflow[depth - DISPLAY_SIZE] = c->
vftbl;
577 depth_fixed = DISPLAY_SIZE;
585 memcpy(c->
vftbl->subtype_display, super->
vftbl->subtype_display,
sizeof(
vftbl_t*) * depth_fixed);
586 for (i=depth_fixed+1; i<=DISPLAY_SIZE; i++)
587 c->
vftbl->subtype_display[i] = NULL;
624 s4 interfacetablelength;
662 for (i = 0; i < c->interfacescount; i++) {
676 if (c->super == NULL) {
680 vftbllength = supervftbllength = 0;
703 if (c->name[0] ==
'[')
710 c->index = super->
index + 1;
723 for (i = 0; i < c->methodscount; i++) {
735 goto notfoundvftblindex;
743 goto notfoundvftblindex;
749 goto foundvftblindex;
774 s4 abstractmethodscount;
778 abstractmethodscount = 0;
782 for (i = 0; i < c->interfacescount; i++) {
790 if ((im->
name == utf8::clinit) || (im->
name == utf8::init))
793 for (tc = c; tc != NULL; tc = tc->
super) {
796 goto noabstractmethod;
800 abstractmethodscount++;
807 if (abstractmethodscount > 0) {
813 c->methodscount + abstractmethodscount);
815 for (i = 0; i < c->interfacescount; i++) {
823 if ((im->
name == utf8::clinit) || (im->
name == utf8::init))
826 for (tc = c; tc != NULL; tc = tc->
super) {
829 goto noabstractmethod2;
836 am = &(c->methods[c->methodscount]);
859 interfacetablelength = 0;
861 for (tc = c; tc != NULL; tc = tc->
super) {
865 if (h > interfacetablelength)
866 interfacetablelength = h;
875 sizeof(
methodptr*) * (interfacetablelength - (interfacetablelength > 0)));
877 (interfacetablelength - 1) * (interfacetablelength > 1));
892 for (i = 0; i < supervftbllength; i++)
899 for (; i < vftbllength; i++) {
900 #if defined(ENABLE_JIT)
901 # if defined(ENABLE_INTRP)
914 for (i = 0; i < c->methodscount; i++) {
926 #if defined(ENABLE_JIT)
927 # if defined(ENABLE_INTRP)
950 for (i = 0; i < c->fieldscount; i++) {
957 f->
offset = c->instancesize;
958 c->instancesize += dsize;
969 for (i = 0; i < interfacetablelength; i++) {
976 for (tc = c; tc != NULL; tc = tc->
super)
1003 #if USES_NEW_SUBTYPE
1004 if (!build_display(c))
1016 while (worklist != NULL) {
1019 worklist = worklist->
next;
1057 switch (c->
name[1]) {
1091 compvftbl = comp->
vftbl;
1094 log_text(
"Component class has no vftbl");
1119 switch (c->
name[1]) {
1221 #if USES_NEW_SUBTYPE
1233 #if !USES_NEW_SUBTYPE
1250 #if !USES_NEW_SUBTYPE
1293 vm_abort(
"Internal error: interfacetable overflow");
1313 for (sc = c; sc != NULL; sc = sc->
super) {
1319 #if defined(ENABLE_VERIFIER)
1348 #if defined(ENABLE_JIT)
1349 # if defined(ENABLE_INTRP)
void exceptions_throw_verifyerror(methodinfo *m, const char *message,...)
methodptr * interfacetable[1]
void exceptions_throw_illegalargumentexception(void)
void method_break_assumption_monomorphic(methodinfo *m, method_worklist **wl)
classinfo * class_java_lang_ThreadGroup
classinfo * class_java_lang_reflect_Field
#define STATISTICS(x)
Wrapper for statistics only code.
bool classcache_add_constraints_for_params(classloader_t *a, classloader_t *b, methodinfo *m)
#define RT_TIMER_STOP(var)
Stop the timer var.
classinfo * class_java_lang_RuntimeException
classinfo * class_java_lang_Long
#define TRACELINKCLASS(c)
void linker_preinit(void)
classinfo * class_java_lang_Float
static classinfo * link_class_intern(classinfo *c)
classinfo * class_java_lang_Short
classinfo * class_java_lang_VMSystem
#define LOCK_MONITOR_EXIT(o)
classinfo * class_java_lang_Character
classinfo * class_array_of(classinfo *component, bool link)
classinfo * class_java_lang_Void
classinfo * class_java_lang_VMThrowable
classloader_t * classloader
classinfo * class_java_lang_reflect_VMMethod
void linker_initialize_deferred_strings()
static arraydescriptor * link_array(classinfo *c)
static void linker_compute_class_values(classinfo *c)
#define RT_TIMER_START(var)
Start the timer var.
classinfo * classcache_store(classloader_t *initloader, classinfo *cls, bool mayfree)
Dummy implementation of a mutex.
classinfo * class_java_lang_VMThread
classinfo * pseudo_class_Arraystub
s4 * interfacevftbllength
classinfo * class_java_lang_Object
methodinfo * class_findmethod(classinfo *c, Utf8String name, Utf8String desc)
static deferred_strings_vec_t deferred_strings
classinfo * pseudo_class_Null
#define TRACESUBSYSTEMINITIALIZATION(text)
u1 * intrp_createcompilerstub(methodinfo *m)
#define SAME_PACKAGE(a, b)
void exceptions_throw_noclassdeffounderror(Utf8String name)
void vm_abort(const char *text,...)
#define RT_REGISTER_GROUP(var, name, description)
Register a new (toplevel) group.
#define UNLOCK_CLASSRENUMBER_LOCK
static bool linker_overwrite_method(methodinfo *mg, methodinfo *ms, method_worklist **wl)
void link(basicblock *v, basicblock *w)
bool class_linked(classinfo *c)
jlong jlong jlong jlong jint depth
void jit_invalidate_code(methodinfo *m)
classinfo * class_java_lang_Byte
#define RT_REGISTER_GROUP_TIMER(var, name, description, group)
Register a new timer.
void linker_create_string_later(java_object_t **a, Utf8String u)
classinfo * arrayclass_java_lang_Object
classinfo * class_java_lang_reflect_VMField
void method_println(methodinfo *m)
static JNINativeMethod methods[]
This file contains the statistics framework.
classinfo * class_java_lang_ClassNotFoundException
void exceptions_throw_nullpointerexception(void)
static void * generate(methodinfo *m)
Wrapper for codegen_emit_stub_compiler.
classinfo * class_java_lang_Class
classinfo * class_java_lang_reflect_Method
static void linker_compute_subclasses(classinfo *c)
static s4 class_highestinterface(classinfo *c)
void intrp_asm_abstractmethoderror(void)
bool classcache_store_unique(classinfo *cls)
static Utf8String from_utf8(const char *, size_t)
classinfo * class_java_io_Serializable
classinfo * class_java_lang_System
arraydescriptor * arraydesc
This file contains the real-time timing utilities.
void compilingtime_start(void)
static bool linker_addinterface(classinfo *c, classinfo *ic)
#define LOCK_CLASSRENUMBER_LOCK
Mutex * linker_classrenumber_lock
void loadingtime_stop(void)
classinfo * class_java_lang_String
byte_iterator begin() const
classinfo * pseudo_class_New
classinfo * class_java_lang_Exception
classinfo * class_java_lang_Integer
classinfo * link_class(classinfo *c)
#define LOCK_MONITOR_ENTER(o)
#define MEMORY_ALIGN(pos, size)
classinfo * class_java_lang_SecurityManager
void class_postset_header_vftbl(void)
#define RT_TIMER_STOPSTART(var1, var2)
Stop the timer var1 and start the timer var2.
classinfo * load_class_from_classloader(Utf8String name, classloader_t *cl)
std::vector< std::pair< java_object_t **, Utf8String > > deferred_strings_vec_t
classinfo * class_java_lang_Double
classinfo * class_java_lang_reflect_VMConstructor
classinfo * class_java_lang_Thread
#define MREALLOC(ptr, type, num1, num2)
#define MCOPY(dest, src, type, num)
classinfo * class_java_lang_StackTraceElement
classinfo * class_create_classinfo(Utf8String classname)
classinfo * class_java_util_HashMap
classinfo * resolve_classref_or_classinfo_eager(classref_or_classinfo cls, bool checkaccess)
classinfo * class_java_util_Vector
classinfo * class_java_lang_reflect_Constructor
static JavaString literal(Utf8String)
classinfo * class_java_lang_Boolean
#define STAT_DECLARE_VAR(type, var, init)
Declare an external statistics variable.
classinfo * class_java_security_PrivilegedAction
void * mem_alloc(int32_t size)
const char const void jint length
classinfo * class_java_lang_Throwable
classinfo * class_java_lang_Cloneable
classinfo * class_java_lang_ClassLoader
void compilingtime_stop(void)
void loadingtime_start(void)
bool method_canoverwrite(methodinfo *m, methodinfo *old)