8148047: Move the vtable length field to Klass

Reviewed-by: cjplummer, twisti, coleenp, kbarrett
This commit is contained in:
Mikael Gerdin 2015-12-01 10:35:49 +01:00
parent 97e169ac77
commit 211dc93a85
32 changed files with 78 additions and 80 deletions

View file

@ -898,13 +898,13 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
"caller must use same register for non-constant itable index as for method"); "caller must use same register for non-constant itable index as for method");
// Compute start of first itableOffsetEntry (which is at the end of the vtable) // Compute start of first itableOffsetEntry (which is at the end of the vtable)
int vtable_base = in_bytes(InstanceKlass::vtable_start_offset()); int vtable_base = in_bytes(Klass::vtable_start_offset());
int itentry_off = itableMethodEntry::method_offset_in_bytes(); int itentry_off = itableMethodEntry::method_offset_in_bytes();
int scan_step = itableOffsetEntry::size() * wordSize; int scan_step = itableOffsetEntry::size() * wordSize;
int vte_size = vtableEntry::size_in_bytes(); int vte_size = vtableEntry::size_in_bytes();
assert(vte_size == wordSize, "else adjust times_vte_scale"); assert(vte_size == wordSize, "else adjust times_vte_scale");
ldrw(scan_temp, Address(recv_klass, InstanceKlass::vtable_length_offset())); ldrw(scan_temp, Address(recv_klass, Klass::vtable_length_offset()));
// %%% Could store the aligned, prescaled offset in the klassoop. // %%% Could store the aligned, prescaled offset in the klassoop.
// lea(scan_temp, Address(recv_klass, scan_temp, times_vte_scale, vtable_base)); // lea(scan_temp, Address(recv_klass, scan_temp, times_vte_scale, vtable_base));
@ -958,7 +958,7 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
void MacroAssembler::lookup_virtual_method(Register recv_klass, void MacroAssembler::lookup_virtual_method(Register recv_klass,
RegisterOrConstant vtable_index, RegisterOrConstant vtable_index,
Register method_result) { Register method_result) {
const int base = in_bytes(InstanceKlass::vtable_start_offset()); const int base = in_bytes(Klass::vtable_start_offset());
assert(vtableEntry::size() * wordSize == 8, assert(vtableEntry::size() * wordSize == 8,
"adjust the scaling in the code below"); "adjust the scaling in the code below");
int vtable_offset_in_bytes = base + vtableEntry::method_offset_in_bytes(); int vtable_offset_in_bytes = base + vtableEntry::method_offset_in_bytes();

View file

@ -73,7 +73,7 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
if (DebugVtables) { if (DebugVtables) {
Label L; Label L;
// check offset vs vtable length // check offset vs vtable length
__ ldrw(rscratch1, Address(r19, InstanceKlass::vtable_length_offset())); __ ldrw(rscratch1, Address(r19, Klass::vtable_length_offset()));
__ cmpw(rscratch1, vtable_index * vtableEntry::size()); __ cmpw(rscratch1, vtable_index * vtableEntry::size());
__ br(Assembler::GT, L); __ br(Assembler::GT, L);
__ enter(); __ enter();

View file

@ -1583,13 +1583,13 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
"caller must use same register for non-constant itable index as for method"); "caller must use same register for non-constant itable index as for method");
// Compute start of first itableOffsetEntry (which is at the end of the vtable). // Compute start of first itableOffsetEntry (which is at the end of the vtable).
int vtable_base = in_bytes(InstanceKlass::vtable_start_offset()); int vtable_base = in_bytes(Klass::vtable_start_offset());
int itentry_off = itableMethodEntry::method_offset_in_bytes(); int itentry_off = itableMethodEntry::method_offset_in_bytes();
int logMEsize = exact_log2(itableMethodEntry::size() * wordSize); int logMEsize = exact_log2(itableMethodEntry::size() * wordSize);
int scan_step = itableOffsetEntry::size() * wordSize; int scan_step = itableOffsetEntry::size() * wordSize;
int log_vte_size= exact_log2(vtableEntry::size_in_bytes()); int log_vte_size= exact_log2(vtableEntry::size_in_bytes());
lwz(scan_temp, in_bytes(InstanceKlass::vtable_length_offset()), recv_klass); lwz(scan_temp, in_bytes(Klass::vtable_length_offset()), recv_klass);
// %%% We should store the aligned, prescaled offset in the klassoop. // %%% We should store the aligned, prescaled offset in the klassoop.
// Then the next several instructions would fold away. // Then the next several instructions would fold away.
@ -1657,7 +1657,7 @@ void MacroAssembler::lookup_virtual_method(Register recv_klass,
assert_different_registers(recv_klass, method_result, vtable_index.register_or_noreg()); assert_different_registers(recv_klass, method_result, vtable_index.register_or_noreg());
const int base = in_bytes(InstanceKlass::vtable_start_offset()); const int base = in_bytes(Klass::vtable_start_offset());
assert(vtableEntry::size() * wordSize == wordSize, "adjust the scaling in the code below"); assert(vtableEntry::size() * wordSize == wordSize, "adjust the scaling in the code below");
if (vtable_index.is_register()) { if (vtable_index.is_register()) {

View file

@ -3562,7 +3562,7 @@ encode %{
__ load_klass(R11_scratch1, R3); __ load_klass(R11_scratch1, R3);
int entry_offset = in_bytes(InstanceKlass::vtable_start_offset()) + _vtable_index * vtableEntry::size_in_bytes(); int entry_offset = in_bytes(Klass::vtable_start_offset()) + _vtable_index * vtableEntry::size_in_bytes();
int v_off = entry_offset + vtableEntry::method_offset_in_bytes(); int v_off = entry_offset + vtableEntry::method_offset_in_bytes();
__ li(R19_method, v_off); __ li(R19_method, v_off);
__ ldx(R19_method/*method oop*/, R19_method/*method offset*/, R11_scratch1/*class*/); __ ldx(R19_method/*method oop*/, R19_method/*method offset*/, R11_scratch1/*class*/);

View file

@ -3282,7 +3282,7 @@ void TemplateTable::generate_vtable_call(Register Rrecv_klass, Register Rindex,
const Register Rtarget_method = Rindex; const Register Rtarget_method = Rindex;
// Get target method & entry point. // Get target method & entry point.
const int base = in_bytes(InstanceKlass::vtable_start_offset()); const int base = in_bytes(Klass::vtable_start_offset());
// Calc vtable addr scale the vtable index by 8. // Calc vtable addr scale the vtable index by 8.
__ sldi(Rindex, Rindex, exact_log2(vtableEntry::size_in_bytes())); __ sldi(Rindex, Rindex, exact_log2(vtableEntry::size_in_bytes()));
// Load target. // Load target.

View file

@ -80,14 +80,14 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
__ load_klass(rcvr_klass, R3); __ load_klass(rcvr_klass, R3);
// Set method (in case of interpreted method), and destination address. // Set method (in case of interpreted method), and destination address.
int entry_offset = in_bytes(InstanceKlass::vtable_start_offset()) + vtable_index*vtableEntry::size_in_bytes(); int entry_offset = in_bytes(Klass::vtable_start_offset()) + vtable_index*vtableEntry::size_in_bytes();
#ifndef PRODUCT #ifndef PRODUCT
if (DebugVtables) { if (DebugVtables) {
Label L; Label L;
// Check offset vs vtable length. // Check offset vs vtable length.
const Register vtable_len = R12_scratch2; const Register vtable_len = R12_scratch2;
__ lwz(vtable_len, in_bytes(InstanceKlass::vtable_length_offset()), rcvr_klass); __ lwz(vtable_len, in_bytes(Klass::vtable_length_offset()), rcvr_klass);
__ cmpwi(CCR0, vtable_len, vtable_index*vtableEntry::size()); __ cmpwi(CCR0, vtable_len, vtable_index*vtableEntry::size());
__ bge(CCR0, L); __ bge(CCR0, L);
__ li(R12_scratch2, vtable_index); __ li(R12_scratch2, vtable_index);
@ -163,13 +163,13 @@ VtableStub* VtableStubs::create_itable_stub(int vtable_index) {
__ load_klass(rcvr_klass, R3_ARG1); __ load_klass(rcvr_klass, R3_ARG1);
BLOCK_COMMENT("Load start of itable entries into itable_entry."); BLOCK_COMMENT("Load start of itable entries into itable_entry.");
__ lwz(vtable_len, in_bytes(InstanceKlass::vtable_length_offset()), rcvr_klass); __ lwz(vtable_len, in_bytes(Klass::vtable_length_offset()), rcvr_klass);
__ slwi(vtable_len, vtable_len, exact_log2(vtableEntry::size_in_bytes())); __ slwi(vtable_len, vtable_len, exact_log2(vtableEntry::size_in_bytes()));
__ add(itable_entry_addr, vtable_len, rcvr_klass); __ add(itable_entry_addr, vtable_len, rcvr_klass);
// Loop over all itable entries until desired interfaceOop(Rinterface) found. // Loop over all itable entries until desired interfaceOop(Rinterface) found.
BLOCK_COMMENT("Increment itable_entry_addr in loop."); BLOCK_COMMENT("Increment itable_entry_addr in loop.");
const int vtable_base_offset = in_bytes(InstanceKlass::vtable_start_offset()); const int vtable_base_offset = in_bytes(Klass::vtable_start_offset());
__ addi(itable_entry_addr, itable_entry_addr, vtable_base_offset + itableOffsetEntry::interface_offset_in_bytes()); __ addi(itable_entry_addr, itable_entry_addr, vtable_base_offset + itableOffsetEntry::interface_offset_in_bytes());
const int itable_offset_search_inc = itableOffsetEntry::size() * wordSize; const int itable_offset_search_inc = itableOffsetEntry::size() * wordSize;

View file

@ -2188,11 +2188,11 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
} }
// Compute start of first itableOffsetEntry (which is at the end of the vtable) // Compute start of first itableOffsetEntry (which is at the end of the vtable)
int vtable_base = in_bytes(InstanceKlass::vtable_start_offset()); int vtable_base = in_bytes(Klass::vtable_start_offset());
int scan_step = itableOffsetEntry::size() * wordSize; int scan_step = itableOffsetEntry::size() * wordSize;
int vte_size = vtableEntry::size_in_bytes(); int vte_size = vtableEntry::size_in_bytes();
lduw(recv_klass, in_bytes(InstanceKlass::vtable_length_offset()), scan_temp); lduw(recv_klass, in_bytes(Klass::vtable_length_offset()), scan_temp);
// %%% We should store the aligned, prescaled offset in the klassoop. // %%% We should store the aligned, prescaled offset in the klassoop.
// Then the next several instructions would fold away. // Then the next several instructions would fold away.
@ -2268,7 +2268,7 @@ void MacroAssembler::lookup_virtual_method(Register recv_klass,
Register method_result) { Register method_result) {
assert_different_registers(recv_klass, method_result, vtable_index.register_or_noreg()); assert_different_registers(recv_klass, method_result, vtable_index.register_or_noreg());
Register sethi_temp = method_result; Register sethi_temp = method_result;
const int base = in_bytes(InstanceKlass::vtable_start_offset()) + const int base = in_bytes(Klass::vtable_start_offset()) +
// method pointer offset within the vtable entry: // method pointer offset within the vtable entry:
vtableEntry::method_offset_in_bytes(); vtableEntry::method_offset_in_bytes();
RegisterOrConstant vtable_offset = vtable_index; RegisterOrConstant vtable_offset = vtable_index;

View file

@ -601,7 +601,7 @@ int MachCallDynamicJavaNode::ret_addr_offset() {
NativeCall::instruction_size); // sethi; setlo; call; delay slot NativeCall::instruction_size); // sethi; setlo; call; delay slot
} else { } else {
assert(!UseInlineCaches, "expect vtable calls only if not using ICs"); assert(!UseInlineCaches, "expect vtable calls only if not using ICs");
int entry_offset = in_bytes(InstanceKlass::vtable_start_offset()) + vtable_index*vtableEntry::size_in_bytes(); int entry_offset = in_bytes(Klass::vtable_start_offset()) + vtable_index*vtableEntry::size_in_bytes();
int v_off = entry_offset + vtableEntry::method_offset_in_bytes(); int v_off = entry_offset + vtableEntry::method_offset_in_bytes();
int klass_load_size; int klass_load_size;
if (UseCompressedClassPointers) { if (UseCompressedClassPointers) {
@ -2658,7 +2658,7 @@ encode %{
} else { } else {
klass_load_size = 1*BytesPerInstWord; klass_load_size = 1*BytesPerInstWord;
} }
int entry_offset = in_bytes(InstanceKlass::vtable_start_offset()) + vtable_index*vtableEntry::size_in_bytes(); int entry_offset = in_bytes(Klass::vtable_start_offset()) + vtable_index*vtableEntry::size_in_bytes();
int v_off = entry_offset + vtableEntry::method_offset_in_bytes(); int v_off = entry_offset + vtableEntry::method_offset_in_bytes();
if (Assembler::is_simm13(v_off)) { if (Assembler::is_simm13(v_off)) {
__ ld_ptr(G3, v_off, G5_method); __ ld_ptr(G3, v_off, G5_method);

View file

@ -3153,11 +3153,11 @@ void TemplateTable::invokeinterface(int byte_no) {
// //
// compute start of first itableOffsetEntry (which is at end of vtable) // compute start of first itableOffsetEntry (which is at end of vtable)
const int base = in_bytes(InstanceKlass::vtable_start_offset()); const int base = in_bytes(Klass::vtable_start_offset());
Label search; Label search;
Register Rtemp = O1_flags; Register Rtemp = O1_flags;
__ ld(O2_Klass, in_bytes(InstanceKlass::vtable_length_offset()), Rtemp); __ ld(O2_Klass, in_bytes(Klass::vtable_length_offset()), Rtemp);
__ sll(Rtemp, LogBytesPerWord, Rtemp); // Rscratch *= 4; __ sll(Rtemp, LogBytesPerWord, Rtemp); // Rscratch *= 4;
if (Assembler::is_simm13(base)) { if (Assembler::is_simm13(base)) {
__ add(Rtemp, base, Rtemp); __ add(Rtemp, base, Rtemp);

View file

@ -78,7 +78,7 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
if (DebugVtables) { if (DebugVtables) {
Label L; Label L;
// check offset vs vtable length // check offset vs vtable length
__ ld(G3_scratch, in_bytes(InstanceKlass::vtable_length_offset()), G5); __ ld(G3_scratch, in_bytes(Klass::vtable_length_offset()), G5);
__ cmp_and_br_short(G5, vtable_index*vtableEntry::size(), Assembler::greaterUnsigned, Assembler::pt, L); __ cmp_and_br_short(G5, vtable_index*vtableEntry::size(), Assembler::greaterUnsigned, Assembler::pt, L);
__ set(vtable_index, O2); __ set(vtable_index, O2);
__ call_VM(noreg, CAST_FROM_FN_PTR(address, bad_compiled_vtable_index), O0, O2); __ call_VM(noreg, CAST_FROM_FN_PTR(address, bad_compiled_vtable_index), O0, O2);

View file

@ -5807,14 +5807,14 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
"caller must use same register for non-constant itable index as for method"); "caller must use same register for non-constant itable index as for method");
// Compute start of first itableOffsetEntry (which is at the end of the vtable) // Compute start of first itableOffsetEntry (which is at the end of the vtable)
int vtable_base = in_bytes(InstanceKlass::vtable_start_offset()); int vtable_base = in_bytes(Klass::vtable_start_offset());
int itentry_off = itableMethodEntry::method_offset_in_bytes(); int itentry_off = itableMethodEntry::method_offset_in_bytes();
int scan_step = itableOffsetEntry::size() * wordSize; int scan_step = itableOffsetEntry::size() * wordSize;
int vte_size = vtableEntry::size_in_bytes(); int vte_size = vtableEntry::size_in_bytes();
Address::ScaleFactor times_vte_scale = Address::times_ptr; Address::ScaleFactor times_vte_scale = Address::times_ptr;
assert(vte_size == wordSize, "else adjust times_vte_scale"); assert(vte_size == wordSize, "else adjust times_vte_scale");
movl(scan_temp, Address(recv_klass, InstanceKlass::vtable_length_offset())); movl(scan_temp, Address(recv_klass, Klass::vtable_length_offset()));
// %%% Could store the aligned, prescaled offset in the klassoop. // %%% Could store the aligned, prescaled offset in the klassoop.
lea(scan_temp, Address(recv_klass, scan_temp, times_vte_scale, vtable_base)); lea(scan_temp, Address(recv_klass, scan_temp, times_vte_scale, vtable_base));
@ -5865,7 +5865,7 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
void MacroAssembler::lookup_virtual_method(Register recv_klass, void MacroAssembler::lookup_virtual_method(Register recv_klass,
RegisterOrConstant vtable_index, RegisterOrConstant vtable_index,
Register method_result) { Register method_result) {
const int base = in_bytes(InstanceKlass::vtable_start_offset()); const int base = in_bytes(Klass::vtable_start_offset());
assert(vtableEntry::size() * wordSize == wordSize, "else adjust the scaling in the code below"); assert(vtableEntry::size() * wordSize == wordSize, "else adjust the scaling in the code below");
Address vtable_entry_addr(recv_klass, Address vtable_entry_addr(recv_klass,
vtable_index, Address::times_ptr, vtable_index, Address::times_ptr,

View file

@ -85,7 +85,7 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
if (DebugVtables) { if (DebugVtables) {
Label L; Label L;
// check offset vs vtable length // check offset vs vtable length
__ cmpl(Address(rax, InstanceKlass::vtable_length_offset()), vtable_index*vtableEntry::size()); __ cmpl(Address(rax, Klass::vtable_length_offset()), vtable_index*vtableEntry::size());
__ jcc(Assembler::greater, L); __ jcc(Assembler::greater, L);
__ movl(rbx, vtable_index); __ movl(rbx, vtable_index);
__ call_VM(noreg, CAST_FROM_FN_PTR(address, bad_compiled_vtable_index), rcx, rbx); __ call_VM(noreg, CAST_FROM_FN_PTR(address, bad_compiled_vtable_index), rcx, rbx);

View file

@ -77,7 +77,7 @@ VtableStub* VtableStubs::create_vtable_stub(int vtable_index) {
if (DebugVtables) { if (DebugVtables) {
Label L; Label L;
// check offset vs vtable length // check offset vs vtable length
__ cmpl(Address(rax, InstanceKlass::vtable_length_offset()), __ cmpl(Address(rax, Klass::vtable_length_offset()),
vtable_index * vtableEntry::size()); vtable_index * vtableEntry::size());
__ jcc(Assembler::greater, L); __ jcc(Assembler::greater, L);
__ movl(rbx, vtable_index); __ movl(rbx, vtable_index);

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -48,7 +48,6 @@ public class ArrayKlass extends Klass {
dimension = new CIntField(type.getCIntegerField("_dimension"), 0); dimension = new CIntField(type.getCIntegerField("_dimension"), 0);
higherDimension = new MetadataField(type.getAddressField("_higher_dimension"), 0); higherDimension = new MetadataField(type.getAddressField("_higher_dimension"), 0);
lowerDimension = new MetadataField(type.getAddressField("_lower_dimension"), 0); lowerDimension = new MetadataField(type.getAddressField("_lower_dimension"), 0);
vtableLen = new CIntField(type.getCIntegerField("_vtable_len"), 0);
javaLangCloneableName = null; javaLangCloneableName = null;
javaLangObjectName = null; javaLangObjectName = null;
javaIoSerializableName = null; javaIoSerializableName = null;
@ -61,7 +60,6 @@ public class ArrayKlass extends Klass {
private static CIntField dimension; private static CIntField dimension;
private static MetadataField higherDimension; private static MetadataField higherDimension;
private static MetadataField lowerDimension; private static MetadataField lowerDimension;
private static CIntField vtableLen;
public Klass getJavaSuper() { public Klass getJavaSuper() {
SystemDictionary sysDict = VM.getVM().getSystemDictionary(); SystemDictionary sysDict = VM.getVM().getSystemDictionary();
@ -71,7 +69,6 @@ public class ArrayKlass extends Klass {
public long getDimension() { return dimension.getValue(this); } public long getDimension() { return dimension.getValue(this); }
public Klass getHigherDimension() { return (Klass) higherDimension.getValue(this); } public Klass getHigherDimension() { return (Klass) higherDimension.getValue(this); }
public Klass getLowerDimension() { return (Klass) lowerDimension.getValue(this); } public Klass getLowerDimension() { return (Klass) lowerDimension.getValue(this); }
public long getVtableLen() { return vtableLen.getValue(this); }
// constant class names - javaLangCloneable, javaIoSerializable, javaLangObject // constant class names - javaLangCloneable, javaIoSerializable, javaLangObject
// Initialized lazily to avoid initialization ordering dependencies between ArrayKlass and SymbolTable // Initialized lazily to avoid initialization ordering dependencies between ArrayKlass and SymbolTable
@ -140,6 +137,5 @@ public class ArrayKlass extends Klass {
visitor.doCInt(dimension, true); visitor.doCInt(dimension, true);
visitor.doMetadata(higherDimension, true); visitor.doMetadata(higherDimension, true);
visitor.doMetadata(lowerDimension, true); visitor.doMetadata(lowerDimension, true);
visitor.doCInt(vtableLen, true);
} }
} }

View file

@ -84,7 +84,6 @@ public class InstanceKlass extends Klass {
nonstaticOopMapSize = new CIntField(type.getCIntegerField("_nonstatic_oop_map_size"), 0); nonstaticOopMapSize = new CIntField(type.getCIntegerField("_nonstatic_oop_map_size"), 0);
isMarkedDependent = new CIntField(type.getCIntegerField("_is_marked_dependent"), 0); isMarkedDependent = new CIntField(type.getCIntegerField("_is_marked_dependent"), 0);
initState = new CIntField(type.getCIntegerField("_init_state"), 0); initState = new CIntField(type.getCIntegerField("_init_state"), 0);
vtableLen = new CIntField(type.getCIntegerField("_vtable_len"), 0);
itableLen = new CIntField(type.getCIntegerField("_itable_len"), 0); itableLen = new CIntField(type.getCIntegerField("_itable_len"), 0);
breakpoints = type.getAddressField("_breakpoints"); breakpoints = type.getAddressField("_breakpoints");
genericSignatureIndex = new CIntField(type.getCIntegerField("_generic_signature_index"), 0); genericSignatureIndex = new CIntField(type.getCIntegerField("_generic_signature_index"), 0);
@ -143,7 +142,6 @@ public class InstanceKlass extends Klass {
private static CIntField nonstaticOopMapSize; private static CIntField nonstaticOopMapSize;
private static CIntField isMarkedDependent; private static CIntField isMarkedDependent;
private static CIntField initState; private static CIntField initState;
private static CIntField vtableLen;
private static CIntField itableLen; private static CIntField itableLen;
private static AddressField breakpoints; private static AddressField breakpoints;
private static CIntField genericSignatureIndex; private static CIntField genericSignatureIndex;
@ -351,7 +349,6 @@ public class InstanceKlass extends Klass {
public long getStaticOopFieldCount() { return staticOopFieldCount.getValue(this); } public long getStaticOopFieldCount() { return staticOopFieldCount.getValue(this); }
public long getNonstaticOopMapSize() { return nonstaticOopMapSize.getValue(this); } public long getNonstaticOopMapSize() { return nonstaticOopMapSize.getValue(this); }
public boolean getIsMarkedDependent() { return isMarkedDependent.getValue(this) != 0; } public boolean getIsMarkedDependent() { return isMarkedDependent.getValue(this) != 0; }
public long getVtableLen() { return vtableLen.getValue(this); }
public long getItableLen() { return itableLen.getValue(this); } public long getItableLen() { return itableLen.getValue(this); }
public long majorVersion() { return majorVersion.getValue(this); } public long majorVersion() { return majorVersion.getValue(this); }
public long minorVersion() { return minorVersion.getValue(this); } public long minorVersion() { return minorVersion.getValue(this); }
@ -547,7 +544,6 @@ public class InstanceKlass extends Klass {
visitor.doCInt(nonstaticOopMapSize, true); visitor.doCInt(nonstaticOopMapSize, true);
visitor.doCInt(isMarkedDependent, true); visitor.doCInt(isMarkedDependent, true);
visitor.doCInt(initState, true); visitor.doCInt(initState, true);
visitor.doCInt(vtableLen, true);
visitor.doCInt(itableLen, true); visitor.doCInt(itableLen, true);
} }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2000, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -61,6 +61,7 @@ public class Klass extends Metadata implements ClassConstants {
} }
subklass = new MetadataField(type.getAddressField("_subklass"), 0); subklass = new MetadataField(type.getAddressField("_subklass"), 0);
nextSibling = new MetadataField(type.getAddressField("_next_sibling"), 0); nextSibling = new MetadataField(type.getAddressField("_next_sibling"), 0);
vtableLen = new CIntField(type.getCIntegerField("_vtable_len"), 0);
LH_INSTANCE_SLOW_PATH_BIT = db.lookupIntConstant("Klass::_lh_instance_slow_path_bit").intValue(); LH_INSTANCE_SLOW_PATH_BIT = db.lookupIntConstant("Klass::_lh_instance_slow_path_bit").intValue();
LH_LOG2_ELEMENT_SIZE_SHIFT = db.lookupIntConstant("Klass::_lh_log2_element_size_shift").intValue(); LH_LOG2_ELEMENT_SIZE_SHIFT = db.lookupIntConstant("Klass::_lh_log2_element_size_shift").intValue();
@ -71,6 +72,7 @@ public class Klass extends Metadata implements ClassConstants {
LH_ARRAY_TAG_OBJ_VALUE = db.lookupIntConstant("Klass::_lh_array_tag_obj_value").intValue(); LH_ARRAY_TAG_OBJ_VALUE = db.lookupIntConstant("Klass::_lh_array_tag_obj_value").intValue();
} }
public Klass(Address addr) { public Klass(Address addr) {
super(addr); super(addr);
} }
@ -91,6 +93,7 @@ public class Klass extends Metadata implements ClassConstants {
private static MetadataField subklass; private static MetadataField subklass;
private static MetadataField nextSibling; private static MetadataField nextSibling;
private static sun.jvm.hotspot.types.Field traceIDField; private static sun.jvm.hotspot.types.Field traceIDField;
private static CIntField vtableLen;
private Address getValue(AddressField field) { private Address getValue(AddressField field) {
return addr.getAddressAt(field.getOffset()); return addr.getAddressAt(field.getOffset());
@ -111,6 +114,7 @@ public class Klass extends Metadata implements ClassConstants {
public AccessFlags getAccessFlagsObj(){ return new AccessFlags(getAccessFlags()); } public AccessFlags getAccessFlagsObj(){ return new AccessFlags(getAccessFlags()); }
public Klass getSubklassKlass() { return (Klass) subklass.getValue(this); } public Klass getSubklassKlass() { return (Klass) subklass.getValue(this); }
public Klass getNextSiblingKlass() { return (Klass) nextSibling.getValue(this); } public Klass getNextSiblingKlass() { return (Klass) nextSibling.getValue(this); }
public long getVtableLen() { return vtableLen.getValue(this); }
public long traceID() { public long traceID() {
if (traceIDField == null) return 0; if (traceIDField == null) return 0;
@ -179,6 +183,7 @@ public class Klass extends Metadata implements ClassConstants {
visitor.doCInt(accessFlags, true); visitor.doCInt(accessFlags, true);
visitor.doMetadata(subklass, true); visitor.doMetadata(subklass, true);
visitor.doMetadata(nextSibling, true); visitor.doMetadata(nextSibling, true);
visitor.doCInt(vtableLen, true);
} }
public long getObjectSize() { public long getObjectSize() {

View file

@ -597,7 +597,7 @@ final class HotSpotResolvedJavaMethodImpl extends HotSpotMethod implements HotSp
} }
HotSpotVMConfig config = config(); HotSpotVMConfig config = config();
final int vtableIndex = getVtableIndex((HotSpotResolvedObjectTypeImpl) resolved); final int vtableIndex = getVtableIndex((HotSpotResolvedObjectTypeImpl) resolved);
return config.instanceKlassVtableStartOffset + vtableIndex * config.vtableEntrySize + config.vtableEntryMethodOffset; return config.klassVtableStartOffset + vtableIndex * config.vtableEntrySize + config.vtableEntryMethodOffset;
} }
@Override @Override

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -482,8 +482,8 @@ final class HotSpotResolvedObjectTypeImpl extends HotSpotResolvedJavaType implem
/* Everything has the core vtable of java.lang.Object */ /* Everything has the core vtable of java.lang.Object */
return config.baseVtableLength(); return config.baseVtableLength();
} }
int result = UNSAFE.getInt(getMetaspaceKlass() + config.instanceKlassVtableLengthOffset) / (config.vtableEntrySize / config.heapWordSize); int result = UNSAFE.getInt(getMetaspaceKlass() + config.klassVtableLengthOffset) / (config.vtableEntrySize / config.heapWordSize);
assert result >= config.baseVtableLength() : UNSAFE.getInt(getMetaspaceKlass() + config.instanceKlassVtableLengthOffset) + " " + config.vtableEntrySize; assert result >= config.baseVtableLength() : UNSAFE.getInt(getMetaspaceKlass() + config.klassVtableLengthOffset) + " " + config.vtableEntrySize;
return result; return result;
} }

View file

@ -1030,8 +1030,8 @@ public class HotSpotVMConfig {
@HotSpotVMField(name = "InstanceKlass::_init_state", type = "u1", get = HotSpotVMField.Type.OFFSET) @Stable public int instanceKlassInitStateOffset; @HotSpotVMField(name = "InstanceKlass::_init_state", type = "u1", get = HotSpotVMField.Type.OFFSET) @Stable public int instanceKlassInitStateOffset;
@HotSpotVMField(name = "InstanceKlass::_constants", type = "ConstantPool*", get = HotSpotVMField.Type.OFFSET) @Stable public int instanceKlassConstantsOffset; @HotSpotVMField(name = "InstanceKlass::_constants", type = "ConstantPool*", get = HotSpotVMField.Type.OFFSET) @Stable public int instanceKlassConstantsOffset;
@HotSpotVMField(name = "InstanceKlass::_fields", type = "Array<u2>*", get = HotSpotVMField.Type.OFFSET) @Stable public int instanceKlassFieldsOffset; @HotSpotVMField(name = "InstanceKlass::_fields", type = "Array<u2>*", get = HotSpotVMField.Type.OFFSET) @Stable public int instanceKlassFieldsOffset;
@HotSpotVMField(name = "CompilerToVM::Data::InstanceKlass_vtable_start_offset", type = "int", get = HotSpotVMField.Type.VALUE) @Stable public int instanceKlassVtableStartOffset; @HotSpotVMField(name = "CompilerToVM::Data::Klass_vtable_start_offset", type = "int", get = HotSpotVMField.Type.VALUE) @Stable public int klassVtableStartOffset;
@HotSpotVMField(name = "CompilerToVM::Data::InstanceKlass_vtable_length_offset", type = "int", get = HotSpotVMField.Type.VALUE) @Stable public int instanceKlassVtableLengthOffset; @HotSpotVMField(name = "CompilerToVM::Data::Klass_vtable_length_offset", type = "int", get = HotSpotVMField.Type.VALUE) @Stable public int klassVtableLengthOffset;
@HotSpotVMConstant(name = "InstanceKlass::linked") @Stable public int instanceKlassStateLinked; @HotSpotVMConstant(name = "InstanceKlass::linked") @Stable public int instanceKlassStateLinked;
@HotSpotVMConstant(name = "InstanceKlass::fully_initialized") @Stable public int instanceKlassStateFullyInitialized; @HotSpotVMConstant(name = "InstanceKlass::fully_initialized") @Stable public int instanceKlassStateFullyInitialized;

View file

@ -2972,7 +2972,7 @@ void LIRGenerator::do_Invoke(Invoke* x) {
SharedRuntime::get_resolve_virtual_call_stub(), SharedRuntime::get_resolve_virtual_call_stub(),
arg_list, info); arg_list, info);
} else { } else {
int entry_offset = in_bytes(InstanceKlass::vtable_start_offset()) + x->vtable_index() * vtableEntry::size_in_bytes(); int entry_offset = in_bytes(Klass::vtable_start_offset()) + x->vtable_index() * vtableEntry::size_in_bytes();
int vtable_offset = entry_offset + vtableEntry::method_offset_in_bytes(); int vtable_offset = entry_offset + vtableEntry::method_offset_in_bytes();
__ call_virtual(target, receiver, result_register, vtable_offset, arg_list, info); __ call_virtual(target, receiver, result_register, vtable_offset, arg_list, info);
} }

View file

@ -121,8 +121,8 @@ extern uint64_t jvmciHotSpotVMAddressEntryValueOffset;
extern uint64_t jvmciHotSpotVMAddressEntryArrayStride; extern uint64_t jvmciHotSpotVMAddressEntryArrayStride;
} }
int CompilerToVM::Data::InstanceKlass_vtable_start_offset; int CompilerToVM::Data::Klass_vtable_start_offset;
int CompilerToVM::Data::InstanceKlass_vtable_length_offset; int CompilerToVM::Data::Klass_vtable_length_offset;
int CompilerToVM::Data::Method_extra_stack_entries; int CompilerToVM::Data::Method_extra_stack_entries;
@ -151,8 +151,8 @@ jbyte* CompilerToVM::Data::cardtable_start_address;
int CompilerToVM::Data::cardtable_shift; int CompilerToVM::Data::cardtable_shift;
void CompilerToVM::Data::initialize() { void CompilerToVM::Data::initialize() {
InstanceKlass_vtable_start_offset = in_bytes(InstanceKlass::vtable_start_offset()); Klass_vtable_start_offset = in_bytes(Klass::vtable_start_offset());
InstanceKlass_vtable_length_offset = in_bytes(InstanceKlass::vtable_length_offset()); Klass_vtable_length_offset = in_bytes(Klass::vtable_length_offset());
Method_extra_stack_entries = Method::extra_stack_entries(); Method_extra_stack_entries = Method::extra_stack_entries();

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2011, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2011, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -34,8 +34,8 @@ class CompilerToVM {
friend class JVMCIVMStructs; friend class JVMCIVMStructs;
private: private:
static int InstanceKlass_vtable_start_offset; static int Klass_vtable_start_offset;
static int InstanceKlass_vtable_length_offset; static int Klass_vtable_length_offset;
static int Method_extra_stack_entries; static int Method_extra_stack_entries;

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -45,8 +45,8 @@
#define VM_STRUCTS(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field) \ #define VM_STRUCTS(nonstatic_field, static_field, unchecked_nonstatic_field, volatile_nonstatic_field) \
static_field(CompilerToVM::Data, InstanceKlass_vtable_start_offset, int) \ static_field(CompilerToVM::Data, Klass_vtable_start_offset, int) \
static_field(CompilerToVM::Data, InstanceKlass_vtable_length_offset, int) \ static_field(CompilerToVM::Data, Klass_vtable_length_offset, int) \
\ \
static_field(CompilerToVM::Data, Method_extra_stack_entries, int) \ static_field(CompilerToVM::Data, Method_extra_stack_entries, int) \
\ \

View file

@ -81,10 +81,10 @@ Method* ArrayKlass::uncached_lookup_method(const Symbol* name,
ArrayKlass::ArrayKlass(Symbol* name) : ArrayKlass::ArrayKlass(Symbol* name) :
_dimension(1), _dimension(1),
_higher_dimension(NULL), _higher_dimension(NULL),
_lower_dimension(NULL), _lower_dimension(NULL) {
// Arrays don't add any new methods, so their vtable is the same size as // Arrays don't add any new methods, so their vtable is the same size as
// the vtable of klass Object. // the vtable of klass Object.
_vtable_len(Universe::base_vtable_size()) { set_vtable_length(Universe::base_vtable_size());
set_name(name); set_name(name);
set_super(Universe::is_bootstrapping() ? (Klass*)NULL : SystemDictionary::Object_klass()); set_super(Universe::is_bootstrapping() ? (Klass*)NULL : SystemDictionary::Object_klass());
set_layout_helper(Klass::_lh_neutral_value); set_layout_helper(Klass::_lh_neutral_value);

View file

@ -39,7 +39,6 @@ class ArrayKlass: public Klass {
int _dimension; // This is n'th-dimensional array. int _dimension; // This is n'th-dimensional array.
Klass* volatile _higher_dimension; // Refers the (n+1)'th-dimensional array (if present). Klass* volatile _higher_dimension; // Refers the (n+1)'th-dimensional array (if present).
Klass* volatile _lower_dimension; // Refers the (n-1)'th-dimensional array (if present). Klass* volatile _lower_dimension; // Refers the (n-1)'th-dimensional array (if present).
int _vtable_len; // size of vtable for this klass
protected: protected:
// Constructors // Constructors
@ -112,9 +111,6 @@ class ArrayKlass: public Klass {
// Java vtable // Java vtable
klassVtable* vtable() const; // return new klassVtable klassVtable* vtable() const; // return new klassVtable
int vtable_length() const { return _vtable_len; }
static int base_vtable_length() { return Universe::base_vtable_size(); }
void set_vtable_length(int len) { assert(len == base_vtable_length(), "bad length"); _vtable_len = len; }
protected: protected:
inline intptr_t* start_of_vtable() const; inline intptr_t* start_of_vtable() const;

View file

@ -211,9 +211,9 @@ Array<int>* InstanceKlass::create_new_default_vtable_indices(int len, TRAPS) {
InstanceKlass::InstanceKlass(const ClassFileParser& parser, unsigned kind) : InstanceKlass::InstanceKlass(const ClassFileParser& parser, unsigned kind) :
_static_field_size(parser.static_field_size()), _static_field_size(parser.static_field_size()),
_nonstatic_oop_map_size(nonstatic_oop_map_size(parser.total_oop_map_count())), _nonstatic_oop_map_size(nonstatic_oop_map_size(parser.total_oop_map_count())),
_vtable_len(parser.vtable_size()),
_itable_len(parser.itable_size()), _itable_len(parser.itable_size()),
_reference_type(parser.reference_type()) { _reference_type(parser.reference_type()) {
set_vtable_length(parser.vtable_size());
set_kind(kind); set_kind(kind);
set_access_flags(parser.access_flags()); set_access_flags(parser.access_flags());
set_is_anonymous(parser.is_anonymous()); set_is_anonymous(parser.is_anonymous());

View file

@ -178,6 +178,7 @@ class InstanceKlass: public Klass {
u2 _java_fields_count; // The number of declared Java fields u2 _java_fields_count; // The number of declared Java fields
int _nonstatic_oop_map_size;// size in words of nonstatic oop map blocks int _nonstatic_oop_map_size;// size in words of nonstatic oop map blocks
int _itable_len; // length of Java itable (in words)
// _is_marked_dependent can be set concurrently, thus cannot be part of the // _is_marked_dependent can be set concurrently, thus cannot be part of the
// _misc_flags. // _misc_flags.
bool _is_marked_dependent; // used for marking during flushing and deoptimization bool _is_marked_dependent; // used for marking during flushing and deoptimization
@ -211,8 +212,6 @@ class InstanceKlass: public Klass {
u2 _minor_version; // minor version number of class file u2 _minor_version; // minor version number of class file
u2 _major_version; // major version number of class file u2 _major_version; // major version number of class file
Thread* _init_thread; // Pointer to current thread doing initialization (to handle recusive initialization) Thread* _init_thread; // Pointer to current thread doing initialization (to handle recusive initialization)
int _vtable_len; // length of Java vtable (in words)
int _itable_len; // length of Java itable (in words)
OopMapCache* volatile _oop_map_cache; // OopMapCache for all methods in the klass (allocated lazily) OopMapCache* volatile _oop_map_cache; // OopMapCache for all methods in the klass (allocated lazily)
MemberNameTable* _member_names; // Member names MemberNameTable* _member_names; // Member names
JNIid* _jni_ids; // First JNI identifier for static fields in this class JNIid* _jni_ids; // First JNI identifier for static fields in this class
@ -311,10 +310,6 @@ class InstanceKlass: public Klass {
int static_oop_field_count() const { return (int)_static_oop_field_count; } int static_oop_field_count() const { return (int)_static_oop_field_count; }
void set_static_oop_field_count(u2 size) { _static_oop_field_count = size; } void set_static_oop_field_count(u2 size) { _static_oop_field_count = size; }
// Java vtable
int vtable_length() const { return _vtable_len; }
void set_vtable_length(int len) { _vtable_len = len; }
// Java itable // Java itable
int itable_length() const { return _itable_len; } int itable_length() const { return _itable_len; }
void set_itable_length(int len) { _itable_len = len; } void set_itable_length(int len) { _itable_len = len; }
@ -949,9 +944,6 @@ public:
virtual void collect_statistics(KlassSizeStats *sz) const; virtual void collect_statistics(KlassSizeStats *sz) const;
#endif #endif
static ByteSize vtable_start_offset() { return in_ByteSize(header_size() * wordSize); }
static ByteSize vtable_length_offset() { return byte_offset_of(InstanceKlass, _vtable_len); }
intptr_t* start_of_vtable() const { return (intptr_t*) ((address)this + in_bytes(vtable_start_offset())); } intptr_t* start_of_vtable() const { return (intptr_t*) ((address)this + in_bytes(vtable_start_offset())); }
intptr_t* start_of_itable() const { return start_of_vtable() + vtable_length(); } intptr_t* start_of_itable() const { return start_of_vtable() + vtable_length(); }
int itable_offset_in_words() const { return start_of_itable() - (intptr_t*)this; } int itable_offset_in_words() const { return start_of_itable() - (intptr_t*)this; }

View file

@ -1,5 +1,5 @@
/* /*
* Copyright (c) 1997, 2015, Oracle and/or its affiliates. All rights reserved. * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
* *
* This code is free software; you can redistribute it and/or modify it * This code is free software; you can redistribute it and/or modify it
@ -659,6 +659,10 @@ void Klass::oop_verify_on(oop obj, outputStream* st) {
guarantee(obj->klass()->is_klass(), "klass field is not a klass"); guarantee(obj->klass()->is_klass(), "klass field is not a klass");
} }
ByteSize Klass::vtable_start_offset() {
return in_ByteSize(InstanceKlass::header_size() * wordSize);
}
#ifndef PRODUCT #ifndef PRODUCT
bool Klass::verify_vtable_index(int i) { bool Klass::verify_vtable_index(int i) {

View file

@ -131,13 +131,16 @@ class Klass : public Metadata {
jint _modifier_flags; // Processed access flags, for use by Class.getModifiers. jint _modifier_flags; // Processed access flags, for use by Class.getModifiers.
AccessFlags _access_flags; // Access flags. The class/interface distinction is stored here. AccessFlags _access_flags; // Access flags. The class/interface distinction is stored here.
TRACE_DEFINE_KLASS_TRACE_ID;
// Biased locking implementation and statistics // Biased locking implementation and statistics
// (the 64-bit chunk goes first, to avoid some fragmentation) // (the 64-bit chunk goes first, to avoid some fragmentation)
jlong _last_biased_lock_bulk_revocation_time; jlong _last_biased_lock_bulk_revocation_time;
markOop _prototype_header; // Used when biased locking is both enabled and disabled for this type markOop _prototype_header; // Used when biased locking is both enabled and disabled for this type
jint _biased_lock_revocation_count; jint _biased_lock_revocation_count;
TRACE_DEFINE_KLASS_TRACE_ID; // vtable length
int _vtable_len;
// Remembered sets support for the oops in the klasses. // Remembered sets support for the oops in the klasses.
jbyte _modified_oops; // Card Table Equivalent (YC/CMS support) jbyte _modified_oops; // Card Table Equivalent (YC/CMS support)
@ -375,7 +378,7 @@ protected:
// vtables // vtables
virtual klassVtable* vtable() const = 0; virtual klassVtable* vtable() const = 0;
virtual int vtable_length() const = 0; int vtable_length() const { return _vtable_len; }
// subclass check // subclass check
bool is_subclass_of(const Klass* k) const; bool is_subclass_of(const Klass* k) const;
@ -438,7 +441,14 @@ protected:
virtual Klass* array_klass_impl(bool or_null, int rank, TRAPS); virtual Klass* array_klass_impl(bool or_null, int rank, TRAPS);
virtual Klass* array_klass_impl(bool or_null, TRAPS); virtual Klass* array_klass_impl(bool or_null, TRAPS);
void set_vtable_length(int len) { _vtable_len= len; }
public: public:
static ByteSize vtable_start_offset();
static ByteSize vtable_length_offset() {
return byte_offset_of(Klass, _vtable_len);
}
// CDS support - remove and restore oops from metadata. Oops are not shared. // CDS support - remove and restore oops from metadata. Oops are not shared.
virtual void remove_unshareable_info(); virtual void remove_unshareable_info();
virtual void restore_unshareable_info(ClassLoaderData* loader_data, Handle protection_domain, TRAPS); virtual void restore_unshareable_info(ClassLoaderData* loader_data, Handle protection_domain, TRAPS);

View file

@ -3828,7 +3828,7 @@ Node* LibraryCallKit::generate_virtual_guard(Node* obj_klass,
assert(vtable_index >= 0 || vtable_index == Method::nonvirtual_vtable_index, assert(vtable_index >= 0 || vtable_index == Method::nonvirtual_vtable_index,
"bad index %d", vtable_index); "bad index %d", vtable_index);
// Get the Method* out of the appropriate vtable entry. // Get the Method* out of the appropriate vtable entry.
int entry_offset = in_bytes(InstanceKlass::vtable_start_offset()) + int entry_offset = in_bytes(Klass::vtable_start_offset()) +
vtable_index*vtableEntry::size_in_bytes() + vtable_index*vtableEntry::size_in_bytes() +
vtableEntry::method_offset_in_bytes(); vtableEntry::method_offset_in_bytes();
Node* entry_addr = basic_plus_adr(obj_klass, entry_offset); Node* entry_addr = basic_plus_adr(obj_klass, entry_offset);

View file

@ -298,7 +298,6 @@ typedef CompactHashtable<Symbol*, char> SymbolCompactHashTable;
nonstatic_field(ArrayKlass, _dimension, int) \ nonstatic_field(ArrayKlass, _dimension, int) \
volatile_nonstatic_field(ArrayKlass, _higher_dimension, Klass*) \ volatile_nonstatic_field(ArrayKlass, _higher_dimension, Klass*) \
volatile_nonstatic_field(ArrayKlass, _lower_dimension, Klass*) \ volatile_nonstatic_field(ArrayKlass, _lower_dimension, Klass*) \
nonstatic_field(ArrayKlass, _vtable_len, int) \
nonstatic_field(CompiledICHolder, _holder_method, Method*) \ nonstatic_field(CompiledICHolder, _holder_method, Method*) \
nonstatic_field(CompiledICHolder, _holder_klass, Klass*) \ nonstatic_field(CompiledICHolder, _holder_klass, Klass*) \
nonstatic_field(ConstantPool, _tags, Array<u1>*) \ nonstatic_field(ConstantPool, _tags, Array<u1>*) \
@ -332,7 +331,6 @@ typedef CompactHashtable<Symbol*, char> SymbolCompactHashTable;
nonstatic_field(InstanceKlass, _major_version, u2) \ nonstatic_field(InstanceKlass, _major_version, u2) \
nonstatic_field(InstanceKlass, _init_state, u1) \ nonstatic_field(InstanceKlass, _init_state, u1) \
nonstatic_field(InstanceKlass, _init_thread, Thread*) \ nonstatic_field(InstanceKlass, _init_thread, Thread*) \
nonstatic_field(InstanceKlass, _vtable_len, int) \
nonstatic_field(InstanceKlass, _itable_len, int) \ nonstatic_field(InstanceKlass, _itable_len, int) \
nonstatic_field(InstanceKlass, _reference_type, u1) \ nonstatic_field(InstanceKlass, _reference_type, u1) \
volatile_nonstatic_field(InstanceKlass, _oop_map_cache, OopMapCache*) \ volatile_nonstatic_field(InstanceKlass, _oop_map_cache, OopMapCache*) \
@ -358,6 +356,7 @@ typedef CompactHashtable<Symbol*, char> SymbolCompactHashTable;
nonstatic_field(Klass, _access_flags, AccessFlags) \ nonstatic_field(Klass, _access_flags, AccessFlags) \
nonstatic_field(Klass, _prototype_header, markOop) \ nonstatic_field(Klass, _prototype_header, markOop) \
nonstatic_field(Klass, _next_sibling, Klass*) \ nonstatic_field(Klass, _next_sibling, Klass*) \
nonstatic_field(Klass, _vtable_len, int) \
nonstatic_field(vtableEntry, _method, Method*) \ nonstatic_field(vtableEntry, _method, Method*) \
nonstatic_field(MethodData, _size, int) \ nonstatic_field(MethodData, _size, int) \
nonstatic_field(MethodData, _method, Method*) \ nonstatic_field(MethodData, _method, Method*) \

View file

@ -1144,7 +1144,7 @@ Value *SharkTopLevelBlock::get_virtual_callee(SharkValue* receiver,
klass, klass,
SharkType::Method_type(), SharkType::Method_type(),
vtableEntry::size_in_bytes(), vtableEntry::size_in_bytes(),
InstanceKlass::vtable_start_offset(), Klass::vtable_start_offset(),
LLVMValue::intptr_constant(vtable_index)), LLVMValue::intptr_constant(vtable_index)),
"callee"); "callee");
} }
@ -1166,12 +1166,12 @@ Value* SharkTopLevelBlock::get_interface_callee(SharkValue *receiver,
Value *vtable_start = builder()->CreateAdd( Value *vtable_start = builder()->CreateAdd(
builder()->CreatePtrToInt(object_klass, SharkType::intptr_type()), builder()->CreatePtrToInt(object_klass, SharkType::intptr_type()),
LLVMValue::intptr_constant( LLVMValue::intptr_constant(
in_bytes(InstanceKlass::vtable_start_offset())), in_bytes(Klass::vtable_start_offset())),
"vtable_start"); "vtable_start");
Value *vtable_length = builder()->CreateValueOfStructEntry( Value *vtable_length = builder()->CreateValueOfStructEntry(
object_klass, object_klass,
InstanceKlass::vtable_length_offset(), Klass::vtable_length_offset(),
SharkType::jint_type(), SharkType::jint_type(),
"vtable_length"); "vtable_length");
vtable_length = vtable_length =