488 else if (sig == SIGFPE && info->si_code == FPE_FLTDIV) {
489 // floating-point divide by zero
490 stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_DIVIDE_BY_ZERO);
491 }
492 #ifdef COMPILER2
493 else if (sig == SIGILL && nativeInstruction_at(pc)->is_ic_miss_trap()) {
494 #ifdef ASSERT
495 #ifdef TIERED
496 CodeBlob* cb = CodeCache::find_blob_unsafe(pc);
497 assert(cb->is_compiled_by_c2(), "Wrong compiler");
498 #endif // TIERED
499 #endif // ASSERT
500 // Inline cache missed and user trap "Tne G0+ST_RESERVED_FOR_USER_0+2" taken.
501 stub = SharedRuntime::get_ic_miss_stub();
502 // At the stub it needs to look like a call from the caller of this
503 // method (not a call from the segv site).
504 pc = (address)uc->uc_mcontext.gregs[REG_O7];
505 }
506 #endif // COMPILER2
507
508 else if (sig == SIGSEGV && info->si_code > 0 && !MacroAssembler::needs_explicit_null_check((intptr_t)info->si_addr)) {
509 // Determination of interpreter/vtable stub/compiled code null exception
510 stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
511 }
512 }
513
514 // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks in
515 // and the heap gets shrunk before the field access.
516 if ((sig == SIGSEGV) || (sig == SIGBUS)) {
517 address addr = JNI_FastGetField::find_slowcase_pc(pc);
518 if (addr != (address)-1) {
519 stub = addr;
520 }
521 }
522
523 // Check to see if we caught the safepoint code in the
524 // process of write protecting the memory serialization page.
525 // It write enables the page immediately after protecting it
526 // so just return.
527 if ((sig == SIGSEGV) &&
528 os::is_memory_serialize_page(thread, (address)info->si_addr)) {
|
488 else if (sig == SIGFPE && info->si_code == FPE_FLTDIV) {
489 // floating-point divide by zero
490 stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_DIVIDE_BY_ZERO);
491 }
492 #ifdef COMPILER2
493 else if (sig == SIGILL && nativeInstruction_at(pc)->is_ic_miss_trap()) {
494 #ifdef ASSERT
495 #ifdef TIERED
496 CodeBlob* cb = CodeCache::find_blob_unsafe(pc);
497 assert(cb->is_compiled_by_c2(), "Wrong compiler");
498 #endif // TIERED
499 #endif // ASSERT
500 // Inline cache missed and user trap "Tne G0+ST_RESERVED_FOR_USER_0+2" taken.
501 stub = SharedRuntime::get_ic_miss_stub();
502 // At the stub it needs to look like a call from the caller of this
503 // method (not a call from the segv site).
504 pc = (address)uc->uc_mcontext.gregs[REG_O7];
505 }
506 #endif // COMPILER2
507
508 else if (sig == SIGSEGV && info->si_code > 0 && MacroAssembler::uses_implicit_null_check((void*)info->si_addr)) {
509 // Determination of interpreter/vtable stub/compiled code null exception
510 stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
511 }
512 }
513
514 // jni_fast_Get<Primitive>Field can trap at certain pc's if a GC kicks in
515 // and the heap gets shrunk before the field access.
516 if ((sig == SIGSEGV) || (sig == SIGBUS)) {
517 address addr = JNI_FastGetField::find_slowcase_pc(pc);
518 if (addr != (address)-1) {
519 stub = addr;
520 }
521 }
522
523 // Check to see if we caught the safepoint code in the
524 // process of write protecting the memory serialization page.
525 // It write enables the page immediately after protecting it
526 // so just return.
527 if ((sig == SIGSEGV) &&
528 os::is_memory_serialize_page(thread, (address)info->si_addr)) {
|