401 // Info->si_addr only points to the page base address, so we
402 // must extract the real si_addr from the instruction and the
403 // ucontext.
404 assert(((NativeInstruction*)pc)->is_safepoint_poll(), "must be safepoint poll");
405 const address real_si_addr = ((NativeInstruction*)pc)->get_poll_address(uc);
406 }
407
408 // SIGTRAP-based implicit null check in compiled code.
409 else if ((sig == SIGFPE) &&
410 TrapBasedNullChecks &&
411 (trap_pc != NULL) &&
412 Assembler::is_sigtrap_zero_check(trap_pc)) {
413 if (TraceTraps) {
414 tty->print_cr("trap: NULL_CHECK at " INTPTR_FORMAT " (SIGFPE)", p2i(trap_pc));
415 }
416 stub = SharedRuntime::continuation_for_implicit_exception(thread, trap_pc, SharedRuntime::IMPLICIT_NULL);
417 }
418
419 else if (sig == SIGSEGV && ImplicitNullChecks &&
420 CodeCache::contains((void*) pc) &&
421 !MacroAssembler::needs_explicit_null_check((intptr_t) info->si_addr)) {
422 if (TraceTraps) {
423 tty->print_cr("trap: null_check at " INTPTR_FORMAT " (SIGSEGV)", p2i(pc));
424 }
425 stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
426 }
427
428 // SIGTRAP-based implicit range check in compiled code.
429 else if (sig == SIGFPE && TrapBasedRangeChecks &&
430 (trap_pc != NULL) &&
431 Assembler::is_sigtrap_range_check(trap_pc)) {
432 if (TraceTraps) {
433 tty->print_cr("trap: RANGE_CHECK at " INTPTR_FORMAT " (SIGFPE)", p2i(trap_pc));
434 }
435 stub = SharedRuntime::continuation_for_implicit_exception(thread, trap_pc, SharedRuntime::IMPLICIT_NULL);
436 }
437
438 else if (sig == SIGFPE && info->si_code == FPE_INTDIV) {
439 stub = SharedRuntime::continuation_for_implicit_exception(thread, trap_pc, SharedRuntime::IMPLICIT_DIVIDE_BY_ZERO);
440 }
441
|
401 // Info->si_addr only points to the page base address, so we
402 // must extract the real si_addr from the instruction and the
403 // ucontext.
404 assert(((NativeInstruction*)pc)->is_safepoint_poll(), "must be safepoint poll");
405 const address real_si_addr = ((NativeInstruction*)pc)->get_poll_address(uc);
406 }
407
408 // SIGTRAP-based implicit null check in compiled code.
409 else if ((sig == SIGFPE) &&
410 TrapBasedNullChecks &&
411 (trap_pc != NULL) &&
412 Assembler::is_sigtrap_zero_check(trap_pc)) {
413 if (TraceTraps) {
414 tty->print_cr("trap: NULL_CHECK at " INTPTR_FORMAT " (SIGFPE)", p2i(trap_pc));
415 }
416 stub = SharedRuntime::continuation_for_implicit_exception(thread, trap_pc, SharedRuntime::IMPLICIT_NULL);
417 }
418
419 else if (sig == SIGSEGV && ImplicitNullChecks &&
420 CodeCache::contains((void*) pc) &&
421 MacroAssembler::uses_implicit_null_check(info->si_addr)) {
422 if (TraceTraps) {
423 tty->print_cr("trap: null_check at " INTPTR_FORMAT " (SIGSEGV)", p2i(pc));
424 }
425 stub = SharedRuntime::continuation_for_implicit_exception(thread, pc, SharedRuntime::IMPLICIT_NULL);
426 }
427
428 // SIGTRAP-based implicit range check in compiled code.
429 else if (sig == SIGFPE && TrapBasedRangeChecks &&
430 (trap_pc != NULL) &&
431 Assembler::is_sigtrap_range_check(trap_pc)) {
432 if (TraceTraps) {
433 tty->print_cr("trap: RANGE_CHECK at " INTPTR_FORMAT " (SIGFPE)", p2i(trap_pc));
434 }
435 stub = SharedRuntime::continuation_for_implicit_exception(thread, trap_pc, SharedRuntime::IMPLICIT_NULL);
436 }
437
438 else if (sig == SIGFPE && info->si_code == FPE_INTDIV) {
439 stub = SharedRuntime::continuation_for_implicit_exception(thread, trap_pc, SharedRuntime::IMPLICIT_DIVIDE_BY_ZERO);
440 }
441
|