hotspot/src/share/vm/runtime/sharedRuntime.cpp
changeset 33148 68fa8b6c4340
parent 33105 294e48b4f704
child 33208 5ec6ffa63c57
child 33198 b37ad9fbf681
equal deleted inserted replaced
33146:77349b58b4c0 33148:68fa8b6c4340
    62 #include "utilities/xmlstream.hpp"
    62 #include "utilities/xmlstream.hpp"
    63 #ifdef COMPILER1
    63 #ifdef COMPILER1
    64 #include "c1/c1_Runtime1.hpp"
    64 #include "c1/c1_Runtime1.hpp"
    65 #endif
    65 #endif
    66 
    66 
    67 PRAGMA_FORMAT_MUTE_WARNINGS_FOR_GCC
       
    68 
       
    69 // Shared stub locations
    67 // Shared stub locations
    70 RuntimeStub*        SharedRuntime::_wrong_method_blob;
    68 RuntimeStub*        SharedRuntime::_wrong_method_blob;
    71 RuntimeStub*        SharedRuntime::_wrong_method_abstract_blob;
    69 RuntimeStub*        SharedRuntime::_wrong_method_abstract_blob;
    72 RuntimeStub*        SharedRuntime::_ic_miss_blob;
    70 RuntimeStub*        SharedRuntime::_ic_miss_blob;
    73 RuntimeStub*        SharedRuntime::_resolve_opt_virtual_call_blob;
    71 RuntimeStub*        SharedRuntime::_resolve_opt_virtual_call_blob;
   181 void SharedRuntime::print_ic_miss_histogram() {
   179 void SharedRuntime::print_ic_miss_histogram() {
   182   if (ICMissHistogram) {
   180   if (ICMissHistogram) {
   183     tty->print_cr("IC Miss Histogram:");
   181     tty->print_cr("IC Miss Histogram:");
   184     int tot_misses = 0;
   182     int tot_misses = 0;
   185     for (int i = 0; i < _ICmiss_index; i++) {
   183     for (int i = 0; i < _ICmiss_index; i++) {
   186       tty->print_cr("  at: " INTPTR_FORMAT "  nof: %d", _ICmiss_at[i], _ICmiss_count[i]);
   184       tty->print_cr("  at: " INTPTR_FORMAT "  nof: %d", p2i(_ICmiss_at[i]), _ICmiss_count[i]);
   187       tot_misses += _ICmiss_count[i];
   185       tot_misses += _ICmiss_count[i];
   188     }
   186     }
   189     tty->print_cr("Total IC misses: %7d", tot_misses);
   187     tty->print_cr("Total IC misses: %7d", tot_misses);
   190   }
   188   }
   191 }
   189 }
   453 // exception_handler_for_return_address(...) returns the continuation address.
   451 // exception_handler_for_return_address(...) returns the continuation address.
   454 // The continuation address is the entry point of the exception handler of the
   452 // The continuation address is the entry point of the exception handler of the
   455 // previous frame depending on the return address.
   453 // previous frame depending on the return address.
   456 
   454 
   457 address SharedRuntime::raw_exception_handler_for_return_address(JavaThread* thread, address return_address) {
   455 address SharedRuntime::raw_exception_handler_for_return_address(JavaThread* thread, address return_address) {
   458   assert(frame::verify_return_pc(return_address), "must be a return address: " INTPTR_FORMAT, return_address);
   456   assert(frame::verify_return_pc(return_address), "must be a return address: " INTPTR_FORMAT, p2i(return_address));
   459   assert(thread->frames_to_pop_failed_realloc() == 0 || Interpreter::contains(return_address), "missed frames to pop?");
   457   assert(thread->frames_to_pop_failed_realloc() == 0 || Interpreter::contains(return_address), "missed frames to pop?");
   460 
   458 
   461   // Reset method handle flag.
   459   // Reset method handle flag.
   462   thread->set_is_method_handle_return(false);
   460   thread->set_is_method_handle_return(false);
   463 
   461 
   496   guarantee(blob == NULL || !blob->is_runtime_stub(), "caller should have skipped stub");
   494   guarantee(blob == NULL || !blob->is_runtime_stub(), "caller should have skipped stub");
   497   guarantee(!VtableStubs::contains(return_address), "NULL exceptions in vtables should have been handled already!");
   495   guarantee(!VtableStubs::contains(return_address), "NULL exceptions in vtables should have been handled already!");
   498 
   496 
   499 #ifndef PRODUCT
   497 #ifndef PRODUCT
   500   { ResourceMark rm;
   498   { ResourceMark rm;
   501     tty->print_cr("No exception handler found for exception at " INTPTR_FORMAT " - potential problems:", return_address);
   499     tty->print_cr("No exception handler found for exception at " INTPTR_FORMAT " - potential problems:", p2i(return_address));
   502     tty->print_cr("a) exception happened in (new?) code stubs/buffers that is not handled here");
   500     tty->print_cr("a) exception happened in (new?) code stubs/buffers that is not handled here");
   503     tty->print_cr("b) other problem");
   501     tty->print_cr("b) other problem");
   504   }
   502   }
   505 #endif // PRODUCT
   503 #endif // PRODUCT
   506 
   504 
   683     return nm->unwind_handler_begin();
   681     return nm->unwind_handler_begin();
   684   }
   682   }
   685 #endif
   683 #endif
   686 
   684 
   687   if (t == NULL) {
   685   if (t == NULL) {
   688     tty->print_cr("MISSING EXCEPTION HANDLER for pc " INTPTR_FORMAT " and handler bci %d", ret_pc, handler_bci);
   686     tty->print_cr("MISSING EXCEPTION HANDLER for pc " INTPTR_FORMAT " and handler bci %d", p2i(ret_pc), handler_bci);
   689     tty->print_cr("   Exception:");
   687     tty->print_cr("   Exception:");
   690     exception->print();
   688     exception->print();
   691     tty->cr();
   689     tty->cr();
   692     tty->print_cr(" Compiled exception table :");
   690     tty->print_cr(" Compiled exception table :");
   693     table.print();
   691     table.print();
   767         // interpreter would need in case of a deoptimization. The
   765         // interpreter would need in case of a deoptimization. The
   768         // deoptimization blob and uncommon trap blob bang the stack
   766         // deoptimization blob and uncommon trap blob bang the stack
   769         // in a debug VM to verify the correctness of the compiled
   767         // in a debug VM to verify the correctness of the compiled
   770         // method stack banging.
   768         // method stack banging.
   771         assert(thread->deopt_mark() == NULL, "no stack overflow from deopt blob/uncommon trap");
   769         assert(thread->deopt_mark() == NULL, "no stack overflow from deopt blob/uncommon trap");
   772         Events::log_exception(thread, "StackOverflowError at " INTPTR_FORMAT, pc);
   770         Events::log_exception(thread, "StackOverflowError at " INTPTR_FORMAT, p2i(pc));
   773         return StubRoutines::throw_StackOverflowError_entry();
   771         return StubRoutines::throw_StackOverflowError_entry();
   774       }
   772       }
   775 
   773 
   776       case IMPLICIT_NULL: {
   774       case IMPLICIT_NULL: {
   777         if (VtableStubs::contains(pc)) {
   775         if (VtableStubs::contains(pc)) {
   784           // If vt_stub is NULL, then return NULL to signal handler to report the SEGV error.
   782           // If vt_stub is NULL, then return NULL to signal handler to report the SEGV error.
   785           if (vt_stub == NULL) return NULL;
   783           if (vt_stub == NULL) return NULL;
   786 
   784 
   787           if (vt_stub->is_abstract_method_error(pc)) {
   785           if (vt_stub->is_abstract_method_error(pc)) {
   788             assert(!vt_stub->is_vtable_stub(), "should never see AbstractMethodErrors from vtable-type VtableStubs");
   786             assert(!vt_stub->is_vtable_stub(), "should never see AbstractMethodErrors from vtable-type VtableStubs");
   789             Events::log_exception(thread, "AbstractMethodError at " INTPTR_FORMAT, pc);
   787             Events::log_exception(thread, "AbstractMethodError at " INTPTR_FORMAT, p2i(pc));
   790             return StubRoutines::throw_AbstractMethodError_entry();
   788             return StubRoutines::throw_AbstractMethodError_entry();
   791           } else {
   789           } else {
   792             Events::log_exception(thread, "NullPointerException at vtable entry " INTPTR_FORMAT, pc);
   790             Events::log_exception(thread, "NullPointerException at vtable entry " INTPTR_FORMAT, p2i(pc));
   793             return StubRoutines::throw_NullPointerException_at_call_entry();
   791             return StubRoutines::throw_NullPointerException_at_call_entry();
   794           }
   792           }
   795         } else {
   793         } else {
   796           CodeBlob* cb = CodeCache::find_blob(pc);
   794           CodeBlob* cb = CodeCache::find_blob(pc);
   797 
   795 
   805 
   803 
   806           if (!cb->is_nmethod()) {
   804           if (!cb->is_nmethod()) {
   807             bool is_in_blob = cb->is_adapter_blob() || cb->is_method_handles_adapter_blob();
   805             bool is_in_blob = cb->is_adapter_blob() || cb->is_method_handles_adapter_blob();
   808             if (!is_in_blob) {
   806             if (!is_in_blob) {
   809               cb->print();
   807               cb->print();
   810               fatal("exception happened outside interpreter, nmethods and vtable stubs at pc " INTPTR_FORMAT, pc);
   808               fatal("exception happened outside interpreter, nmethods and vtable stubs at pc " INTPTR_FORMAT, p2i(pc));
   811             }
   809             }
   812             Events::log_exception(thread, "NullPointerException in code blob at " INTPTR_FORMAT, pc);
   810             Events::log_exception(thread, "NullPointerException in code blob at " INTPTR_FORMAT, p2i(pc));
   813             // There is no handler here, so we will simply unwind.
   811             // There is no handler here, so we will simply unwind.
   814             return StubRoutines::throw_NullPointerException_at_call_entry();
   812             return StubRoutines::throw_NullPointerException_at_call_entry();
   815           }
   813           }
   816 
   814 
   817           // Otherwise, it's an nmethod.  Consult its exception handlers.
   815           // Otherwise, it's an nmethod.  Consult its exception handlers.
   819           if (nm->inlinecache_check_contains(pc)) {
   817           if (nm->inlinecache_check_contains(pc)) {
   820             // exception happened inside inline-cache check code
   818             // exception happened inside inline-cache check code
   821             // => the nmethod is not yet active (i.e., the frame
   819             // => the nmethod is not yet active (i.e., the frame
   822             // is not set up yet) => use return address pushed by
   820             // is not set up yet) => use return address pushed by
   823             // caller => don't push another return address
   821             // caller => don't push another return address
   824             Events::log_exception(thread, "NullPointerException in IC check " INTPTR_FORMAT, pc);
   822             Events::log_exception(thread, "NullPointerException in IC check " INTPTR_FORMAT, p2i(pc));
   825             return StubRoutines::throw_NullPointerException_at_call_entry();
   823             return StubRoutines::throw_NullPointerException_at_call_entry();
   826           }
   824           }
   827 
   825 
   828           if (nm->method()->is_method_handle_intrinsic()) {
   826           if (nm->method()->is_method_handle_intrinsic()) {
   829             // exception happened inside MH dispatch code, similar to a vtable stub
   827             // exception happened inside MH dispatch code, similar to a vtable stub
   830             Events::log_exception(thread, "NullPointerException in MH adapter " INTPTR_FORMAT, pc);
   828             Events::log_exception(thread, "NullPointerException in MH adapter " INTPTR_FORMAT, p2i(pc));
   831             return StubRoutines::throw_NullPointerException_at_call_entry();
   829             return StubRoutines::throw_NullPointerException_at_call_entry();
   832           }
   830           }
   833 
   831 
   834 #ifndef PRODUCT
   832 #ifndef PRODUCT
   835           _implicit_null_throws++;
   833           _implicit_null_throws++;
   863     assert(exception_kind == IMPLICIT_NULL || exception_kind == IMPLICIT_DIVIDE_BY_ZERO, "wrong implicit exception kind");
   861     assert(exception_kind == IMPLICIT_NULL || exception_kind == IMPLICIT_DIVIDE_BY_ZERO, "wrong implicit exception kind");
   864 
   862 
   865     // for AbortVMOnException flag
   863     // for AbortVMOnException flag
   866     NOT_PRODUCT(Exceptions::debug_check_abort("java.lang.NullPointerException"));
   864     NOT_PRODUCT(Exceptions::debug_check_abort("java.lang.NullPointerException"));
   867     if (exception_kind == IMPLICIT_NULL) {
   865     if (exception_kind == IMPLICIT_NULL) {
   868       Events::log_exception(thread, "Implicit null exception at " INTPTR_FORMAT " to " INTPTR_FORMAT, pc, target_pc);
   866       Events::log_exception(thread, "Implicit null exception at " INTPTR_FORMAT " to " INTPTR_FORMAT, p2i(pc), p2i(target_pc));
   869     } else {
   867     } else {
   870       Events::log_exception(thread, "Implicit division by zero exception at " INTPTR_FORMAT " to " INTPTR_FORMAT, pc, target_pc);
   868       Events::log_exception(thread, "Implicit division by zero exception at " INTPTR_FORMAT " to " INTPTR_FORMAT, p2i(pc), p2i(target_pc));
   871     }
   869     }
   872     return target_pc;
   870     return target_pc;
   873   }
   871   }
   874 
   872 
   875   ShouldNotReachHere();
   873   ShouldNotReachHere();
  1174     ResourceMark rm(thread);
  1172     ResourceMark rm(thread);
  1175     tty->print("resolving %s%s (%s) call to",
  1173     tty->print("resolving %s%s (%s) call to",
  1176       (is_optimized) ? "optimized " : "", (is_virtual) ? "virtual" : "static",
  1174       (is_optimized) ? "optimized " : "", (is_virtual) ? "virtual" : "static",
  1177       Bytecodes::name(invoke_code));
  1175       Bytecodes::name(invoke_code));
  1178     callee_method->print_short_name(tty);
  1176     callee_method->print_short_name(tty);
  1179     tty->print_cr(" at pc: " INTPTR_FORMAT " to code: " INTPTR_FORMAT, caller_frame.pc(), callee_method->code());
  1177     tty->print_cr(" at pc: " INTPTR_FORMAT " to code: " INTPTR_FORMAT,
       
  1178                   p2i(caller_frame.pc()), p2i(callee_method->code()));
  1180   }
  1179   }
  1181 #endif
  1180 #endif
  1182 
  1181 
  1183   // JSR 292 key invariant:
  1182   // JSR 292 key invariant:
  1184   // If the resolved method is a MethodHandle invoke target, the call
  1183   // If the resolved method is a MethodHandle invoke target, the call
  1395       RegisterMap reg_map(thread, false);
  1394       RegisterMap reg_map(thread, false);
  1396       frame caller_frame = thread->last_frame().sender(&reg_map);
  1395       frame caller_frame = thread->last_frame().sender(&reg_map);
  1397       ResourceMark rm(thread);
  1396       ResourceMark rm(thread);
  1398       tty->print("converting IC miss to reresolve (%s) call to", Bytecodes::name(bc));
  1397       tty->print("converting IC miss to reresolve (%s) call to", Bytecodes::name(bc));
  1399       callee_method->print_short_name(tty);
  1398       callee_method->print_short_name(tty);
  1400       tty->print_cr(" from pc: " INTPTR_FORMAT, caller_frame.pc());
  1399       tty->print_cr(" from pc: " INTPTR_FORMAT, p2i(caller_frame.pc()));
  1401       tty->print_cr(" code: " INTPTR_FORMAT, callee_method->code());
  1400       tty->print_cr(" code: " INTPTR_FORMAT, p2i(callee_method->code()));
  1402     }
  1401     }
  1403     return callee_method;
  1402     return callee_method;
  1404   }
  1403   }
  1405 
  1404 
  1406   methodHandle callee_method = call_info.selected_method();
  1405   methodHandle callee_method = call_info.selected_method();
  1413   // Statistics & Tracing
  1412   // Statistics & Tracing
  1414   if (TraceCallFixup) {
  1413   if (TraceCallFixup) {
  1415     ResourceMark rm(thread);
  1414     ResourceMark rm(thread);
  1416     tty->print("IC miss (%s) call to", Bytecodes::name(bc));
  1415     tty->print("IC miss (%s) call to", Bytecodes::name(bc));
  1417     callee_method->print_short_name(tty);
  1416     callee_method->print_short_name(tty);
  1418     tty->print_cr(" code: " INTPTR_FORMAT, callee_method->code());
  1417     tty->print_cr(" code: " INTPTR_FORMAT, p2i(callee_method->code()));
  1419   }
  1418   }
  1420 
  1419 
  1421   if (ICMissHistogram) {
  1420   if (ICMissHistogram) {
  1422     MutexLocker m(VMStatistic_lock);
  1421     MutexLocker m(VMStatistic_lock);
  1423     RegisterMap reg_map(thread, false);
  1422     RegisterMap reg_map(thread, false);
  1445       if (inline_cache->is_optimized()) {
  1444       if (inline_cache->is_optimized()) {
  1446         if (TraceCallFixup) {
  1445         if (TraceCallFixup) {
  1447           ResourceMark rm(thread);
  1446           ResourceMark rm(thread);
  1448           tty->print("OPTIMIZED IC miss (%s) call to", Bytecodes::name(bc));
  1447           tty->print("OPTIMIZED IC miss (%s) call to", Bytecodes::name(bc));
  1449           callee_method->print_short_name(tty);
  1448           callee_method->print_short_name(tty);
  1450           tty->print_cr(" code: " INTPTR_FORMAT, callee_method->code());
  1449           tty->print_cr(" code: " INTPTR_FORMAT, p2i(callee_method->code()));
  1451         }
  1450         }
  1452         should_be_mono = true;
  1451         should_be_mono = true;
  1453       } else if (inline_cache->is_icholder_call()) {
  1452       } else if (inline_cache->is_icholder_call()) {
  1454         CompiledICHolder* ic_oop = inline_cache->cached_icholder();
  1453         CompiledICHolder* ic_oop = inline_cache->cached_icholder();
  1455         if (ic_oop != NULL) {
  1454         if (ic_oop != NULL) {
  1462             // could have been deoptimized in the meantime
  1461             // could have been deoptimized in the meantime
  1463             if (TraceCallFixup) {
  1462             if (TraceCallFixup) {
  1464               ResourceMark rm(thread);
  1463               ResourceMark rm(thread);
  1465               tty->print("FALSE IC miss (%s) converting to compiled call to", Bytecodes::name(bc));
  1464               tty->print("FALSE IC miss (%s) converting to compiled call to", Bytecodes::name(bc));
  1466               callee_method->print_short_name(tty);
  1465               callee_method->print_short_name(tty);
  1467               tty->print_cr(" code: " INTPTR_FORMAT, callee_method->code());
  1466               tty->print_cr(" code: " INTPTR_FORMAT, p2i(callee_method->code()));
  1468             }
  1467             }
  1469             should_be_mono = true;
  1468             should_be_mono = true;
  1470           }
  1469           }
  1471         }
  1470         }
  1472       }
  1471       }
  1602 
  1601 
  1603   if (TraceCallFixup) {
  1602   if (TraceCallFixup) {
  1604     ResourceMark rm(thread);
  1603     ResourceMark rm(thread);
  1605     tty->print("handle_wrong_method reresolving call to");
  1604     tty->print("handle_wrong_method reresolving call to");
  1606     callee_method->print_short_name(tty);
  1605     callee_method->print_short_name(tty);
  1607     tty->print_cr(" code: " INTPTR_FORMAT, callee_method->code());
  1606     tty->print_cr(" code: " INTPTR_FORMAT, p2i(callee_method->code()));
  1608   }
  1607   }
  1609 #endif
  1608 #endif
  1610 
  1609 
  1611   return callee_method;
  1610   return callee_method;
  1612 }
  1611 }
  1628   int comp_args_on_stack = java_calling_convention(sig_bt, regs_without_member_name, total_args_passed - 1, is_outgoing);
  1627   int comp_args_on_stack = java_calling_convention(sig_bt, regs_without_member_name, total_args_passed - 1, is_outgoing);
  1629 
  1628 
  1630   for (int i = 0; i < member_arg_pos; i++) {
  1629   for (int i = 0; i < member_arg_pos; i++) {
  1631     VMReg a =    regs_with_member_name[i].first();
  1630     VMReg a =    regs_with_member_name[i].first();
  1632     VMReg b = regs_without_member_name[i].first();
  1631     VMReg b = regs_without_member_name[i].first();
  1633     assert(a->value() == b->value(), "register allocation mismatch: a=%d, b=%d", a->value(), b->value());
  1632     assert(a->value() == b->value(), "register allocation mismatch: a=" INTX_FORMAT ", b=" INTX_FORMAT, a->value(), b->value());
  1634   }
  1633   }
  1635   assert(regs_with_member_name[member_arg_pos].first()->is_valid(), "bad member arg");
  1634   assert(regs_with_member_name[member_arg_pos].first()->is_valid(), "bad member arg");
  1636 }
  1635 }
  1637 #endif
  1636 #endif
  1638 
  1637 
  1710         CodeBlob* callee = CodeCache::find_blob(destination);
  1709         CodeBlob* callee = CodeCache::find_blob(destination);
  1711         // callee == cb seems weird. It means calling interpreter thru stub.
  1710         // callee == cb seems weird. It means calling interpreter thru stub.
  1712         if (callee == cb || callee->is_adapter_blob()) {
  1711         if (callee == cb || callee->is_adapter_blob()) {
  1713           // static call or optimized virtual
  1712           // static call or optimized virtual
  1714           if (TraceCallFixup) {
  1713           if (TraceCallFixup) {
  1715             tty->print("fixup callsite           at " INTPTR_FORMAT " to compiled code for", caller_pc);
  1714             tty->print("fixup callsite           at " INTPTR_FORMAT " to compiled code for", p2i(caller_pc));
  1716             moop->print_short_name(tty);
  1715             moop->print_short_name(tty);
  1717             tty->print_cr(" to " INTPTR_FORMAT, entry_point);
  1716             tty->print_cr(" to " INTPTR_FORMAT, p2i(entry_point));
  1718           }
  1717           }
  1719           call->set_destination_mt_safe(entry_point);
  1718           call->set_destination_mt_safe(entry_point);
  1720         } else {
  1719         } else {
  1721           if (TraceCallFixup) {
  1720           if (TraceCallFixup) {
  1722             tty->print("failed to fixup callsite at " INTPTR_FORMAT " to compiled code for", caller_pc);
  1721             tty->print("failed to fixup callsite at " INTPTR_FORMAT " to compiled code for", p2i(caller_pc));
  1723             moop->print_short_name(tty);
  1722             moop->print_short_name(tty);
  1724             tty->print_cr(" to " INTPTR_FORMAT, entry_point);
  1723             tty->print_cr(" to " INTPTR_FORMAT, p2i(entry_point));
  1725           }
  1724           }
  1726           // assert is too strong could also be resolve destinations.
  1725           // assert is too strong could also be resolve destinations.
  1727           // assert(InlineCacheBuffer::contains(destination) || VtableStubs::contains(destination), "must be");
  1726           // assert(InlineCacheBuffer::contains(destination) || VtableStubs::contains(destination), "must be");
  1728         }
  1727         }
  1729       } else {
  1728       } else {
  1730           if (TraceCallFixup) {
  1729           if (TraceCallFixup) {
  1731             tty->print("already patched callsite at " INTPTR_FORMAT " to compiled code for", caller_pc);
  1730             tty->print("already patched callsite at " INTPTR_FORMAT " to compiled code for", p2i(caller_pc));
  1732             moop->print_short_name(tty);
  1731             moop->print_short_name(tty);
  1733             tty->print_cr(" to " INTPTR_FORMAT, entry_point);
  1732             tty->print_cr(" to " INTPTR_FORMAT, p2i(entry_point));
  1734           }
  1733           }
  1735       }
  1734       }
  1736     }
  1735     }
  1737   }
  1736   }
  1738 IRT_END
  1737 IRT_END
  2832   assert(false, "Should have found handler");
  2831   assert(false, "Should have found handler");
  2833 }
  2832 }
  2834 
  2833 
  2835 void AdapterHandlerEntry::print_adapter_on(outputStream* st) const {
  2834 void AdapterHandlerEntry::print_adapter_on(outputStream* st) const {
  2836   st->print_cr("AHE@" INTPTR_FORMAT ": %s i2c: " INTPTR_FORMAT " c2i: " INTPTR_FORMAT " c2iUV: " INTPTR_FORMAT,
  2835   st->print_cr("AHE@" INTPTR_FORMAT ": %s i2c: " INTPTR_FORMAT " c2i: " INTPTR_FORMAT " c2iUV: " INTPTR_FORMAT,
  2837                (intptr_t) this, fingerprint()->as_string(),
  2836                p2i(this), fingerprint()->as_string(),
  2838                get_i2c_entry(), get_c2i_entry(), get_c2i_unverified_entry());
  2837                p2i(get_i2c_entry()), p2i(get_c2i_entry()), p2i(get_c2i_unverified_entry()));
  2839 
  2838 
  2840 }
  2839 }
  2841 
  2840 
  2842 #ifndef PRODUCT
  2841 #ifndef PRODUCT
  2843 
  2842