Mercurial > hg > graal-jvmci-8
comparison src/share/vm/jvmci/jvmciCompilerToVM.cpp @ 23679:b5557b757040
fix HotSpotVMConfig startup performance (JDK-8159167)
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Wed, 15 Jun 2016 00:00:41 +0200 |
parents | f84a5ac3be22 |
children | 1b939a613788 |
comparison
equal
deleted
inserted
replaced
23678:e86a0b0ba969 | 23679:b5557b757040 |
---|---|
40 #include "jvmci/jvmciCompiler.hpp" | 40 #include "jvmci/jvmciCompiler.hpp" |
41 #include "jvmci/jvmciEnv.hpp" | 41 #include "jvmci/jvmciEnv.hpp" |
42 #include "jvmci/jvmciJavaClasses.hpp" | 42 #include "jvmci/jvmciJavaClasses.hpp" |
43 #include "jvmci/jvmciCodeInstaller.hpp" | 43 #include "jvmci/jvmciCodeInstaller.hpp" |
44 #include "gc_implementation/g1/heapRegion.hpp" | 44 #include "gc_implementation/g1/heapRegion.hpp" |
45 #include "gc_implementation/g1/g1SATBCardTableModRefBS.hpp" | |
45 #include "runtime/javaCalls.hpp" | 46 #include "runtime/javaCalls.hpp" |
46 #include "runtime/deoptimization.hpp" | 47 #include "runtime/deoptimization.hpp" |
47 #include "runtime/vframe.hpp" | 48 #include "runtime/vframe.hpp" |
48 #include "runtime/vframe_hp.hpp" | 49 #include "runtime/vframe_hp.hpp" |
49 #include "runtime/vmStructs.hpp" | 50 #include "runtime/vmStructs.hpp" |
80 return (oop)result.get_jobject(); | 81 return (oop)result.get_jobject(); |
81 } | 82 } |
82 return NULL; | 83 return NULL; |
83 } | 84 } |
84 | 85 |
85 C2V_VMENTRY(void, initializeConfiguration, (JNIEnv *, jobject, jobject config)) | 86 int CompilerToVM::Data::Klass_vtable_start_offset; |
86 VMStructs::initHotSpotVMConfig(JNIHandles::resolve(config)); | 87 int CompilerToVM::Data::Klass_vtable_length_offset; |
88 | |
89 int CompilerToVM::Data::Method_extra_stack_entries; | |
90 | |
91 address CompilerToVM::Data::SharedRuntime_ic_miss_stub; | |
92 address CompilerToVM::Data::SharedRuntime_handle_wrong_method_stub; | |
93 address CompilerToVM::Data::SharedRuntime_deopt_blob_unpack; | |
94 address CompilerToVM::Data::SharedRuntime_deopt_blob_uncommon_trap; | |
95 | |
96 size_t CompilerToVM::Data::ThreadLocalAllocBuffer_alignment_reserve; | |
97 | |
98 CollectedHeap* CompilerToVM::Data::Universe_collectedHeap; | |
99 int CompilerToVM::Data::Universe_base_vtable_size; | |
100 address CompilerToVM::Data::Universe_narrow_oop_base; | |
101 int CompilerToVM::Data::Universe_narrow_oop_shift; | |
102 address CompilerToVM::Data::Universe_narrow_klass_base; | |
103 int CompilerToVM::Data::Universe_narrow_klass_shift; | |
104 void* CompilerToVM::Data::Universe_non_oop_bits; | |
105 uintptr_t CompilerToVM::Data::Universe_verify_oop_mask; | |
106 uintptr_t CompilerToVM::Data::Universe_verify_oop_bits; | |
107 | |
108 bool CompilerToVM::Data::_supports_inline_contig_alloc; | |
109 HeapWord** CompilerToVM::Data::_heap_end_addr; | |
110 HeapWord** CompilerToVM::Data::_heap_top_addr; | |
111 | |
112 jbyte* CompilerToVM::Data::cardtable_start_address; | |
113 int CompilerToVM::Data::cardtable_shift; | |
114 int CompilerToVM::Data::g1_young_card; | |
115 int CompilerToVM::Data::dirty_card; | |
116 | |
117 int CompilerToVM::Data::vm_page_size; | |
118 | |
119 address CompilerToVM::Data::CodeCache_low_bound; | |
120 address CompilerToVM::Data::CodeCache_high_bound; | |
121 | |
122 address CompilerToVM::Data::dsin; | |
123 address CompilerToVM::Data::dcos; | |
124 address CompilerToVM::Data::dtan; | |
125 address CompilerToVM::Data::dexp; | |
126 address CompilerToVM::Data::dlog; | |
127 address CompilerToVM::Data::dlog10; | |
128 address CompilerToVM::Data::dpow; | |
129 | |
130 void CompilerToVM::Data::initialize(TRAPS) { | |
131 Klass_vtable_start_offset = InstanceKlass::vtable_start_offset() * HeapWordSize; | |
132 Klass_vtable_length_offset = InstanceKlass::vtable_length_offset() * HeapWordSize; | |
133 | |
134 Method_extra_stack_entries = Method::extra_stack_entries(); | |
135 | |
136 SharedRuntime_ic_miss_stub = SharedRuntime::get_ic_miss_stub(); | |
137 SharedRuntime_handle_wrong_method_stub = SharedRuntime::get_handle_wrong_method_stub(); | |
138 SharedRuntime_deopt_blob_unpack = SharedRuntime::deopt_blob()->unpack(); | |
139 SharedRuntime_deopt_blob_uncommon_trap = SharedRuntime::deopt_blob()->uncommon_trap(); | |
140 | |
141 ThreadLocalAllocBuffer_alignment_reserve = ThreadLocalAllocBuffer::alignment_reserve(); | |
142 | |
143 Universe_collectedHeap = Universe::heap(); | |
144 Universe_base_vtable_size = Universe::base_vtable_size(); | |
145 Universe_narrow_oop_base = Universe::narrow_oop_base(); | |
146 Universe_narrow_oop_shift = Universe::narrow_oop_shift(); | |
147 Universe_narrow_klass_base = Universe::narrow_klass_base(); | |
148 Universe_narrow_klass_shift = Universe::narrow_klass_shift(); | |
149 Universe_non_oop_bits = Universe::non_oop_word(); | |
150 Universe_verify_oop_mask = Universe::verify_oop_mask(); | |
151 Universe_verify_oop_bits = Universe::verify_oop_bits(); | |
152 | |
153 _supports_inline_contig_alloc = Universe::heap()->supports_inline_contig_alloc(); | |
154 _heap_end_addr = _supports_inline_contig_alloc ? Universe::heap()->end_addr() : (HeapWord**) -1; | |
155 _heap_top_addr = _supports_inline_contig_alloc ? Universe::heap()->top_addr() : (HeapWord**) -1; | |
156 | |
157 g1_young_card = G1SATBCardTableModRefBS::g1_young_card_val(); | |
158 dirty_card = CardTableModRefBS::dirty_card_val(); | |
159 | |
160 CodeCache_low_bound = CodeCache::low_bound(); | |
161 CodeCache_high_bound = CodeCache::high_bound(); | |
162 | |
163 BarrierSet* bs = Universe::heap()->barrier_set(); | |
164 switch (bs->kind()) { | |
165 case BarrierSet::CardTableModRef: | |
166 case BarrierSet::CardTableExtension: | |
167 case BarrierSet::G1SATBCT: | |
168 case BarrierSet::G1SATBCTLogging: { | |
169 jbyte* base = ((CardTableModRefBS*) bs)->byte_map_base; | |
170 assert(base != 0, "unexpected byte_map_base"); | |
171 cardtable_start_address = base; | |
172 cardtable_shift = CardTableModRefBS::card_shift; | |
173 break; | |
174 } | |
175 case BarrierSet::ModRef: | |
176 cardtable_start_address = 0; | |
177 cardtable_shift = 0; | |
178 // No post barriers | |
179 break; | |
180 default: | |
181 JVMCI_ERROR("Unsupported BarrierSet kind %d", bs->kind()); | |
182 break; | |
183 } | |
184 | |
185 vm_page_size = os::vm_page_size(); | |
186 | |
187 #define SET_TRIGFUNC(name) \ | |
188 name = CAST_FROM_FN_PTR(address, SharedRuntime::name); \ | |
189 | |
190 SET_TRIGFUNC(dsin); | |
191 SET_TRIGFUNC(dcos); | |
192 SET_TRIGFUNC(dtan); | |
193 SET_TRIGFUNC(dexp); | |
194 SET_TRIGFUNC(dlog10); | |
195 SET_TRIGFUNC(dlog); | |
196 SET_TRIGFUNC(dpow); | |
197 | |
198 #undef SET_TRIGFUNC | |
199 } | |
200 | |
201 C2V_VMENTRY(jobjectArray, readConfiguration, (JNIEnv *env)) | |
202 #define BOXED_LONG(name, value) oop name; do { jvalue p; p.j = (jlong) (value); name = java_lang_boxing_object::create(T_LONG, &p, CHECK_NULL);} while(0) | |
203 #define BOXED_DOUBLE(name, value) oop name; do { jvalue p; p.d = (jdouble) (value); name = java_lang_boxing_object::create(T_DOUBLE, &p, CHECK_NULL);} while(0) | |
204 ResourceMark rm; | |
205 HandleMark hm; | |
206 | |
207 CompilerToVM::Data::initialize(CHECK_NULL); | |
208 | |
209 VMField::klass()->initialize(thread); | |
210 VMFlag::klass()->initialize(thread); | |
211 | |
212 int len = VMStructs::localHotSpotVMStructs_count(); | |
213 objArrayHandle vmFields = oopFactory::new_objArray(VMField::klass(), len, CHECK_NULL); | |
214 for (int i = 0; i < len ; i++) { | |
215 VMStructEntry vmField = VMStructs::localHotSpotVMStructs[i]; | |
216 instanceHandle vmFieldObj = InstanceKlass::cast(VMField::klass())->allocate_instance_handle(CHECK_NULL); | |
217 int name_buf_len = strlen(vmField.typeName) + strlen(vmField.fieldName) + 2 /* "::" */; | |
218 char* name_buf = NEW_RESOURCE_ARRAY(char, name_buf_len + 1); | |
219 sprintf(name_buf, "%s::%s", vmField.typeName, vmField.fieldName); | |
220 Handle name = java_lang_String::create_from_str(name_buf, CHECK_NULL); | |
221 Handle type = java_lang_String::create_from_str(vmField.typeString, CHECK_NULL); | |
222 VMField::set_name(vmFieldObj, name()); | |
223 VMField::set_type(vmFieldObj, type()); | |
224 VMField::set_offset(vmFieldObj, vmField.offset); | |
225 VMField::set_address(vmFieldObj, (jlong) vmField.address); | |
226 if (vmField.isStatic && vmField.typeString != NULL) { | |
227 if (strcmp(vmField.typeString, "bool") == 0) { | |
228 BOXED_LONG(value, *(jbyte*) vmField.address); | |
229 VMField::set_value(vmFieldObj, value); | |
230 } else if (strcmp(vmField.typeString, "int") == 0 || | |
231 strcmp(vmField.typeString, "jint") == 0) { | |
232 BOXED_LONG(value, *(jint*) vmField.address); | |
233 VMField::set_value(vmFieldObj, value); | |
234 } else if (strcmp(vmField.typeString, "uint64_t") == 0) { | |
235 BOXED_LONG(value, *(uint64_t*) vmField.address); | |
236 VMField::set_value(vmFieldObj, value); | |
237 } else if (strcmp(vmField.typeString, "address") == 0 || | |
238 strcmp(vmField.typeString, "intptr_t") == 0 || | |
239 strcmp(vmField.typeString, "uintptr_t") == 0 || | |
240 strcmp(vmField.typeString, "size_t") == 0 || | |
241 // All foo* types are addresses. | |
242 vmField.typeString[strlen(vmField.typeString) - 1] == '*') { | |
243 BOXED_LONG(value, *((address*) vmField.address)); | |
244 VMField::set_value(vmFieldObj, value); | |
245 } | |
246 } | |
247 vmFields->obj_at_put(i, vmFieldObj()); | |
248 } | |
249 | |
250 len = VMStructs::localHotSpotVMTypes_count(); | |
251 objArrayHandle vmTypes = oopFactory::new_objArray(SystemDictionary::Object_klass(), len * 2, CHECK_NULL); | |
252 for (int i = 0; i < len ; i++) { | |
253 VMTypeEntry vmType = VMStructs::localHotSpotVMTypes[i]; | |
254 Handle name = java_lang_String::create_from_str(vmType.typeName, CHECK_NULL); | |
255 BOXED_LONG(size, vmType.size); | |
256 vmTypes->obj_at_put(i * 2, name()); | |
257 vmTypes->obj_at_put(i * 2 + 1, size); | |
258 } | |
259 | |
260 int ints_len = VMStructs::localHotSpotVMIntConstants_count(); | |
261 int longs_len = VMStructs::localHotSpotVMLongConstants_count(); | |
262 len = ints_len + longs_len; | |
263 objArrayHandle vmConstants = oopFactory::new_objArray(SystemDictionary::Object_klass(), len * 2, CHECK_NULL); | |
264 int insert = 0; | |
265 for (int i = 0; i < ints_len ; i++) { | |
266 VMIntConstantEntry c = VMStructs::localHotSpotVMIntConstants[i]; | |
267 Handle name = java_lang_String::create_from_str(c.name, CHECK_NULL); | |
268 BOXED_LONG(value, c.value); | |
269 vmConstants->obj_at_put(insert++, name()); | |
270 vmConstants->obj_at_put(insert++, value); | |
271 } | |
272 for (int i = 0; i < longs_len ; i++) { | |
273 VMLongConstantEntry c = VMStructs::localHotSpotVMLongConstants[i]; | |
274 Handle name = java_lang_String::create_from_str(c.name, CHECK_NULL); | |
275 BOXED_LONG(value, c.value); | |
276 vmConstants->obj_at_put(insert++, name()); | |
277 vmConstants->obj_at_put(insert++, value); | |
278 } | |
279 assert(insert == len * 2, "must be"); | |
280 | |
281 len = VMStructs::localHotSpotVMAddresses_count(); | |
282 objArrayHandle vmAddresses = oopFactory::new_objArray(SystemDictionary::Object_klass(), len * 2, CHECK_NULL); | |
283 for (int i = 0; i < len ; i++) { | |
284 VMAddressEntry a = VMStructs::localHotSpotVMAddresses[i]; | |
285 Handle name = java_lang_String::create_from_str(a.name, CHECK_NULL); | |
286 BOXED_LONG(value, a.value); | |
287 vmAddresses->obj_at_put(i * 2, name()); | |
288 vmAddresses->obj_at_put(i * 2 + 1, value); | |
289 } | |
290 | |
291 // The last entry is the null entry. | |
292 len = Flag::numFlags - 1; | |
293 objArrayHandle vmFlags = oopFactory::new_objArray(VMFlag::klass(), len, CHECK_NULL); | |
294 for (int i = 0; i < len; i++) { | |
295 Flag* flag = &Flag::flags[i]; | |
296 instanceHandle vmFlagObj = InstanceKlass::cast(VMFlag::klass())->allocate_instance_handle(CHECK_NULL); | |
297 Handle name = java_lang_String::create_from_str(flag->_name, CHECK_NULL); | |
298 Handle type = java_lang_String::create_from_str(flag->_type, CHECK_NULL); | |
299 VMFlag::set_name(vmFlagObj, name()); | |
300 VMFlag::set_type(vmFlagObj, type()); | |
301 if (flag->is_bool()) { | |
302 BOXED_LONG(value, flag->get_bool()); | |
303 VMFlag::set_value(vmFlagObj, value); | |
304 } else if (flag->is_ccstr()) { | |
305 Handle value = java_lang_String::create_from_str(flag->get_ccstr(), CHECK_NULL); | |
306 VMFlag::set_value(vmFlagObj, value()); | |
307 } else if (flag->is_intx()) { | |
308 BOXED_LONG(value, flag->get_intx()); | |
309 VMFlag::set_value(vmFlagObj, value); | |
310 } else if (flag->is_uint64_t()) { | |
311 BOXED_LONG(value, flag->get_uint64_t()); | |
312 VMFlag::set_value(vmFlagObj, value); | |
313 } else if (flag->is_uintx()) { | |
314 BOXED_LONG(value, flag->get_uintx()); | |
315 VMFlag::set_value(vmFlagObj, value); | |
316 } else if (flag->is_double()) { | |
317 BOXED_DOUBLE(value, flag->get_double()); | |
318 VMFlag::set_value(vmFlagObj, value); | |
319 } else { | |
320 JVMCI_ERROR_NULL("VM flag %s has unsupported type %s", flag->_name, flag->_type); | |
321 } | |
322 vmFlags->obj_at_put(i, vmFlagObj()); | |
323 } | |
324 | |
325 objArrayOop data = oopFactory::new_objArray(SystemDictionary::Object_klass(), 5, CHECK_NULL); | |
326 data->obj_at_put(0, vmFields()); | |
327 data->obj_at_put(1, vmTypes()); | |
328 data->obj_at_put(2, vmConstants()); | |
329 data->obj_at_put(3, vmAddresses()); | |
330 data->obj_at_put(4, vmFlags()); | |
331 | |
332 return (jobjectArray) JNIHandles::make_local(THREAD, data); | |
333 #undef BOXED_LONG | |
334 #undef BOXED_DOUBLE | |
87 C2V_END | 335 C2V_END |
88 | 336 |
89 C2V_VMENTRY(jbyteArray, getBytecode, (JNIEnv *, jobject, jobject jvmci_method)) | 337 C2V_VMENTRY(jbyteArray, getBytecode, (JNIEnv *, jobject, jobject jvmci_method)) |
90 methodHandle method = CompilerToVM::asMethod(jvmci_method); | 338 methodHandle method = CompilerToVM::asMethod(jvmci_method); |
91 ResourceMark rm; | 339 ResourceMark rm; |
1176 #define RESOLVED_METHOD "Ljdk/vm/ci/meta/ResolvedJavaMethod;" | 1424 #define RESOLVED_METHOD "Ljdk/vm/ci/meta/ResolvedJavaMethod;" |
1177 #define HS_RESOLVED_METHOD "Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl;" | 1425 #define HS_RESOLVED_METHOD "Ljdk/vm/ci/hotspot/HotSpotResolvedJavaMethodImpl;" |
1178 #define HS_RESOLVED_KLASS "Ljdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl;" | 1426 #define HS_RESOLVED_KLASS "Ljdk/vm/ci/hotspot/HotSpotResolvedObjectTypeImpl;" |
1179 #define HS_CONSTANT_POOL "Ljdk/vm/ci/hotspot/HotSpotConstantPool;" | 1427 #define HS_CONSTANT_POOL "Ljdk/vm/ci/hotspot/HotSpotConstantPool;" |
1180 #define HS_COMPILED_CODE "Ljdk/vm/ci/hotspot/HotSpotCompiledCode;" | 1428 #define HS_COMPILED_CODE "Ljdk/vm/ci/hotspot/HotSpotCompiledCode;" |
1181 #define HS_CONFIG "Ljdk/vm/ci/hotspot/HotSpotVMConfig;" | |
1182 #define HS_STACK_FRAME_REF "Ljdk/vm/ci/hotspot/HotSpotStackFrameReference;" | 1429 #define HS_STACK_FRAME_REF "Ljdk/vm/ci/hotspot/HotSpotStackFrameReference;" |
1183 #define HS_SPECULATION_LOG "Ljdk/vm/ci/hotspot/HotSpotSpeculationLog;" | 1430 #define HS_SPECULATION_LOG "Ljdk/vm/ci/hotspot/HotSpotSpeculationLog;" |
1184 #define METASPACE_METHOD_DATA "J" | 1431 #define METASPACE_METHOD_DATA "J" |
1185 | 1432 |
1186 JNINativeMethod CompilerToVM::methods[] = { | 1433 JNINativeMethod CompilerToVM::methods[] = { |
1216 {CC"getMaxCallTargetOffset", CC"(J)J", FN_PTR(getMaxCallTargetOffset)}, | 1463 {CC"getMaxCallTargetOffset", CC"(J)J", FN_PTR(getMaxCallTargetOffset)}, |
1217 {CC"getResolvedJavaMethodAtSlot", CC"("CLASS"I)"HS_RESOLVED_METHOD, FN_PTR(getResolvedJavaMethodAtSlot)}, | 1464 {CC"getResolvedJavaMethodAtSlot", CC"("CLASS"I)"HS_RESOLVED_METHOD, FN_PTR(getResolvedJavaMethodAtSlot)}, |
1218 {CC"getResolvedJavaMethod", CC"(Ljava/lang/Object;J)"HS_RESOLVED_METHOD, FN_PTR(getResolvedJavaMethod)}, | 1465 {CC"getResolvedJavaMethod", CC"(Ljava/lang/Object;J)"HS_RESOLVED_METHOD, FN_PTR(getResolvedJavaMethod)}, |
1219 {CC"getConstantPool", CC"(Ljava/lang/Object;J)"HS_CONSTANT_POOL, FN_PTR(getConstantPool)}, | 1466 {CC"getConstantPool", CC"(Ljava/lang/Object;J)"HS_CONSTANT_POOL, FN_PTR(getConstantPool)}, |
1220 {CC"getResolvedJavaType", CC"(Ljava/lang/Object;JZ)"HS_RESOLVED_KLASS, FN_PTR(getResolvedJavaType)}, | 1467 {CC"getResolvedJavaType", CC"(Ljava/lang/Object;JZ)"HS_RESOLVED_KLASS, FN_PTR(getResolvedJavaType)}, |
1221 {CC"initializeConfiguration", CC"("HS_CONFIG")V", FN_PTR(initializeConfiguration)}, | 1468 {CC"readConfiguration", CC"()[Ljava/lang/Object;", FN_PTR(readConfiguration)}, |
1222 {CC"installCode", CC"("TARGET_DESCRIPTION HS_COMPILED_CODE INSTALLED_CODE HS_SPECULATION_LOG")I", FN_PTR(installCode)}, | 1469 {CC"installCode", CC"("TARGET_DESCRIPTION HS_COMPILED_CODE INSTALLED_CODE HS_SPECULATION_LOG")I", FN_PTR(installCode)}, |
1223 {CC"resetCompilationStatistics", CC"()V", FN_PTR(resetCompilationStatistics)}, | 1470 {CC"resetCompilationStatistics", CC"()V", FN_PTR(resetCompilationStatistics)}, |
1224 {CC"disassembleCodeBlob", CC"("INSTALLED_CODE")"STRING, FN_PTR(disassembleCodeBlob)}, | 1471 {CC"disassembleCodeBlob", CC"("INSTALLED_CODE")"STRING, FN_PTR(disassembleCodeBlob)}, |
1225 {CC"executeInstalledCode", CC"(["OBJECT INSTALLED_CODE")"OBJECT, FN_PTR(executeInstalledCode)}, | 1472 {CC"executeInstalledCode", CC"(["OBJECT INSTALLED_CODE")"OBJECT, FN_PTR(executeInstalledCode)}, |
1226 {CC"getLineNumberTable", CC"("HS_RESOLVED_METHOD")[J", FN_PTR(getLineNumberTable)}, | 1473 {CC"getLineNumberTable", CC"("HS_RESOLVED_METHOD")[J", FN_PTR(getLineNumberTable)}, |