# HG changeset patch # User Stefan Ring # Date 1213041161 -7200 # Branch subtype # Node ID f4d2cd262a58a830d9f1ddc7f1e783e6b118d467 # Parent b8487bde49f1dafb6e1817915d86a3fc506cabfc * src/vm/builtin.c: Added fast_subtype_check. (builtin_fast_canstore, builtin_fast_canstore_onedim, builtin_fast_canstore_onedim_class): Using fast subtype check. Don't need to lock linker_classrenumber_lock anymore. * src/vm/builtin.h: Added fast_subtype_check. * src/vm/jit/emit-common.h: Added more branch labels. * src/vm/jit/x86_64/codegen.c (gen_method): New subtype checking code. * src/vm/jit/x86_64/codegen.h: Added some new mnemonics. * src/vm/jit/x86_64/emit.c: New mnemonics. (emit_classcast_check): New branch modes. * src/vm/jit/x86_64/emit.h: New mnemonics. * src/vmcore/class.c (class_isanysubclass): Using fast_subtype_check. * src/vmcore/linker.c: Removed linker_classrenumber_lock. (build_display): Implemented. (link_class_intern, link_array, linker_compute_subclasses): Minor changes. * src/vmcore/linker.h: Removed linker_compute_subclasses. Added subtype-related fields to _vftbl. * src/cacaoh/dummy.c: Added fast_subtype_check (link dependency). diff -r b8487bde49f1 -r f4d2cd262a58 src/cacaoh/dummy.c --- a/src/cacaoh/dummy.c Mon Jun 09 17:31:43 2008 +0200 +++ b/src/cacaoh/dummy.c Mon Jun 09 21:52:41 2008 +0200 @@ -158,6 +158,12 @@ { vm_abort("builtin_clone: Not implemented."); return NULL; +} + +bool fast_subtype_check(struct _vftbl *s, struct _vftbl *t) +{ + vm_abort("fast_subtype_check: Not implemented."); + return 0; } bool builtin_isanysubclass(classinfo *sub, classinfo *super) diff -r b8487bde49f1 -r f4d2cd262a58 src/vm/builtin.c --- a/src/vm/builtin.c Mon Jun 09 17:31:43 2008 +0200 +++ b/src/vm/builtin.c Mon Jun 09 21:52:41 2008 +0200 @@ -667,6 +667,19 @@ *******************************************************************************/ +bool fast_subtype_check(struct _vftbl *s, struct _vftbl *t) +{ + int i; + if (s->subtype_display[t->subtype_depth] == t) + return true; + if (t->subtype_offset != OFFSET(vftbl_t, subtype_display[DISPLAY_SIZE])) + return false; + for (i=0; isubtype_overflow_length; i++) + if (s->subtype_overflow[i] == t) + return true; + return false; +} + bool builtin_fast_canstore(java_objectarray_t *oa, java_object_t *o) { arraydescriptor *desc; @@ -699,8 +712,6 @@ if (valuevftbl == componentvftbl) return 1; - LOCK_MONITOR_ENTER(linker_classrenumber_lock); - baseval = componentvftbl->baseval; if (baseval <= 0) { @@ -710,11 +721,8 @@ (valuevftbl->interfacetable[baseval] != NULL)); } else { - diffval = valuevftbl->baseval - componentvftbl->baseval; - result = diffval <= (uint32_t) componentvftbl->diffval; + result = fast_subtype_check(valuevftbl, componentvftbl); } - - LOCK_MONITOR_EXIT(linker_classrenumber_lock); } else if (valuedesc == NULL) { /* {oa has dimension > 1} */ @@ -766,8 +774,6 @@ if (valuevftbl == elementvftbl) return 1; - LOCK_MONITOR_ENTER(linker_classrenumber_lock); - baseval = elementvftbl->baseval; if (baseval <= 0) { @@ -776,11 +782,8 @@ (valuevftbl->interfacetable[baseval] != NULL)); } else { - diffval = valuevftbl->baseval - elementvftbl->baseval; - result = diffval <= (uint32_t) elementvftbl->diffval; + result = fast_subtype_check(valuevftbl, elementvftbl); } - - LOCK_MONITOR_EXIT(linker_classrenumber_lock); return result; } @@ -815,12 +818,7 @@ if (valuevftbl == elementvftbl) return 1; - LOCK_MONITOR_ENTER(linker_classrenumber_lock); - - diffval = valuevftbl->baseval - elementvftbl->baseval; - result = diffval <= (uint32_t) elementvftbl->diffval; - - LOCK_MONITOR_EXIT(linker_classrenumber_lock); + result = fast_subtype_check(valuevftbl, elementvftbl); return result; } diff -r b8487bde49f1 -r f4d2cd262a58 src/vm/builtin.h --- a/src/vm/builtin.h Mon Jun 09 17:31:43 2008 +0200 +++ b/src/vm/builtin.h Mon Jun 09 21:52:41 2008 +0200 @@ -119,6 +119,8 @@ * (The BUILTIN* opcodes are ICMD_BUILTIN1, ICMD_BUILTIN2 and * ICMD_BUILTIN3.) */ + +bool fast_subtype_check(struct _vftbl *, struct _vftbl *); bool builtin_instanceof(java_handle_t *obj, classinfo *class); /* NOT AN OP */ diff -r b8487bde49f1 -r f4d2cd262a58 src/vm/jit/emit-common.h --- a/src/vm/jit/emit-common.h Mon Jun 09 17:31:43 2008 +0200 +++ b/src/vm/jit/emit-common.h Mon Jun 09 21:52:41 2008 +0200 @@ -45,6 +45,10 @@ #define BRANCH_LABEL_4 4 #define BRANCH_LABEL_5 5 #define BRANCH_LABEL_6 6 +#define BRANCH_LABEL_7 7 +#define BRANCH_LABEL_8 8 +#define BRANCH_LABEL_9 9 +#define BRANCH_LABEL_10 10 /* constant range macros ******************************************************/ diff -r b8487bde49f1 -r f4d2cd262a58 src/vm/jit/x86_64/codegen.c --- a/src/vm/jit/x86_64/codegen.c Mon Jun 09 17:31:43 2008 +0200 +++ b/src/vm/jit/x86_64/codegen.c Mon Jun 09 21:52:41 2008 +0200 @@ -2486,6 +2486,8 @@ classinfo *super; s4 superindex; + s4 looptarget; + if (INSTRUCTION_IS_UNRESOLVED(iptr)) { super = NULL; superindex = 0; @@ -2494,9 +2496,6 @@ super = iptr->sx.s23.s3.c.cls; superindex = super->index; } - - if ((super == NULL) || !(super->flags & ACC_INTERFACE)) - CODEGEN_CRITICAL_SECTION_NEW; s1 = emit_load_s1(jd, iptr, REG_ITMP1); @@ -2567,37 +2566,66 @@ disp = dseg_add_address(cd, super->vftbl); } - M_ALD(REG_ITMP2, s1, OFFSET(java_object_t, vftbl)); - M_ALD(REG_ITMP3, RIP, disp); + if (s1 == REG_ITMP1) + M_AST(REG_ITMP1, REG_SP, -8); /* store in red zone */ - CODEGEN_CRITICAL_SECTION_START; + M_ALD(REG_ITMP1, s1, OFFSET(java_object_t, vftbl)); + M_ALD(REG_ITMP2, RIP, disp); - M_ILD(REG_ITMP2, REG_ITMP2, OFFSET(vftbl_t, baseval)); + if (super == NULL || super->vftbl->subtype_depth >= DISPLAY_SIZE) { + M_ALD(REG_ITMP3, REG_ITMP2, OFFSET(vftbl_t, subtype_offset)); - /* if (s1 != REG_ITMP1) { */ - /* emit_movl_membase_reg(cd, REG_ITMP3, */ - /* OFFSET(vftbl_t, baseval), */ - /* REG_ITMP1); */ - /* emit_movl_membase_reg(cd, REG_ITMP3, */ - /* OFFSET(vftbl_t, diffval), */ - /* REG_ITMP3); */ - /* #if defined(ENABLE_THREADS) */ - /* codegen_threadcritstop(cd, cd->mcodeptr - cd->mcodebase); */ - /* #endif */ - /* emit_alu_reg_reg(cd, ALU_SUB, REG_ITMP1, REG_ITMP2); */ + *(cd->mcodeptr++) = 0x4e; + *(cd->mcodeptr++) = 0x3b; + *(cd->mcodeptr++) = 0x14; + *(cd->mcodeptr++) = 0x18; + /* cmp (ITMP1, ITMP3, 1), ITMP2 */ - /* } else { */ + emit_label_beq(cd, BRANCH_LABEL_6); /* good */ - M_ILD(REG_ITMP3, REG_ITMP3, OFFSET(vftbl_t, baseval)); - M_ISUB(REG_ITMP3, REG_ITMP2); - M_ALD(REG_ITMP3, RIP, disp); - M_ILD(REG_ITMP3, REG_ITMP3, OFFSET(vftbl_t, diffval)); - /* } */ + M_LCMP_IMM(OFFSET(vftbl_t, subtype_display[DISPLAY_SIZE]), REG_ITMP3); + emit_classcast_check(cd, iptr, BRANCH_NE, REG_ITMP3, s1); - CODEGEN_CRITICAL_SECTION_END; + /* use red zone */ + M_AST(REG_ITMP2, REG_SP, -16); + M_AST_IMM32(0, REG_SP, -24); + M_ALD(REG_ITMP3, REG_ITMP1, OFFSET(vftbl_t, subtype_overflow)); + looptarget = cd->mcodeptr - cd->mcodebase; - M_ICMP(REG_ITMP3, REG_ITMP2); - emit_classcast_check(cd, iptr, BRANCH_UGT, REG_ITMP3, s1); + M_ALD(REG_ITMP2, REG_SP, -24); + M_ICMP_MEMBASE(REG_ITMP1, OFFSET(vftbl_t, subtype_overflow_length), REG_ITMP2); + + emit_classcast_check(cd, iptr, BRANCH_GE, REG_ITMP3, s1); + + *(cd->mcodeptr++) = 0x4f; + *(cd->mcodeptr++) = 0x8b; + *(cd->mcodeptr++) = 0x14; + *(cd->mcodeptr++) = 0xd3; + /* movq (ITMP3, ITMP2, 8), ITMP2 */ + + M_LCMP_MEMBASE(REG_SP, -16, REG_ITMP2); + emit_label_beq(cd, BRANCH_LABEL_7); /* good, pop */ + + M_LINC_MEMBASE(REG_SP, -24); + M_JMP_IMM2(looptarget - (cd->mcodeptr - cd->mcodebase) - 2); /* 1 byte displacement */ + + emit_label(cd, BRANCH_LABEL_7); + + emit_label(cd, BRANCH_LABEL_6); + } + else { + assert(super->vftbl->subtype_offset < 0x80); + *(cd->mcodeptr++) = 0x4c; + *(cd->mcodeptr++) = 0x3b; + *(cd->mcodeptr++) = 0x50; + *(cd->mcodeptr++) = super->vftbl->subtype_offset; + /* cmp off(ITMP1), ITMP2 */ + + emit_classcast_check(cd, iptr, BRANCH_NE, REG_ITMP3, s1); + } + + if (s1 == REG_ITMP1) + M_ALD(REG_ITMP1, REG_SP, -8); if (super != NULL) emit_label(cd, BRANCH_LABEL_5); @@ -2650,6 +2678,8 @@ classinfo *super; s4 superindex; + s4 looptarget; + if (INSTRUCTION_IS_UNRESOLVED(iptr)) { super = NULL; superindex = 0; @@ -2658,9 +2688,6 @@ super = iptr->sx.s23.s3.c.cls; superindex = super->index; } - - if ((super == NULL) || !(super->flags & ACC_INTERFACE)) - CODEGEN_CRITICAL_SECTION_NEW; s1 = emit_load_s1(jd, iptr, REG_ITMP1); d = codegen_reg_of_dst(jd, iptr, REG_ITMP2); @@ -2743,18 +2770,67 @@ M_ALD(REG_ITMP1, s1, OFFSET(java_object_t, vftbl)); M_ALD(REG_ITMP2, RIP, disp); - CODEGEN_CRITICAL_SECTION_START; + if (super == NULL || super->vftbl->subtype_depth >= DISPLAY_SIZE) { + M_ALD(REG_ITMP3, REG_ITMP2, OFFSET(vftbl_t, subtype_offset)); - M_ILD(REG_ITMP1, REG_ITMP1, OFFSET(vftbl_t, baseval)); - M_ILD(REG_ITMP3, REG_ITMP2, OFFSET(vftbl_t, diffval)); - M_ILD(REG_ITMP2, REG_ITMP2, OFFSET(vftbl_t, baseval)); + *(cd->mcodeptr++) = 0x4e; + *(cd->mcodeptr++) = 0x3b; + *(cd->mcodeptr++) = 0x14; + *(cd->mcodeptr++) = 0x18; + /* cmp (ITMP1, ITMP3, 1), ITMP2 */ - CODEGEN_CRITICAL_SECTION_END; + emit_label_bne(cd, BRANCH_LABEL_6); + M_LINC(d); + emit_label_br(cd, BRANCH_LABEL_7); /* ende */ - M_ISUB(REG_ITMP2, REG_ITMP1); - M_CLR(d); /* may be REG_ITMP2 */ - M_ICMP(REG_ITMP3, REG_ITMP1); - M_SETULE(d); + emit_label(cd, BRANCH_LABEL_6); + + M_LCMP_IMM(OFFSET(vftbl_t, subtype_display[DISPLAY_SIZE]), REG_ITMP3); + emit_label_bne(cd, BRANCH_LABEL_6); /* ende */ + + /* use the red zone */ + M_AST(REG_ITMP2, REG_SP, -16); + M_AST_IMM32(0, REG_SP, -24); + M_ALD(REG_ITMP3, REG_ITMP1, OFFSET(vftbl_t, subtype_overflow)); + looptarget = cd->mcodeptr - cd->mcodebase; + + M_ALD(REG_ITMP2, REG_SP, -24); + M_ICMP_MEMBASE(REG_ITMP1, OFFSET(vftbl_t, subtype_overflow_length), REG_ITMP2); + emit_label_bge(cd, BRANCH_LABEL_8); /* ende pop */ + + *(cd->mcodeptr++) = 0x4f; + *(cd->mcodeptr++) = 0x8b; + *(cd->mcodeptr++) = 0x14; + *(cd->mcodeptr++) = 0xd3; + /* movq (ITMP3, ITMP2, 8), ITMP2 */ + + M_LCMP_MEMBASE(REG_SP, -16, REG_ITMP2); + emit_label_bne(cd, BRANCH_LABEL_9); + M_LINC(d); + emit_label_br(cd, BRANCH_LABEL_10); /* ende pop */ + emit_label(cd, BRANCH_LABEL_9); + + M_LINC_MEMBASE(REG_SP, -24); + M_JMP_IMM2(looptarget - (cd->mcodeptr - cd->mcodebase) - 2); /* 1 byte displacement */ + + emit_label(cd, BRANCH_LABEL_8); + emit_label(cd, BRANCH_LABEL_10); + + emit_label(cd, BRANCH_LABEL_6); + emit_label(cd, BRANCH_LABEL_7); + } + else { + assert(super->vftbl->subtype_offset < 0x80); + *(cd->mcodeptr++) = 0x4c; + *(cd->mcodeptr++) = 0x3b; + *(cd->mcodeptr++) = 0x50; + *(cd->mcodeptr++) = super->vftbl->subtype_offset; + /* cmp off(ITMP1), ITMP2 */ + + emit_label_bne(cd, BRANCH_LABEL_6); + M_LINC(d); + emit_label(cd, BRANCH_LABEL_6); + } if (super != NULL) emit_label(cd, BRANCH_LABEL_5); diff -r b8487bde49f1 -r f4d2cd262a58 src/vm/jit/x86_64/codegen.h --- a/src/vm/jit/x86_64/codegen.h Mon Jun 09 17:31:43 2008 +0200 +++ b/src/vm/jit/x86_64/codegen.h Mon Jun 09 21:52:41 2008 +0200 @@ -195,6 +195,7 @@ #define M_LMUL_IMM(a,b,c) emit_imul_imm_reg_reg(cd, (b), (a), (c)) #define M_IINC(a) emit_incl_reg(cd, (a)) +#define M_LINC(a) emit_incq_reg(cd, (a)) #define M_IDEC(a) emit_decl_reg(cd, (a)) #define M_ALD(a,b,disp) \ @@ -312,6 +313,7 @@ #define M_JMP(a) emit_jmp_reg(cd, (a)) #define M_JMP_IMM(a) emit_jmp_imm(cd, (a)) +#define M_JMP_IMM2(a) emit_jmp_imm2(cd, (a)) #define M_CALL(a) emit_call_reg(cd, (a)) #define M_CALL_IMM(a) emit_call_imm(cd, (a)) #define M_RET M_BYTE1(0xc3) @@ -361,6 +363,7 @@ #define M_RDTSC emit_rdtsc(cd) #define M_IINC_MEMBASE(a,b) emit_incl_membase(cd, (a), (b)) +#define M_LINC_MEMBASE(a,b) emit_incq_membase(cd, (a), (b)) #define M_IADD_MEMBASE(a,b,c) emit_alul_reg_membase(cd, ALU_ADD, (a), (b), (c)) #define M_IADC_MEMBASE(a,b,c) emit_alul_reg_membase(cd, ALU_ADC, (a), (b), (c)) diff -r b8487bde49f1 -r f4d2cd262a58 src/vm/jit/x86_64/emit.c --- a/src/vm/jit/x86_64/emit.c Mon Jun 09 17:31:43 2008 +0200 +++ b/src/vm/jit/x86_64/emit.c Mon Jun 09 21:52:41 2008 +0200 @@ -361,8 +361,14 @@ case BRANCH_LE: M_BGT(8); break; + case BRANCH_GE: + M_BLT(8); + break; case BRANCH_EQ: M_BNE(8); + break; + case BRANCH_NE: + M_BEQ(8); break; case BRANCH_UGT: M_BULE(8); @@ -1438,10 +1444,29 @@ } +void emit_incl_reg(codegendata *cd, s8 reg) +{ + *(cd->mcodeptr++) = 0xff; + emit_reg(0,(reg)); +} + +void emit_incq_reg(codegendata *cd, s8 reg) +{ + emit_rex(1,0,0,(reg)); + *(cd->mcodeptr++) = 0xff; + emit_reg(0,(reg)); +} void emit_incl_membase(codegendata *cd, s8 basereg, s8 disp) { emit_rex(0,0,0,(basereg)); + *(cd->mcodeptr++) = 0xff; + emit_membase(cd, (basereg),(disp),0); +} + +void emit_incq_membase(codegendata *cd, s8 basereg, s8 disp) +{ + emit_rex(1,0,0,(basereg)); *(cd->mcodeptr++) = 0xff; emit_membase(cd, (basereg),(disp),0); } @@ -1678,6 +1703,18 @@ emit_imm32((imm)); } +/* like emit_jmp_imm but allows 8 bit optimization */ +void emit_jmp_imm2(codegendata *cd, s8 imm) { + if (IS_IMM8(imm)) { + *(cd->mcodeptr++) = 0xeb; + emit_imm8((imm)); + } + else { + *(cd->mcodeptr++) = 0xe9; + emit_imm32((imm)); + } +} + void emit_jmp_reg(codegendata *cd, s8 reg) { emit_rex(0,0,0,(reg)); diff -r b8487bde49f1 -r f4d2cd262a58 src/vm/jit/x86_64/emit.h --- a/src/vm/jit/x86_64/emit.h Mon Jun 09 17:31:43 2008 +0200 +++ b/src/vm/jit/x86_64/emit.h Mon Jun 09 21:52:41 2008 +0200 @@ -251,7 +251,10 @@ void emit_lea_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg); void emit_leal_membase_reg(codegendata *cd, s8 basereg, s8 disp, s8 reg); +void emit_incl_reg(codegendata *cd, s8 reg); +void emit_incq_reg(codegendata *cd, s8 reg); void emit_incl_membase(codegendata *cd, s8 basereg, s8 disp); +void emit_incq_membase(codegendata *cd, s8 basereg, s8 disp); void emit_cltd(codegendata *cd); void emit_cqto(codegendata *cd); diff -r b8487bde49f1 -r f4d2cd262a58 src/vmcore/class.c --- a/src/vmcore/class.c Mon Jun 09 17:31:43 2008 +0200 +++ b/src/vmcore/class.c Mon Jun 09 21:52:41 2008 +0200 @@ -1591,12 +1591,7 @@ if (sub->flags & ACC_INTERFACE) return (super == class_java_lang_Object); - LOCK_MONITOR_ENTER(linker_classrenumber_lock); - - diffval = sub->vftbl->baseval - super->vftbl->baseval; - result = diffval <= (uint32_t) super->vftbl->diffval; - - LOCK_MONITOR_EXIT(linker_classrenumber_lock); + result = fast_subtype_check(sub->vftbl, super->vftbl); } return result; diff -r b8487bde49f1 -r f4d2cd262a58 src/vmcore/linker.c --- a/src/vmcore/linker.c Mon Jun 09 17:31:43 2008 +0200 +++ b/src/vmcore/linker.c Mon Jun 09 21:52:41 2008 +0200 @@ -91,8 +91,6 @@ static s4 interfaceindex; /* sequential numbering of interfaces */ static s4 classvalue; - -java_object_t *linker_classrenumber_lock; /* private functions **********************************************************/ @@ -164,14 +162,6 @@ /* Reset interface index. */ interfaceindex = 0; - -#if defined(ENABLE_THREADS) - /* create the global lock object */ - - linker_classrenumber_lock = NEW(java_object_t); - - LOCK_INIT_OBJECT_LOCK(linker_classrenumber_lock); -#endif /* Link the most basic classes. */ @@ -556,6 +546,70 @@ methods and interface methods. *******************************************************************************/ + +static int build_display_inner(classinfo *topc, classinfo *c, int i) +{ + int depth; + if (!c) + return 0; + do { + if (c->vftbl->arraydesc) + { + arraydescriptor *a = c->vftbl->arraydesc; + if (a->elementvftbl && a->elementvftbl->clazz->super) + { + classinfo *cls = a->elementvftbl->clazz->super; + int n; + for (n=0; ndimension; n++) + cls = class_array_of(cls, true); + depth = build_display_inner(topc, cls, i+1); + break; + } + if (a->componentvftbl && a->elementvftbl) + { + depth = build_display_inner(topc, a->componentvftbl->clazz, i+1); + break; + } + } + depth = build_display_inner(topc, c->super, i+1); + } while (false); + if (depth >= DISPLAY_SIZE) + { + if (depth == DISPLAY_SIZE) + { + topc->vftbl->subtype_overflow_length = i+1; + topc->vftbl->subtype_overflow = malloc(sizeof(void*) * (i+1)); +#if defined(ENABLE_STATISTICS) + if (opt_stat) + count_vftbl_len += sizeof(void*) * (i+1); +#endif + } + topc->vftbl->subtype_overflow[depth - DISPLAY_SIZE] = c->vftbl; + return depth + 1; + } + topc->vftbl->subtype_display[depth] = c->vftbl; + return depth + 1; +} + +static void build_display(classinfo *c) +{ + int depth; + int i; + + depth = build_display_inner(c, c, 0) - 1; + c->vftbl->subtype_depth = depth; + if (depth >= DISPLAY_SIZE) + { + c->vftbl->subtype_offset = OFFSET(vftbl_t, subtype_display[DISPLAY_SIZE]); + } + else + { + c->vftbl->subtype_offset = OFFSET(vftbl_t, subtype_display[0]) + sizeof(void*) * depth; + for (i=depth+1; i<=DISPLAY_SIZE; i++) + c->vftbl->subtype_display[i] = NULL; + c->vftbl->subtype_overflow_length = 0; + } +} static classinfo *link_class_intern(classinfo *c) { @@ -973,7 +1027,10 @@ linker_compute_subclasses(c); + /* FIXME: this is completely useless now */ RT_TIMING_GET_TIME(time_subclasses); + + build_display(c); /* revert the linking state and class is linked */ @@ -1174,8 +1231,6 @@ static void linker_compute_subclasses(classinfo *c) { - LOCK_MONITOR_ENTER(linker_classrenumber_lock); - #if 0 && defined(ENABLE_THREADS) && !defined(DISABLE_GC) threads_stopworld(); #endif @@ -1183,6 +1238,7 @@ if (!(c->flags & ACC_INTERFACE)) { c->nextsub = NULL; c->sub = NULL; + c->vftbl->baseval = 1; /* so it does not look like an interface */ } if (!(c->flags & ACC_INTERFACE) && (c->super != NULL)) { @@ -1191,12 +1247,6 @@ } classvalue = 0; - - /* compute class values */ - - linker_compute_class_values(class_java_lang_Object); - - LOCK_MONITOR_EXIT(linker_classrenumber_lock); #if 0 && defined(ENABLE_THREADS) && !defined(DISABLE_GC) threads_startworld(); diff -r b8487bde49f1 -r f4d2cd262a58 src/vmcore/linker.h --- a/src/vmcore/linker.h Mon Jun 09 17:31:43 2008 +0200 +++ b/src/vmcore/linker.h Mon Jun 09 21:52:41 2008 +0200 @@ -100,6 +100,8 @@ *******************************************************************************/ +#define DISPLAY_SIZE 4 + struct _vftbl { methodptr *interfacetable[1]; /* interface table (access via macro) */ classinfo *clazz; /* class, the vtbl belongs to */ @@ -109,6 +111,13 @@ s4 baseval; /* base for runtime type check */ /* (-index for interfaces) */ s4 diffval; /* high - base for runtime type check */ + + s4 subtype_depth; + ptrint subtype_offset; + struct _vftbl *subtype_display[DISPLAY_SIZE+1]; /* the last one is cache */ + s4 subtype_overflow_length; + struct _vftbl **subtype_overflow; + s4 *interfacevftbllength; /* length of interface vftbls */ methodptr table[1]; /* class vftbl */ }; @@ -133,14 +142,6 @@ }; -/* global variables ***********************************************************/ - -/* This lock must be taken while renumbering classes or while atomically */ -/* accessing classes. */ - -extern java_object_t *linker_classrenumber_lock; - - /* function prototypes ********************************************************/ void linker_preinit(void);