560 assert(_debug_recorder->pcs_length() >= 2, "must be at least 2"); |
560 assert(_debug_recorder->pcs_length() >= 2, "must be at least 2"); |
561 |
561 |
562 metadata.set_pc_desc(_debug_recorder->pcs(), _debug_recorder->pcs_length()); |
562 metadata.set_pc_desc(_debug_recorder->pcs(), _debug_recorder->pcs_length()); |
563 metadata.set_scopes(_debug_recorder->stream()->buffer(), _debug_recorder->data_size()); |
563 metadata.set_scopes(_debug_recorder->stream()->buffer(), _debug_recorder->data_size()); |
564 metadata.set_exception_table(&_exception_handler_table); |
564 metadata.set_exception_table(&_exception_handler_table); |
|
565 metadata.set_implicit_exception_table(&_implicit_exception_table); |
565 |
566 |
566 RelocBuffer* reloc_buffer = metadata.get_reloc_buffer(); |
567 RelocBuffer* reloc_buffer = metadata.get_reloc_buffer(); |
567 |
568 |
568 reloc_buffer->ensure_size(buffer.total_relocation_size()); |
569 reloc_buffer->ensure_size(buffer.total_relocation_size()); |
569 size_t size = (size_t) buffer.copy_relocations_to(reloc_buffer->begin(), (CodeBuffer::csize_t) reloc_buffer->size(), true); |
570 size_t size = (size_t) buffer.copy_relocations_to(reloc_buffer->begin(), (CodeBuffer::csize_t) reloc_buffer->size(), true); |
635 } |
636 } |
636 |
637 |
637 JVMCIObject mirror = installed_code; |
638 JVMCIObject mirror = installed_code; |
638 nmethod* nm = NULL; |
639 nmethod* nm = NULL; |
639 result = runtime()->register_method(jvmci_env(), method, nm, entry_bci, &_offsets, _orig_pc_offset, &buffer, |
640 result = runtime()->register_method(jvmci_env(), method, nm, entry_bci, &_offsets, _orig_pc_offset, &buffer, |
640 stack_slots, _debug_recorder->_oopmaps, &_exception_handler_table, |
641 stack_slots, _debug_recorder->_oopmaps, &_exception_handler_table, &_implicit_exception_table, |
641 compiler, _debug_recorder, _dependencies, id, |
642 compiler, _debug_recorder, _dependencies, id, |
642 has_unsafe_access, _has_wide_vector, compiled_code, mirror, |
643 has_unsafe_access, _has_wide_vector, compiled_code, mirror, |
643 failed_speculations, speculations, speculations_len); |
644 failed_speculations, speculations, speculations_len); |
644 cb = nm->as_codeblob_or_null(); |
645 cb = nm->as_codeblob_or_null(); |
645 if (nm != NULL && compile_state == NULL) { |
646 if (nm != NULL && compile_state == NULL) { |
867 JVMCIENV->equals(reason, jvmci_env()->get_site_InfopointReason_IMPLICIT_EXCEPTION())) { |
868 JVMCIENV->equals(reason, jvmci_env()->get_site_InfopointReason_IMPLICIT_EXCEPTION())) { |
868 TRACE_jvmci_4("safepoint at %i", pc_offset); |
869 TRACE_jvmci_4("safepoint at %i", pc_offset); |
869 site_Safepoint(buffer, pc_offset, site, JVMCI_CHECK_OK); |
870 site_Safepoint(buffer, pc_offset, site, JVMCI_CHECK_OK); |
870 if (_orig_pc_offset < 0) { |
871 if (_orig_pc_offset < 0) { |
871 JVMCI_ERROR_OK("method contains safepoint, but has no deopt rescue slot"); |
872 JVMCI_ERROR_OK("method contains safepoint, but has no deopt rescue slot"); |
|
873 } |
|
874 if (JVMCIENV->equals(reason, jvmci_env()->get_site_InfopointReason_IMPLICIT_EXCEPTION())) { |
|
875 TRACE_jvmci_4("implicit exception at %i", pc_offset); |
|
876 _implicit_exception_table.add_deoptimize(pc_offset); |
872 } |
877 } |
873 } else { |
878 } else { |
874 TRACE_jvmci_4("infopoint at %i", pc_offset); |
879 TRACE_jvmci_4("infopoint at %i", pc_offset); |
875 site_Infopoint(buffer, pc_offset, site, JVMCI_CHECK_OK); |
880 site_Infopoint(buffer, pc_offset, site, JVMCI_CHECK_OK); |
876 } |
881 } |