hotspot/src/share/vm/jvmci/jvmciCompilerToVM.cpp
changeset 35123 b0b89d83bcf5
parent 35092 82170e5767c3
child 35499 b79827ea1b9f
child 35542 9dccb7f9f656
equal deleted inserted replaced
35121:e8900e5763ff 35123:b0b89d83bcf5
    41 #include "jvmci/jvmciCompilerToVM.hpp"
    41 #include "jvmci/jvmciCompilerToVM.hpp"
    42 #include "jvmci/jvmciCompiler.hpp"
    42 #include "jvmci/jvmciCompiler.hpp"
    43 #include "jvmci/jvmciEnv.hpp"
    43 #include "jvmci/jvmciEnv.hpp"
    44 #include "jvmci/jvmciJavaClasses.hpp"
    44 #include "jvmci/jvmciJavaClasses.hpp"
    45 #include "jvmci/jvmciCodeInstaller.hpp"
    45 #include "jvmci/jvmciCodeInstaller.hpp"
       
    46 #include "jvmci/vmStructs_jvmci.hpp"
    46 #include "gc/g1/heapRegion.hpp"
    47 #include "gc/g1/heapRegion.hpp"
    47 #include "runtime/javaCalls.hpp"
    48 #include "runtime/javaCalls.hpp"
    48 #include "runtime/deoptimization.hpp"
    49 #include "runtime/deoptimization.hpp"
    49 #include "runtime/vframe.hpp"
    50 #include "runtime/vframe.hpp"
    50 #include "runtime/vframe_hp.hpp"
    51 #include "runtime/vframe_hp.hpp"
    83   }
    84   }
    84   return NULL;
    85   return NULL;
    85 }
    86 }
    86 
    87 
    87 extern "C" {
    88 extern "C" {
    88 extern VMStructEntry* gHotSpotVMStructs;
    89 extern VMStructEntry* jvmciHotSpotVMStructs;
    89 extern uint64_t gHotSpotVMStructEntryTypeNameOffset;
    90 extern uint64_t jvmciHotSpotVMStructEntryTypeNameOffset;
    90 extern uint64_t gHotSpotVMStructEntryFieldNameOffset;
    91 extern uint64_t jvmciHotSpotVMStructEntryFieldNameOffset;
    91 extern uint64_t gHotSpotVMStructEntryTypeStringOffset;
    92 extern uint64_t jvmciHotSpotVMStructEntryTypeStringOffset;
    92 extern uint64_t gHotSpotVMStructEntryIsStaticOffset;
    93 extern uint64_t jvmciHotSpotVMStructEntryIsStaticOffset;
    93 extern uint64_t gHotSpotVMStructEntryOffsetOffset;
    94 extern uint64_t jvmciHotSpotVMStructEntryOffsetOffset;
    94 extern uint64_t gHotSpotVMStructEntryAddressOffset;
    95 extern uint64_t jvmciHotSpotVMStructEntryAddressOffset;
    95 extern uint64_t gHotSpotVMStructEntryArrayStride;
    96 extern uint64_t jvmciHotSpotVMStructEntryArrayStride;
    96 
    97 
    97 extern VMTypeEntry* gHotSpotVMTypes;
    98 extern VMTypeEntry* jvmciHotSpotVMTypes;
    98 extern uint64_t gHotSpotVMTypeEntryTypeNameOffset;
    99 extern uint64_t jvmciHotSpotVMTypeEntryTypeNameOffset;
    99 extern uint64_t gHotSpotVMTypeEntrySuperclassNameOffset;
   100 extern uint64_t jvmciHotSpotVMTypeEntrySuperclassNameOffset;
   100 extern uint64_t gHotSpotVMTypeEntryIsOopTypeOffset;
   101 extern uint64_t jvmciHotSpotVMTypeEntryIsOopTypeOffset;
   101 extern uint64_t gHotSpotVMTypeEntryIsIntegerTypeOffset;
   102 extern uint64_t jvmciHotSpotVMTypeEntryIsIntegerTypeOffset;
   102 extern uint64_t gHotSpotVMTypeEntryIsUnsignedOffset;
   103 extern uint64_t jvmciHotSpotVMTypeEntryIsUnsignedOffset;
   103 extern uint64_t gHotSpotVMTypeEntrySizeOffset;
   104 extern uint64_t jvmciHotSpotVMTypeEntrySizeOffset;
   104 extern uint64_t gHotSpotVMTypeEntryArrayStride;
   105 extern uint64_t jvmciHotSpotVMTypeEntryArrayStride;
   105 
   106 
   106 extern VMIntConstantEntry* gHotSpotVMIntConstants;
   107 extern VMIntConstantEntry* jvmciHotSpotVMIntConstants;
   107 extern uint64_t gHotSpotVMIntConstantEntryNameOffset;
   108 extern uint64_t jvmciHotSpotVMIntConstantEntryNameOffset;
   108 extern uint64_t gHotSpotVMIntConstantEntryValueOffset;
   109 extern uint64_t jvmciHotSpotVMIntConstantEntryValueOffset;
   109 extern uint64_t gHotSpotVMIntConstantEntryArrayStride;
   110 extern uint64_t jvmciHotSpotVMIntConstantEntryArrayStride;
   110 
   111 
   111 extern VMLongConstantEntry* gHotSpotVMLongConstants;
   112 extern VMLongConstantEntry* jvmciHotSpotVMLongConstants;
   112 extern uint64_t gHotSpotVMLongConstantEntryNameOffset;
   113 extern uint64_t jvmciHotSpotVMLongConstantEntryNameOffset;
   113 extern uint64_t gHotSpotVMLongConstantEntryValueOffset;
   114 extern uint64_t jvmciHotSpotVMLongConstantEntryValueOffset;
   114 extern uint64_t gHotSpotVMLongConstantEntryArrayStride;
   115 extern uint64_t jvmciHotSpotVMLongConstantEntryArrayStride;
   115 
   116 
   116 extern VMAddressEntry* gHotSpotVMAddresses;
   117 extern VMAddressEntry* jvmciHotSpotVMAddresses;
   117 extern uint64_t gHotSpotVMAddressEntryNameOffset;
   118 extern uint64_t jvmciHotSpotVMAddressEntryNameOffset;
   118 extern uint64_t gHotSpotVMAddressEntryValueOffset;
   119 extern uint64_t jvmciHotSpotVMAddressEntryValueOffset;
   119 extern uint64_t gHotSpotVMAddressEntryArrayStride;
   120 extern uint64_t jvmciHotSpotVMAddressEntryArrayStride;
   120 }
   121 }
   121 
   122 
   122 // FIXME This is only temporary until the GC code is changed.
   123 int CompilerToVM::Data::InstanceKlass_vtable_start_offset;
   123 bool       CompilerToVM::_supports_inline_contig_alloc;
   124 int CompilerToVM::Data::InstanceKlass_vtable_length_offset;
   124 HeapWord** CompilerToVM::_heap_end_addr;
   125 
   125 HeapWord** CompilerToVM::_heap_top_addr;
   126 int CompilerToVM::Data::Method_extra_stack_entries;
       
   127 
       
   128 address CompilerToVM::Data::SharedRuntime_ic_miss_stub;
       
   129 address CompilerToVM::Data::SharedRuntime_handle_wrong_method_stub;
       
   130 address CompilerToVM::Data::SharedRuntime_deopt_blob_unpack;
       
   131 address CompilerToVM::Data::SharedRuntime_deopt_blob_uncommon_trap;
       
   132 
       
   133 size_t CompilerToVM::Data::ThreadLocalAllocBuffer_alignment_reserve;
       
   134 
       
   135 CollectedHeap* CompilerToVM::Data::Universe_collectedHeap;
       
   136 int CompilerToVM::Data::Universe_base_vtable_size;
       
   137 address CompilerToVM::Data::Universe_narrow_oop_base;
       
   138 int CompilerToVM::Data::Universe_narrow_oop_shift;
       
   139 address CompilerToVM::Data::Universe_narrow_klass_base;
       
   140 int CompilerToVM::Data::Universe_narrow_klass_shift;
       
   141 void* CompilerToVM::Data::Universe_non_oop_bits;
       
   142 uintptr_t CompilerToVM::Data::Universe_verify_oop_mask;
       
   143 uintptr_t CompilerToVM::Data::Universe_verify_oop_bits;
       
   144 
       
   145 bool       CompilerToVM::Data::_supports_inline_contig_alloc;
       
   146 HeapWord** CompilerToVM::Data::_heap_end_addr;
       
   147 HeapWord** CompilerToVM::Data::_heap_top_addr;
       
   148 
       
   149 jbyte* CompilerToVM::Data::cardtable_start_address;
       
   150 int CompilerToVM::Data::cardtable_shift;
       
   151 
       
   152 void CompilerToVM::Data::initialize() {
       
   153   InstanceKlass_vtable_start_offset = InstanceKlass::vtable_start_offset();
       
   154   InstanceKlass_vtable_length_offset = InstanceKlass::vtable_length_offset() * HeapWordSize;
       
   155 
       
   156   Method_extra_stack_entries = Method::extra_stack_entries();
       
   157 
       
   158   SharedRuntime_ic_miss_stub = SharedRuntime::get_ic_miss_stub();
       
   159   SharedRuntime_handle_wrong_method_stub = SharedRuntime::get_handle_wrong_method_stub();
       
   160   SharedRuntime_deopt_blob_unpack = SharedRuntime::deopt_blob()->unpack();
       
   161   SharedRuntime_deopt_blob_uncommon_trap = SharedRuntime::deopt_blob()->uncommon_trap();
       
   162 
       
   163   ThreadLocalAllocBuffer_alignment_reserve = ThreadLocalAllocBuffer::alignment_reserve();
       
   164 
       
   165   Universe_collectedHeap = Universe::heap();
       
   166   Universe_base_vtable_size = Universe::base_vtable_size();
       
   167   Universe_narrow_oop_base = Universe::narrow_oop_base();
       
   168   Universe_narrow_oop_shift = Universe::narrow_oop_shift();
       
   169   Universe_narrow_klass_base = Universe::narrow_klass_base();
       
   170   Universe_narrow_klass_shift = Universe::narrow_klass_shift();
       
   171   Universe_non_oop_bits = Universe::non_oop_word();
       
   172   Universe_verify_oop_mask = Universe::verify_oop_mask();
       
   173   Universe_verify_oop_bits = Universe::verify_oop_bits();
       
   174 
       
   175   _supports_inline_contig_alloc = Universe::heap()->supports_inline_contig_alloc();
       
   176   _heap_end_addr = _supports_inline_contig_alloc ? Universe::heap()->end_addr() : (HeapWord**) -1;
       
   177   _heap_top_addr = _supports_inline_contig_alloc ? Universe::heap()->top_addr() : (HeapWord**) -1;
       
   178 
       
   179   BarrierSet* bs = Universe::heap()->barrier_set();
       
   180   switch (bs->kind()) {
       
   181   case BarrierSet::CardTableModRef:
       
   182   case BarrierSet::CardTableForRS:
       
   183   case BarrierSet::CardTableExtension:
       
   184   case BarrierSet::G1SATBCT:
       
   185   case BarrierSet::G1SATBCTLogging: {
       
   186     jbyte* base = barrier_set_cast<CardTableModRefBS>(bs)->byte_map_base;
       
   187     assert(base != 0, "unexpected byte_map_base");
       
   188     cardtable_start_address = base;
       
   189     cardtable_shift = CardTableModRefBS::card_shift;
       
   190     break;
       
   191   }
       
   192   case BarrierSet::ModRef:
       
   193     cardtable_start_address = 0;
       
   194     cardtable_shift = 0;
       
   195     // No post barriers
       
   196     break;
       
   197   default:
       
   198     ShouldNotReachHere();
       
   199     break;
       
   200   }
       
   201 }
   126 
   202 
   127 /**
   203 /**
   128  * We put all gHotSpotVM values in an array so we can read them easily from Java.
   204  * We put all jvmciHotSpotVM values in an array so we can read them easily from Java.
   129  */
   205  */
   130 static uintptr_t ciHotSpotVMData[28];
   206 static uintptr_t ciHotSpotVMData[28];
   131 
   207 
   132 C2V_VMENTRY(jlong, initializeConfiguration, (JNIEnv *env, jobject))
   208 C2V_VMENTRY(jlong, initializeConfiguration, (JNIEnv *env, jobject))
   133   ciHotSpotVMData[0] = (uintptr_t) gHotSpotVMStructs;
   209   ciHotSpotVMData[0] = (uintptr_t) jvmciHotSpotVMStructs;
   134   ciHotSpotVMData[1] = gHotSpotVMStructEntryTypeNameOffset;
   210   ciHotSpotVMData[1] = jvmciHotSpotVMStructEntryTypeNameOffset;
   135   ciHotSpotVMData[2] = gHotSpotVMStructEntryFieldNameOffset;
   211   ciHotSpotVMData[2] = jvmciHotSpotVMStructEntryFieldNameOffset;
   136   ciHotSpotVMData[3] = gHotSpotVMStructEntryTypeStringOffset;
   212   ciHotSpotVMData[3] = jvmciHotSpotVMStructEntryTypeStringOffset;
   137   ciHotSpotVMData[4] = gHotSpotVMStructEntryIsStaticOffset;
   213   ciHotSpotVMData[4] = jvmciHotSpotVMStructEntryIsStaticOffset;
   138   ciHotSpotVMData[5] = gHotSpotVMStructEntryOffsetOffset;
   214   ciHotSpotVMData[5] = jvmciHotSpotVMStructEntryOffsetOffset;
   139   ciHotSpotVMData[6] = gHotSpotVMStructEntryAddressOffset;
   215   ciHotSpotVMData[6] = jvmciHotSpotVMStructEntryAddressOffset;
   140   ciHotSpotVMData[7] = gHotSpotVMStructEntryArrayStride;
   216   ciHotSpotVMData[7] = jvmciHotSpotVMStructEntryArrayStride;
   141 
   217 
   142   ciHotSpotVMData[8] = (uintptr_t) gHotSpotVMTypes;
   218   ciHotSpotVMData[8] = (uintptr_t) jvmciHotSpotVMTypes;
   143   ciHotSpotVMData[9] = gHotSpotVMTypeEntryTypeNameOffset;
   219   ciHotSpotVMData[9] = jvmciHotSpotVMTypeEntryTypeNameOffset;
   144   ciHotSpotVMData[10] = gHotSpotVMTypeEntrySuperclassNameOffset;
   220   ciHotSpotVMData[10] = jvmciHotSpotVMTypeEntrySuperclassNameOffset;
   145   ciHotSpotVMData[11] = gHotSpotVMTypeEntryIsOopTypeOffset;
   221   ciHotSpotVMData[11] = jvmciHotSpotVMTypeEntryIsOopTypeOffset;
   146   ciHotSpotVMData[12] = gHotSpotVMTypeEntryIsIntegerTypeOffset;
   222   ciHotSpotVMData[12] = jvmciHotSpotVMTypeEntryIsIntegerTypeOffset;
   147   ciHotSpotVMData[13] = gHotSpotVMTypeEntryIsUnsignedOffset;
   223   ciHotSpotVMData[13] = jvmciHotSpotVMTypeEntryIsUnsignedOffset;
   148   ciHotSpotVMData[14] = gHotSpotVMTypeEntrySizeOffset;
   224   ciHotSpotVMData[14] = jvmciHotSpotVMTypeEntrySizeOffset;
   149   ciHotSpotVMData[15] = gHotSpotVMTypeEntryArrayStride;
   225   ciHotSpotVMData[15] = jvmciHotSpotVMTypeEntryArrayStride;
   150 
   226 
   151   ciHotSpotVMData[16] = (uintptr_t) gHotSpotVMIntConstants;
   227   ciHotSpotVMData[16] = (uintptr_t) jvmciHotSpotVMIntConstants;
   152   ciHotSpotVMData[17] = gHotSpotVMIntConstantEntryNameOffset;
   228   ciHotSpotVMData[17] = jvmciHotSpotVMIntConstantEntryNameOffset;
   153   ciHotSpotVMData[18] = gHotSpotVMIntConstantEntryValueOffset;
   229   ciHotSpotVMData[18] = jvmciHotSpotVMIntConstantEntryValueOffset;
   154   ciHotSpotVMData[19] = gHotSpotVMIntConstantEntryArrayStride;
   230   ciHotSpotVMData[19] = jvmciHotSpotVMIntConstantEntryArrayStride;
   155 
   231 
   156   ciHotSpotVMData[20] = (uintptr_t) gHotSpotVMLongConstants;
   232   ciHotSpotVMData[20] = (uintptr_t) jvmciHotSpotVMLongConstants;
   157   ciHotSpotVMData[21] = gHotSpotVMLongConstantEntryNameOffset;
   233   ciHotSpotVMData[21] = jvmciHotSpotVMLongConstantEntryNameOffset;
   158   ciHotSpotVMData[22] = gHotSpotVMLongConstantEntryValueOffset;
   234   ciHotSpotVMData[22] = jvmciHotSpotVMLongConstantEntryValueOffset;
   159   ciHotSpotVMData[23] = gHotSpotVMLongConstantEntryArrayStride;
   235   ciHotSpotVMData[23] = jvmciHotSpotVMLongConstantEntryArrayStride;
   160 
   236 
   161   ciHotSpotVMData[24] = (uintptr_t) gHotSpotVMAddresses;
   237   ciHotSpotVMData[24] = (uintptr_t) jvmciHotSpotVMAddresses;
   162   ciHotSpotVMData[25] = gHotSpotVMAddressEntryNameOffset;
   238   ciHotSpotVMData[25] = jvmciHotSpotVMAddressEntryNameOffset;
   163   ciHotSpotVMData[26] = gHotSpotVMAddressEntryValueOffset;
   239   ciHotSpotVMData[26] = jvmciHotSpotVMAddressEntryValueOffset;
   164   ciHotSpotVMData[27] = gHotSpotVMAddressEntryArrayStride;
   240   ciHotSpotVMData[27] = jvmciHotSpotVMAddressEntryArrayStride;
   165 
   241 
   166   // FIXME This is only temporary until the GC code is changed.
   242   CompilerToVM::Data::initialize();
   167   CompilerToVM::_supports_inline_contig_alloc = Universe::heap()->supports_inline_contig_alloc();
       
   168   CompilerToVM::_heap_end_addr = CompilerToVM::_supports_inline_contig_alloc ? Universe::heap()->end_addr() : (HeapWord**) -1;
       
   169   CompilerToVM::_heap_top_addr = CompilerToVM::_supports_inline_contig_alloc ? Universe::heap()->top_addr() : (HeapWord**) -1;
       
   170 
   243 
   171   return (jlong) (address) &ciHotSpotVMData;
   244   return (jlong) (address) &ciHotSpotVMData;
   172 C2V_END
   245 C2V_END
   173 
   246 
   174 C2V_VMENTRY(jbyteArray, getBytecode, (JNIEnv *, jobject, jobject jvmci_method))
   247 C2V_VMENTRY(jbyteArray, getBytecode, (JNIEnv *, jobject, jobject jvmci_method))