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(®_map); |
1395 frame caller_frame = thread->last_frame().sender(®_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 |