Mercurial > hg > graal-compiler
comparison src/share/vm/graal/graalCodeInstaller.cpp @ 6674:fd71ca8c5f88
VM infrstructure for OnStackReplacement
author | Lukas Stadler <lukas.stadler@jku.at> |
---|---|
date | Wed, 07 Nov 2012 13:18:04 +0100 |
parents | d5f7e737827f |
children | e522a00b91aa |
comparison
equal
deleted
inserted
replaced
6673:a52320a6bbda | 6674:fd71ca8c5f88 |
---|---|
245 void CodeInstaller::initialize_assumptions(oop target_method) { | 245 void CodeInstaller::initialize_assumptions(oop target_method) { |
246 _oop_recorder = new OopRecorder(_env->arena()); | 246 _oop_recorder = new OopRecorder(_env->arena()); |
247 _env->set_oop_recorder(_oop_recorder); | 247 _env->set_oop_recorder(_oop_recorder); |
248 _env->set_dependencies(_dependencies); | 248 _env->set_dependencies(_dependencies); |
249 _dependencies = new Dependencies(_env); | 249 _dependencies = new Dependencies(_env); |
250 Handle assumptions_handle = InstalledCode::assumptions(HotSpotCompilationResult::comp(target_method)); | 250 Handle assumptions_handle = CompilationResult::assumptions(HotSpotCompilationResult::comp(target_method)); |
251 if (!assumptions_handle.is_null()) { | 251 if (!assumptions_handle.is_null()) { |
252 objArrayHandle assumptions(Thread::current(), (objArrayOop)Assumptions::list(assumptions_handle())); | 252 objArrayHandle assumptions(Thread::current(), (objArrayOop)Assumptions::list(assumptions_handle())); |
253 int length = assumptions->length(); | 253 int length = assumptions->length(); |
254 for (int i = 0; i < length; ++i) { | 254 for (int i = 0; i < length; ++i) { |
255 Handle assumption = assumptions->obj_at(i); | 255 Handle assumption = assumptions->obj_at(i); |
273 CodeInstaller::CodeInstaller(Handle& comp_result, nmethod*& nm, bool install_code) { | 273 CodeInstaller::CodeInstaller(Handle& comp_result, nmethod*& nm, bool install_code) { |
274 _env = CURRENT_ENV; | 274 _env = CURRENT_ENV; |
275 GraalCompiler::initialize_buffer_blob(); | 275 GraalCompiler::initialize_buffer_blob(); |
276 CodeBuffer buffer(JavaThread::current()->get_buffer_blob()); | 276 CodeBuffer buffer(JavaThread::current()->get_buffer_blob()); |
277 jobject comp_result_obj = JNIHandles::make_local(comp_result()); | 277 jobject comp_result_obj = JNIHandles::make_local(comp_result()); |
278 jint entry_bci = HotSpotCompilationResult::entryBCI(comp_result); | |
278 initialize_assumptions(JNIHandles::resolve(comp_result_obj)); | 279 initialize_assumptions(JNIHandles::resolve(comp_result_obj)); |
279 | 280 |
280 { | 281 { |
281 No_Safepoint_Verifier no_safepoint; | 282 No_Safepoint_Verifier no_safepoint; |
282 initialize_fields(JNIHandles::resolve(comp_result_obj)); | 283 initialize_fields(JNIHandles::resolve(comp_result_obj)); |
285 } | 286 } |
286 | 287 |
287 int stack_slots = _total_frame_size / HeapWordSize; // conversion to words | 288 int stack_slots = _total_frame_size / HeapWordSize; // conversion to words |
288 methodHandle method = getMethodFromHotSpotMethod(HotSpotCompilationResult::method(JNIHandles::resolve(comp_result_obj))); | 289 methodHandle method = getMethodFromHotSpotMethod(HotSpotCompilationResult::method(JNIHandles::resolve(comp_result_obj))); |
289 | 290 |
290 nm = GraalEnv::register_method(method, -1, &_offsets, _custom_stack_area_offset, &buffer, stack_slots, _debug_recorder->_oopmaps, &_exception_handler_table, | 291 nm = GraalEnv::register_method(method, entry_bci, &_offsets, _custom_stack_area_offset, &buffer, stack_slots, _debug_recorder->_oopmaps, &_exception_handler_table, |
291 &_implicit_exception_table, GraalCompiler::instance(), _debug_recorder, _dependencies, NULL, -1, true, false, install_code); | 292 &_implicit_exception_table, GraalCompiler::instance(), _debug_recorder, _dependencies, NULL, -1, true, false, install_code); |
292 | 293 |
293 method->clear_queued_for_compilation(); | 294 method->clear_queued_for_compilation(); |
294 } | 295 } |
295 | 296 |
324 } | 325 } |
325 _name = HotSpotCompilationResult::name(comp_result); | 326 _name = HotSpotCompilationResult::name(comp_result); |
326 _sites = (arrayOop) HotSpotCompilationResult::sites(comp_result); | 327 _sites = (arrayOop) HotSpotCompilationResult::sites(comp_result); |
327 _exception_handlers = (arrayOop) HotSpotCompilationResult::exceptionHandlers(comp_result); | 328 _exception_handlers = (arrayOop) HotSpotCompilationResult::exceptionHandlers(comp_result); |
328 | 329 |
329 _code = (arrayOop) InstalledCode::targetCode(_comp_result); | 330 _code = (arrayOop) CompilationResult::targetCode(_comp_result); |
330 _code_size = InstalledCode::targetCodeSize(_comp_result); | 331 _code_size = CompilationResult::targetCodeSize(_comp_result); |
331 // The frame size we get from the target method does not include the return address, so add one word for it here. | 332 // The frame size we get from the target method does not include the return address, so add one word for it here. |
332 _total_frame_size = InstalledCode::frameSize(_comp_result) + HeapWordSize; | 333 _total_frame_size = CompilationResult::frameSize(_comp_result) + HeapWordSize; |
333 _custom_stack_area_offset = InstalledCode::customStackAreaOffset(_comp_result); | 334 _custom_stack_area_offset = CompilationResult::customStackAreaOffset(_comp_result); |
334 | 335 |
335 // (very) conservative estimate: each site needs a constant section entry | 336 // (very) conservative estimate: each site needs a constant section entry |
336 _constants_size = _sites->length() * (BytesPerLong*2); | 337 _constants_size = _sites->length() * (BytesPerLong*2); |
337 _total_size = align_size_up(_code_size, HeapWordSize) + _constants_size; | 338 _total_size = align_size_up(_code_size, HeapWordSize) + _constants_size; |
338 | 339 |
361 _instructions->set_end(_instructions->start() + _code_size); | 362 _instructions->set_end(_instructions->start() + _code_size); |
362 | 363 |
363 oop* sites = (oop*) _sites->base(T_OBJECT); | 364 oop* sites = (oop*) _sites->base(T_OBJECT); |
364 for (int i = 0; i < _sites->length(); i++) { | 365 for (int i = 0; i < _sites->length(); i++) { |
365 oop site = sites[i]; | 366 oop site = sites[i]; |
366 jint pc_offset = InstalledCode_Site::pcOffset(site); | 367 jint pc_offset = CompilationResult_Site::pcOffset(site); |
367 | 368 |
368 if (site->is_a(InstalledCode_Call::klass())) { | 369 if (site->is_a(CompilationResult_Call::klass())) { |
369 TRACE_graal_4("call at %i", pc_offset); | 370 TRACE_graal_4("call at %i", pc_offset); |
370 site_Call(buffer, pc_offset, site); | 371 site_Call(buffer, pc_offset, site); |
371 } else if (site->is_a(InstalledCode_Safepoint::klass())) { | 372 } else if (site->is_a(CompilationResult_Safepoint::klass())) { |
372 TRACE_graal_4("safepoint at %i", pc_offset); | 373 TRACE_graal_4("safepoint at %i", pc_offset); |
373 site_Safepoint(buffer, pc_offset, site); | 374 site_Safepoint(buffer, pc_offset, site); |
374 } else if (site->is_a(InstalledCode_DataPatch::klass())) { | 375 } else if (site->is_a(CompilationResult_DataPatch::klass())) { |
375 TRACE_graal_4("datapatch at %i", pc_offset); | 376 TRACE_graal_4("datapatch at %i", pc_offset); |
376 site_DataPatch(buffer, pc_offset, site); | 377 site_DataPatch(buffer, pc_offset, site); |
377 } else if (site->is_a(InstalledCode_Mark::klass())) { | 378 } else if (site->is_a(CompilationResult_Mark::klass())) { |
378 TRACE_graal_4("mark at %i", pc_offset); | 379 TRACE_graal_4("mark at %i", pc_offset); |
379 site_Mark(buffer, pc_offset, site); | 380 site_Mark(buffer, pc_offset, site); |
380 } else { | 381 } else { |
381 fatal("unexpected Site subclass"); | 382 fatal("unexpected Site subclass"); |
382 } | 383 } |
424 | 425 |
425 if (_exception_handlers != NULL) { | 426 if (_exception_handlers != NULL) { |
426 oop* exception_handlers = (oop*) _exception_handlers->base(T_OBJECT); | 427 oop* exception_handlers = (oop*) _exception_handlers->base(T_OBJECT); |
427 for (int i = 0; i < _exception_handlers->length(); i++) { | 428 for (int i = 0; i < _exception_handlers->length(); i++) { |
428 oop exc = exception_handlers[i]; | 429 oop exc = exception_handlers[i]; |
429 jint pc_offset = InstalledCode_Site::pcOffset(exc); | 430 jint pc_offset = CompilationResult_Site::pcOffset(exc); |
430 jint handler_offset = InstalledCode_ExceptionHandler::handlerPos(exc); | 431 jint handler_offset = CompilationResult_ExceptionHandler::handlerPos(exc); |
431 | 432 |
432 // Subtable header | 433 // Subtable header |
433 _exception_handler_table.add_entry(HandlerTableEntry(1, pc_offset, 0)); | 434 _exception_handler_table.add_entry(HandlerTableEntry(1, pc_offset, 0)); |
434 | 435 |
435 // Subtable entry | 436 // Subtable entry |
515 | 516 |
516 _debug_recorder->describe_scope(pc_offset, method, NULL, bci, reexecute, throw_exception, false, false, locals_token, expressions_token, monitors_token); | 517 _debug_recorder->describe_scope(pc_offset, method, NULL, bci, reexecute, throw_exception, false, false, locals_token, expressions_token, monitors_token); |
517 } | 518 } |
518 | 519 |
519 void CodeInstaller::site_Safepoint(CodeBuffer& buffer, jint pc_offset, oop site) { | 520 void CodeInstaller::site_Safepoint(CodeBuffer& buffer, jint pc_offset, oop site) { |
520 oop debug_info = InstalledCode_Safepoint::debugInfo(site); | 521 oop debug_info = CompilationResult_Safepoint::debugInfo(site); |
521 assert(debug_info != NULL, "debug info expected"); | 522 assert(debug_info != NULL, "debug info expected"); |
522 | 523 |
523 // address instruction = _instructions->start() + pc_offset; | 524 // address instruction = _instructions->start() + pc_offset; |
524 // jint next_pc_offset = Assembler::locate_next_instruction(instruction) - _instructions->start(); | 525 // jint next_pc_offset = Assembler::locate_next_instruction(instruction) - _instructions->start(); |
525 _debug_recorder->add_safepoint(pc_offset, -1, create_oop_map(_total_frame_size, _parameter_count, debug_info)); | 526 _debug_recorder->add_safepoint(pc_offset, -1, create_oop_map(_total_frame_size, _parameter_count, debug_info)); |
529 | 530 |
530 _debug_recorder->end_safepoint(pc_offset); | 531 _debug_recorder->end_safepoint(pc_offset); |
531 } | 532 } |
532 | 533 |
533 void CodeInstaller::site_Call(CodeBuffer& buffer, jint pc_offset, oop site) { | 534 void CodeInstaller::site_Call(CodeBuffer& buffer, jint pc_offset, oop site) { |
534 oop target = InstalledCode_Call::target(site); | 535 oop target = CompilationResult_Call::target(site); |
535 instanceKlass* target_klass = instanceKlass::cast(target->klass()); | 536 instanceKlass* target_klass = instanceKlass::cast(target->klass()); |
536 | 537 |
537 oop hotspot_method = NULL; // JavaMethod | 538 oop hotspot_method = NULL; // JavaMethod |
538 oop global_stub = NULL; | 539 oop global_stub = NULL; |
539 | 540 |
541 global_stub = target; | 542 global_stub = target; |
542 } else { | 543 } else { |
543 hotspot_method = target; | 544 hotspot_method = target; |
544 } | 545 } |
545 | 546 |
546 oop debug_info = InstalledCode_Call::debugInfo(site); | 547 oop debug_info = CompilationResult_Call::debugInfo(site); |
547 | 548 |
548 assert((hotspot_method ? 1 : 0) + (global_stub ? 1 : 0) == 1, "Call site needs exactly one type"); | 549 assert((hotspot_method ? 1 : 0) + (global_stub ? 1 : 0) == 1, "Call site needs exactly one type"); |
549 | 550 |
550 NativeInstruction* inst = nativeInstruction_at(_instructions->start() + pc_offset); | 551 NativeInstruction* inst = nativeInstruction_at(_instructions->start() + pc_offset); |
551 jint next_pc_offset = 0x0; | 552 jint next_pc_offset = 0x0; |
657 _debug_recorder->end_safepoint(next_pc_offset); | 658 _debug_recorder->end_safepoint(next_pc_offset); |
658 } | 659 } |
659 } | 660 } |
660 | 661 |
661 void CodeInstaller::site_DataPatch(CodeBuffer& buffer, jint pc_offset, oop site) { | 662 void CodeInstaller::site_DataPatch(CodeBuffer& buffer, jint pc_offset, oop site) { |
662 oop constant = InstalledCode_DataPatch::constant(site); | 663 oop constant = CompilationResult_DataPatch::constant(site); |
663 int alignment = InstalledCode_DataPatch::alignment(site); | 664 int alignment = CompilationResult_DataPatch::alignment(site); |
664 oop kind = Constant::kind(constant); | 665 oop kind = Constant::kind(constant); |
665 | 666 |
666 address instruction = _instructions->start() + pc_offset; | 667 address instruction = _instructions->start() + pc_offset; |
667 | 668 |
668 char typeChar = Kind::typeChar(kind); | 669 char typeChar = Kind::typeChar(kind); |
721 break; | 722 break; |
722 } | 723 } |
723 } | 724 } |
724 | 725 |
725 void CodeInstaller::site_Mark(CodeBuffer& buffer, jint pc_offset, oop site) { | 726 void CodeInstaller::site_Mark(CodeBuffer& buffer, jint pc_offset, oop site) { |
726 oop id_obj = InstalledCode_Mark::id(site); | 727 oop id_obj = CompilationResult_Mark::id(site); |
727 arrayOop references = (arrayOop) InstalledCode_Mark::references(site); | 728 arrayOop references = (arrayOop) CompilationResult_Mark::references(site); |
728 | 729 |
729 if (id_obj != NULL) { | 730 if (id_obj != NULL) { |
730 assert(java_lang_boxing_object::is_instance(id_obj, T_INT), "Integer id expected"); | 731 assert(java_lang_boxing_object::is_instance(id_obj, T_INT), "Integer id expected"); |
731 jint id = id_obj->int_field(java_lang_boxing_object::value_offset_in_bytes(T_INT)); | 732 jint id = id_obj->int_field(java_lang_boxing_object::value_offset_in_bytes(T_INT)); |
732 | 733 |
749 _offsets.set_value(CodeOffsets::Deopt, pc_offset); | 750 _offsets.set_value(CodeOffsets::Deopt, pc_offset); |
750 break; | 751 break; |
751 case MARK_STATIC_CALL_STUB: { | 752 case MARK_STATIC_CALL_STUB: { |
752 assert(references->length() == 1, "static call stub needs one reference"); | 753 assert(references->length() == 1, "static call stub needs one reference"); |
753 oop ref = ((oop*) references->base(T_OBJECT))[0]; | 754 oop ref = ((oop*) references->base(T_OBJECT))[0]; |
754 address call_pc = _instructions->start() + InstalledCode_Site::pcOffset(ref); | 755 address call_pc = _instructions->start() + CompilationResult_Site::pcOffset(ref); |
755 _instructions->relocate(instruction, static_stub_Relocation::spec(call_pc)); | 756 _instructions->relocate(instruction, static_stub_Relocation::spec(call_pc)); |
756 _instructions->relocate(instruction, oop_Relocation::spec_for_immediate(), Assembler::imm_operand); | 757 _instructions->relocate(instruction, oop_Relocation::spec_for_immediate(), Assembler::imm_operand); |
757 break; | 758 break; |
758 } | 759 } |
759 case MARK_INVOKEVIRTUAL: | 760 case MARK_INVOKEVIRTUAL: |
803 assert(*byte_skip == 5, "unexpected byte_skip"); | 804 assert(*byte_skip == 5, "unexpected byte_skip"); |
804 | 805 |
805 assert(references->length() == 2, "MARK_KLASS_PATCHING/MARK_ACCESS_FIELD_PATCHING needs 2 references"); | 806 assert(references->length() == 2, "MARK_KLASS_PATCHING/MARK_ACCESS_FIELD_PATCHING needs 2 references"); |
806 oop ref1 = ((oop*) references->base(T_OBJECT))[0]; | 807 oop ref1 = ((oop*) references->base(T_OBJECT))[0]; |
807 oop ref2 = ((oop*) references->base(T_OBJECT))[1]; | 808 oop ref2 = ((oop*) references->base(T_OBJECT))[1]; |
808 int i_byte_count = InstalledCode_Site::pcOffset(ref2) - InstalledCode_Site::pcOffset(ref1); | 809 int i_byte_count = CompilationResult_Site::pcOffset(ref2) - CompilationResult_Site::pcOffset(ref1); |
809 assert(i_byte_count == (unsigned char)i_byte_count, "invalid offset"); | 810 assert(i_byte_count == (unsigned char)i_byte_count, "invalid offset"); |
810 *byte_count = i_byte_count; | 811 *byte_count = i_byte_count; |
811 *being_initialized_entry_offset = *byte_count + *byte_skip; | 812 *being_initialized_entry_offset = *byte_count + *byte_skip; |
812 | 813 |
813 // we need to correct the offset of a field access - it's created with MAX_INT to ensure the correct size, and hotspot expects 0 | 814 // we need to correct the offset of a field access - it's created with MAX_INT to ensure the correct size, and hotspot expects 0 |
814 if (id == MARK_ACCESS_FIELD_PATCHING) { | 815 if (id == MARK_ACCESS_FIELD_PATCHING) { |
815 NativeMovRegMem* inst = nativeMovRegMem_at(_instructions->start() + InstalledCode_Site::pcOffset(ref1)); | 816 NativeMovRegMem* inst = nativeMovRegMem_at(_instructions->start() + CompilationResult_Site::pcOffset(ref1)); |
816 assert(inst->offset() == max_jint, "unexpected offset value"); | 817 assert(inst->offset() == max_jint, "unexpected offset value"); |
817 inst->set_offset(0); | 818 inst->set_offset(0); |
818 } | 819 } |
819 break; | 820 break; |
820 } | 821 } |