8134994: use separate VMStructs databases for SA and JVMCI

Reviewed-by: kbarrett
This commit is contained in:
Christian Thalinger 2015-12-14 17:02:02 -10:00
parent c095394bce
commit bf5db72254
41 changed files with 1367 additions and 675 deletions

View file

@ -43,6 +43,7 @@
#include "jvmci/jvmciEnv.hpp"
#include "jvmci/jvmciJavaClasses.hpp"
#include "jvmci/jvmciCodeInstaller.hpp"
#include "jvmci/vmStructs_jvmci.hpp"
#include "gc/g1/heapRegion.hpp"
#include "runtime/javaCalls.hpp"
#include "runtime/deoptimization.hpp"
@ -85,88 +86,160 @@ oop CompilerToVM::get_jvmci_type(KlassHandle klass, TRAPS) {
}
extern "C" {
extern VMStructEntry* gHotSpotVMStructs;
extern uint64_t gHotSpotVMStructEntryTypeNameOffset;
extern uint64_t gHotSpotVMStructEntryFieldNameOffset;
extern uint64_t gHotSpotVMStructEntryTypeStringOffset;
extern uint64_t gHotSpotVMStructEntryIsStaticOffset;
extern uint64_t gHotSpotVMStructEntryOffsetOffset;
extern uint64_t gHotSpotVMStructEntryAddressOffset;
extern uint64_t gHotSpotVMStructEntryArrayStride;
extern VMStructEntry* jvmciHotSpotVMStructs;
extern uint64_t jvmciHotSpotVMStructEntryTypeNameOffset;
extern uint64_t jvmciHotSpotVMStructEntryFieldNameOffset;
extern uint64_t jvmciHotSpotVMStructEntryTypeStringOffset;
extern uint64_t jvmciHotSpotVMStructEntryIsStaticOffset;
extern uint64_t jvmciHotSpotVMStructEntryOffsetOffset;
extern uint64_t jvmciHotSpotVMStructEntryAddressOffset;
extern uint64_t jvmciHotSpotVMStructEntryArrayStride;
extern VMTypeEntry* gHotSpotVMTypes;
extern uint64_t gHotSpotVMTypeEntryTypeNameOffset;
extern uint64_t gHotSpotVMTypeEntrySuperclassNameOffset;
extern uint64_t gHotSpotVMTypeEntryIsOopTypeOffset;
extern uint64_t gHotSpotVMTypeEntryIsIntegerTypeOffset;
extern uint64_t gHotSpotVMTypeEntryIsUnsignedOffset;
extern uint64_t gHotSpotVMTypeEntrySizeOffset;
extern uint64_t gHotSpotVMTypeEntryArrayStride;
extern VMTypeEntry* jvmciHotSpotVMTypes;
extern uint64_t jvmciHotSpotVMTypeEntryTypeNameOffset;
extern uint64_t jvmciHotSpotVMTypeEntrySuperclassNameOffset;
extern uint64_t jvmciHotSpotVMTypeEntryIsOopTypeOffset;
extern uint64_t jvmciHotSpotVMTypeEntryIsIntegerTypeOffset;
extern uint64_t jvmciHotSpotVMTypeEntryIsUnsignedOffset;
extern uint64_t jvmciHotSpotVMTypeEntrySizeOffset;
extern uint64_t jvmciHotSpotVMTypeEntryArrayStride;
extern VMIntConstantEntry* gHotSpotVMIntConstants;
extern uint64_t gHotSpotVMIntConstantEntryNameOffset;
extern uint64_t gHotSpotVMIntConstantEntryValueOffset;
extern uint64_t gHotSpotVMIntConstantEntryArrayStride;
extern VMIntConstantEntry* jvmciHotSpotVMIntConstants;
extern uint64_t jvmciHotSpotVMIntConstantEntryNameOffset;
extern uint64_t jvmciHotSpotVMIntConstantEntryValueOffset;
extern uint64_t jvmciHotSpotVMIntConstantEntryArrayStride;
extern VMLongConstantEntry* gHotSpotVMLongConstants;
extern uint64_t gHotSpotVMLongConstantEntryNameOffset;
extern uint64_t gHotSpotVMLongConstantEntryValueOffset;
extern uint64_t gHotSpotVMLongConstantEntryArrayStride;
extern VMLongConstantEntry* jvmciHotSpotVMLongConstants;
extern uint64_t jvmciHotSpotVMLongConstantEntryNameOffset;
extern uint64_t jvmciHotSpotVMLongConstantEntryValueOffset;
extern uint64_t jvmciHotSpotVMLongConstantEntryArrayStride;
extern VMAddressEntry* gHotSpotVMAddresses;
extern uint64_t gHotSpotVMAddressEntryNameOffset;
extern uint64_t gHotSpotVMAddressEntryValueOffset;
extern uint64_t gHotSpotVMAddressEntryArrayStride;
extern VMAddressEntry* jvmciHotSpotVMAddresses;
extern uint64_t jvmciHotSpotVMAddressEntryNameOffset;
extern uint64_t jvmciHotSpotVMAddressEntryValueOffset;
extern uint64_t jvmciHotSpotVMAddressEntryArrayStride;
}
// FIXME This is only temporary until the GC code is changed.
bool CompilerToVM::_supports_inline_contig_alloc;
HeapWord** CompilerToVM::_heap_end_addr;
HeapWord** CompilerToVM::_heap_top_addr;
int CompilerToVM::Data::InstanceKlass_vtable_start_offset;
int CompilerToVM::Data::InstanceKlass_vtable_length_offset;
int CompilerToVM::Data::Method_extra_stack_entries;
address CompilerToVM::Data::SharedRuntime_ic_miss_stub;
address CompilerToVM::Data::SharedRuntime_handle_wrong_method_stub;
address CompilerToVM::Data::SharedRuntime_deopt_blob_unpack;
address CompilerToVM::Data::SharedRuntime_deopt_blob_uncommon_trap;
size_t CompilerToVM::Data::ThreadLocalAllocBuffer_alignment_reserve;
CollectedHeap* CompilerToVM::Data::Universe_collectedHeap;
int CompilerToVM::Data::Universe_base_vtable_size;
address CompilerToVM::Data::Universe_narrow_oop_base;
int CompilerToVM::Data::Universe_narrow_oop_shift;
address CompilerToVM::Data::Universe_narrow_klass_base;
int CompilerToVM::Data::Universe_narrow_klass_shift;
void* CompilerToVM::Data::Universe_non_oop_bits;
uintptr_t CompilerToVM::Data::Universe_verify_oop_mask;
uintptr_t CompilerToVM::Data::Universe_verify_oop_bits;
bool CompilerToVM::Data::_supports_inline_contig_alloc;
HeapWord** CompilerToVM::Data::_heap_end_addr;
HeapWord** CompilerToVM::Data::_heap_top_addr;
jbyte* CompilerToVM::Data::cardtable_start_address;
int CompilerToVM::Data::cardtable_shift;
void CompilerToVM::Data::initialize() {
InstanceKlass_vtable_start_offset = InstanceKlass::vtable_start_offset();
InstanceKlass_vtable_length_offset = InstanceKlass::vtable_length_offset() * HeapWordSize;
Method_extra_stack_entries = Method::extra_stack_entries();
SharedRuntime_ic_miss_stub = SharedRuntime::get_ic_miss_stub();
SharedRuntime_handle_wrong_method_stub = SharedRuntime::get_handle_wrong_method_stub();
SharedRuntime_deopt_blob_unpack = SharedRuntime::deopt_blob()->unpack();
SharedRuntime_deopt_blob_uncommon_trap = SharedRuntime::deopt_blob()->uncommon_trap();
ThreadLocalAllocBuffer_alignment_reserve = ThreadLocalAllocBuffer::alignment_reserve();
Universe_collectedHeap = Universe::heap();
Universe_base_vtable_size = Universe::base_vtable_size();
Universe_narrow_oop_base = Universe::narrow_oop_base();
Universe_narrow_oop_shift = Universe::narrow_oop_shift();
Universe_narrow_klass_base = Universe::narrow_klass_base();
Universe_narrow_klass_shift = Universe::narrow_klass_shift();
Universe_non_oop_bits = Universe::non_oop_word();
Universe_verify_oop_mask = Universe::verify_oop_mask();
Universe_verify_oop_bits = Universe::verify_oop_bits();
_supports_inline_contig_alloc = Universe::heap()->supports_inline_contig_alloc();
_heap_end_addr = _supports_inline_contig_alloc ? Universe::heap()->end_addr() : (HeapWord**) -1;
_heap_top_addr = _supports_inline_contig_alloc ? Universe::heap()->top_addr() : (HeapWord**) -1;
BarrierSet* bs = Universe::heap()->barrier_set();
switch (bs->kind()) {
case BarrierSet::CardTableModRef:
case BarrierSet::CardTableForRS:
case BarrierSet::CardTableExtension:
case BarrierSet::G1SATBCT:
case BarrierSet::G1SATBCTLogging: {
jbyte* base = barrier_set_cast<CardTableModRefBS>(bs)->byte_map_base;
assert(base != 0, "unexpected byte_map_base");
cardtable_start_address = base;
cardtable_shift = CardTableModRefBS::card_shift;
break;
}
case BarrierSet::ModRef:
cardtable_start_address = 0;
cardtable_shift = 0;
// No post barriers
break;
default:
ShouldNotReachHere();
break;
}
}
/**
* We put all gHotSpotVM values in an array so we can read them easily from Java.
* We put all jvmciHotSpotVM values in an array so we can read them easily from Java.
*/
static uintptr_t ciHotSpotVMData[28];
C2V_VMENTRY(jlong, initializeConfiguration, (JNIEnv *env, jobject))
ciHotSpotVMData[0] = (uintptr_t) gHotSpotVMStructs;
ciHotSpotVMData[1] = gHotSpotVMStructEntryTypeNameOffset;
ciHotSpotVMData[2] = gHotSpotVMStructEntryFieldNameOffset;
ciHotSpotVMData[3] = gHotSpotVMStructEntryTypeStringOffset;
ciHotSpotVMData[4] = gHotSpotVMStructEntryIsStaticOffset;
ciHotSpotVMData[5] = gHotSpotVMStructEntryOffsetOffset;
ciHotSpotVMData[6] = gHotSpotVMStructEntryAddressOffset;
ciHotSpotVMData[7] = gHotSpotVMStructEntryArrayStride;
ciHotSpotVMData[0] = (uintptr_t) jvmciHotSpotVMStructs;
ciHotSpotVMData[1] = jvmciHotSpotVMStructEntryTypeNameOffset;
ciHotSpotVMData[2] = jvmciHotSpotVMStructEntryFieldNameOffset;
ciHotSpotVMData[3] = jvmciHotSpotVMStructEntryTypeStringOffset;
ciHotSpotVMData[4] = jvmciHotSpotVMStructEntryIsStaticOffset;
ciHotSpotVMData[5] = jvmciHotSpotVMStructEntryOffsetOffset;
ciHotSpotVMData[6] = jvmciHotSpotVMStructEntryAddressOffset;
ciHotSpotVMData[7] = jvmciHotSpotVMStructEntryArrayStride;
ciHotSpotVMData[8] = (uintptr_t) gHotSpotVMTypes;
ciHotSpotVMData[9] = gHotSpotVMTypeEntryTypeNameOffset;
ciHotSpotVMData[10] = gHotSpotVMTypeEntrySuperclassNameOffset;
ciHotSpotVMData[11] = gHotSpotVMTypeEntryIsOopTypeOffset;
ciHotSpotVMData[12] = gHotSpotVMTypeEntryIsIntegerTypeOffset;
ciHotSpotVMData[13] = gHotSpotVMTypeEntryIsUnsignedOffset;
ciHotSpotVMData[14] = gHotSpotVMTypeEntrySizeOffset;
ciHotSpotVMData[15] = gHotSpotVMTypeEntryArrayStride;
ciHotSpotVMData[8] = (uintptr_t) jvmciHotSpotVMTypes;
ciHotSpotVMData[9] = jvmciHotSpotVMTypeEntryTypeNameOffset;
ciHotSpotVMData[10] = jvmciHotSpotVMTypeEntrySuperclassNameOffset;
ciHotSpotVMData[11] = jvmciHotSpotVMTypeEntryIsOopTypeOffset;
ciHotSpotVMData[12] = jvmciHotSpotVMTypeEntryIsIntegerTypeOffset;
ciHotSpotVMData[13] = jvmciHotSpotVMTypeEntryIsUnsignedOffset;
ciHotSpotVMData[14] = jvmciHotSpotVMTypeEntrySizeOffset;
ciHotSpotVMData[15] = jvmciHotSpotVMTypeEntryArrayStride;
ciHotSpotVMData[16] = (uintptr_t) gHotSpotVMIntConstants;
ciHotSpotVMData[17] = gHotSpotVMIntConstantEntryNameOffset;
ciHotSpotVMData[18] = gHotSpotVMIntConstantEntryValueOffset;
ciHotSpotVMData[19] = gHotSpotVMIntConstantEntryArrayStride;
ciHotSpotVMData[16] = (uintptr_t) jvmciHotSpotVMIntConstants;
ciHotSpotVMData[17] = jvmciHotSpotVMIntConstantEntryNameOffset;
ciHotSpotVMData[18] = jvmciHotSpotVMIntConstantEntryValueOffset;
ciHotSpotVMData[19] = jvmciHotSpotVMIntConstantEntryArrayStride;
ciHotSpotVMData[20] = (uintptr_t) gHotSpotVMLongConstants;
ciHotSpotVMData[21] = gHotSpotVMLongConstantEntryNameOffset;
ciHotSpotVMData[22] = gHotSpotVMLongConstantEntryValueOffset;
ciHotSpotVMData[23] = gHotSpotVMLongConstantEntryArrayStride;
ciHotSpotVMData[20] = (uintptr_t) jvmciHotSpotVMLongConstants;
ciHotSpotVMData[21] = jvmciHotSpotVMLongConstantEntryNameOffset;
ciHotSpotVMData[22] = jvmciHotSpotVMLongConstantEntryValueOffset;
ciHotSpotVMData[23] = jvmciHotSpotVMLongConstantEntryArrayStride;
ciHotSpotVMData[24] = (uintptr_t) gHotSpotVMAddresses;
ciHotSpotVMData[25] = gHotSpotVMAddressEntryNameOffset;
ciHotSpotVMData[26] = gHotSpotVMAddressEntryValueOffset;
ciHotSpotVMData[27] = gHotSpotVMAddressEntryArrayStride;
ciHotSpotVMData[24] = (uintptr_t) jvmciHotSpotVMAddresses;
ciHotSpotVMData[25] = jvmciHotSpotVMAddressEntryNameOffset;
ciHotSpotVMData[26] = jvmciHotSpotVMAddressEntryValueOffset;
ciHotSpotVMData[27] = jvmciHotSpotVMAddressEntryArrayStride;
// FIXME This is only temporary until the GC code is changed.
CompilerToVM::_supports_inline_contig_alloc = Universe::heap()->supports_inline_contig_alloc();
CompilerToVM::_heap_end_addr = CompilerToVM::_supports_inline_contig_alloc ? Universe::heap()->end_addr() : (HeapWord**) -1;
CompilerToVM::_heap_top_addr = CompilerToVM::_supports_inline_contig_alloc ? Universe::heap()->top_addr() : (HeapWord**) -1;
CompilerToVM::Data::initialize();
return (jlong) (address) &ciHotSpotVMData;
C2V_END