535 address stub; |
535 address stub; |
536 // Look up the code blob |
536 // Look up the code blob |
537 CodeBlob *cb = CodeCache::find_blob(pc); |
537 CodeBlob *cb = CodeCache::find_blob(pc); |
538 |
538 |
539 // Should be an nmethod |
539 // Should be an nmethod |
540 assert( cb && cb->is_nmethod(), "safepoint polling: pc must refer to an nmethod" ); |
540 assert(cb && cb->is_nmethod(), "safepoint polling: pc must refer to an nmethod"); |
541 |
541 |
542 // Look up the relocation information |
542 // Look up the relocation information |
543 assert( ((nmethod*)cb)->is_at_poll_or_poll_return(pc), |
543 assert(((nmethod*)cb)->is_at_poll_or_poll_return(pc), |
544 "safepoint polling: type must be poll" ); |
544 "safepoint polling: type must be poll"); |
545 |
545 |
546 assert( ((NativeInstruction*)pc)->is_safepoint_poll(), |
546 assert(((NativeInstruction*)pc)->is_safepoint_poll(), |
547 "Only polling locations are used for safepoint"); |
547 "Only polling locations are used for safepoint"); |
548 |
548 |
549 bool at_poll_return = ((nmethod*)cb)->is_at_poll_return(pc); |
549 bool at_poll_return = ((nmethod*)cb)->is_at_poll_return(pc); |
550 bool has_wide_vectors = ((nmethod*)cb)->has_wide_vectors(); |
550 bool has_wide_vectors = ((nmethod*)cb)->has_wide_vectors(); |
551 if (at_poll_return) { |
551 if (at_poll_return) { |
560 assert(SharedRuntime::polling_page_safepoint_handler_blob() != NULL, |
560 assert(SharedRuntime::polling_page_safepoint_handler_blob() != NULL, |
561 "polling page safepoint stub not created yet"); |
561 "polling page safepoint stub not created yet"); |
562 stub = SharedRuntime::polling_page_safepoint_handler_blob()->entry_point(); |
562 stub = SharedRuntime::polling_page_safepoint_handler_blob()->entry_point(); |
563 } |
563 } |
564 #ifndef PRODUCT |
564 #ifndef PRODUCT |
565 if( TraceSafepoint ) { |
565 if (TraceSafepoint) { |
566 char buf[256]; |
566 char buf[256]; |
567 jio_snprintf(buf, sizeof(buf), |
567 jio_snprintf(buf, sizeof(buf), |
568 "... found polling page %s exception at pc = " |
568 "... found polling page %s exception at pc = " |
569 INTPTR_FORMAT ", stub =" INTPTR_FORMAT, |
569 INTPTR_FORMAT ", stub =" INTPTR_FORMAT, |
570 at_poll_return ? "return" : "loop", |
570 at_poll_return ? "return" : "loop", |
1903 tty->print_cr("Removable exceptions: %d", _nof_removable_exceptions); |
1903 tty->print_cr("Removable exceptions: %d", _nof_removable_exceptions); |
1904 } |
1904 } |
1905 } |
1905 } |
1906 |
1906 |
1907 // Dump the JRT_ENTRY counters |
1907 // Dump the JRT_ENTRY counters |
1908 if( _new_instance_ctr ) tty->print_cr("%5d new instance requires GC", _new_instance_ctr); |
1908 if (_new_instance_ctr) tty->print_cr("%5d new instance requires GC", _new_instance_ctr); |
1909 if( _new_array_ctr ) tty->print_cr("%5d new array requires GC", _new_array_ctr); |
1909 if (_new_array_ctr) tty->print_cr("%5d new array requires GC", _new_array_ctr); |
1910 if( _multi1_ctr ) tty->print_cr("%5d multianewarray 1 dim", _multi1_ctr); |
1910 if (_multi1_ctr) tty->print_cr("%5d multianewarray 1 dim", _multi1_ctr); |
1911 if( _multi2_ctr ) tty->print_cr("%5d multianewarray 2 dim", _multi2_ctr); |
1911 if (_multi2_ctr) tty->print_cr("%5d multianewarray 2 dim", _multi2_ctr); |
1912 if( _multi3_ctr ) tty->print_cr("%5d multianewarray 3 dim", _multi3_ctr); |
1912 if (_multi3_ctr) tty->print_cr("%5d multianewarray 3 dim", _multi3_ctr); |
1913 if( _multi4_ctr ) tty->print_cr("%5d multianewarray 4 dim", _multi4_ctr); |
1913 if (_multi4_ctr) tty->print_cr("%5d multianewarray 4 dim", _multi4_ctr); |
1914 if( _multi5_ctr ) tty->print_cr("%5d multianewarray 5 dim", _multi5_ctr); |
1914 if (_multi5_ctr) tty->print_cr("%5d multianewarray 5 dim", _multi5_ctr); |
1915 |
1915 |
1916 tty->print_cr("%5d inline cache miss in compiled", _ic_miss_ctr ); |
1916 tty->print_cr("%5d inline cache miss in compiled", _ic_miss_ctr); |
1917 tty->print_cr("%5d wrong method", _wrong_method_ctr ); |
1917 tty->print_cr("%5d wrong method", _wrong_method_ctr); |
1918 tty->print_cr("%5d unresolved static call site", _resolve_static_ctr ); |
1918 tty->print_cr("%5d unresolved static call site", _resolve_static_ctr); |
1919 tty->print_cr("%5d unresolved virtual call site", _resolve_virtual_ctr ); |
1919 tty->print_cr("%5d unresolved virtual call site", _resolve_virtual_ctr); |
1920 tty->print_cr("%5d unresolved opt virtual call site", _resolve_opt_virtual_ctr ); |
1920 tty->print_cr("%5d unresolved opt virtual call site", _resolve_opt_virtual_ctr); |
1921 |
1921 |
1922 if( _mon_enter_stub_ctr ) tty->print_cr("%5d monitor enter stub", _mon_enter_stub_ctr ); |
1922 if (_mon_enter_stub_ctr) tty->print_cr("%5d monitor enter stub", _mon_enter_stub_ctr); |
1923 if( _mon_exit_stub_ctr ) tty->print_cr("%5d monitor exit stub", _mon_exit_stub_ctr ); |
1923 if (_mon_exit_stub_ctr) tty->print_cr("%5d monitor exit stub", _mon_exit_stub_ctr); |
1924 if( _mon_enter_ctr ) tty->print_cr("%5d monitor enter slow", _mon_enter_ctr ); |
1924 if (_mon_enter_ctr) tty->print_cr("%5d monitor enter slow", _mon_enter_ctr); |
1925 if( _mon_exit_ctr ) tty->print_cr("%5d monitor exit slow", _mon_exit_ctr ); |
1925 if (_mon_exit_ctr) tty->print_cr("%5d monitor exit slow", _mon_exit_ctr); |
1926 if( _partial_subtype_ctr) tty->print_cr("%5d slow partial subtype", _partial_subtype_ctr ); |
1926 if (_partial_subtype_ctr) tty->print_cr("%5d slow partial subtype", _partial_subtype_ctr); |
1927 if( _jbyte_array_copy_ctr ) tty->print_cr("%5d byte array copies", _jbyte_array_copy_ctr ); |
1927 if (_jbyte_array_copy_ctr) tty->print_cr("%5d byte array copies", _jbyte_array_copy_ctr); |
1928 if( _jshort_array_copy_ctr ) tty->print_cr("%5d short array copies", _jshort_array_copy_ctr ); |
1928 if (_jshort_array_copy_ctr) tty->print_cr("%5d short array copies", _jshort_array_copy_ctr); |
1929 if( _jint_array_copy_ctr ) tty->print_cr("%5d int array copies", _jint_array_copy_ctr ); |
1929 if (_jint_array_copy_ctr) tty->print_cr("%5d int array copies", _jint_array_copy_ctr); |
1930 if( _jlong_array_copy_ctr ) tty->print_cr("%5d long array copies", _jlong_array_copy_ctr ); |
1930 if (_jlong_array_copy_ctr) tty->print_cr("%5d long array copies", _jlong_array_copy_ctr); |
1931 if( _oop_array_copy_ctr ) tty->print_cr("%5d oop array copies", _oop_array_copy_ctr ); |
1931 if (_oop_array_copy_ctr) tty->print_cr("%5d oop array copies", _oop_array_copy_ctr); |
1932 if( _checkcast_array_copy_ctr ) tty->print_cr("%5d checkcast array copies", _checkcast_array_copy_ctr ); |
1932 if (_checkcast_array_copy_ctr) tty->print_cr("%5d checkcast array copies", _checkcast_array_copy_ctr); |
1933 if( _unsafe_array_copy_ctr ) tty->print_cr("%5d unsafe array copies", _unsafe_array_copy_ctr ); |
1933 if (_unsafe_array_copy_ctr) tty->print_cr("%5d unsafe array copies", _unsafe_array_copy_ctr); |
1934 if( _generic_array_copy_ctr ) tty->print_cr("%5d generic array copies", _generic_array_copy_ctr ); |
1934 if (_generic_array_copy_ctr) tty->print_cr("%5d generic array copies", _generic_array_copy_ctr); |
1935 if( _slow_array_copy_ctr ) tty->print_cr("%5d slow array copies", _slow_array_copy_ctr ); |
1935 if (_slow_array_copy_ctr) tty->print_cr("%5d slow array copies", _slow_array_copy_ctr); |
1936 if( _find_handler_ctr ) tty->print_cr("%5d find exception handler", _find_handler_ctr ); |
1936 if (_find_handler_ctr) tty->print_cr("%5d find exception handler", _find_handler_ctr); |
1937 if( _rethrow_ctr ) tty->print_cr("%5d rethrow handler", _rethrow_ctr ); |
1937 if (_rethrow_ctr) tty->print_cr("%5d rethrow handler", _rethrow_ctr); |
1938 |
1938 |
1939 AdapterHandlerLibrary::print_statistics(); |
1939 AdapterHandlerLibrary::print_statistics(); |
1940 |
1940 |
1941 if (xtty != NULL) xtty->tail("statistics"); |
1941 if (xtty != NULL) xtty->tail("statistics"); |
1942 } |
1942 } |
2477 ttyLocker ttyl; |
2477 ttyLocker ttyl; |
2478 entry->print_adapter_on(tty); |
2478 entry->print_adapter_on(tty); |
2479 tty->print_cr("i2c argument handler #%d for: %s %s (%d bytes generated)", |
2479 tty->print_cr("i2c argument handler #%d for: %s %s (%d bytes generated)", |
2480 _adapters->number_of_entries(), (method->is_static() ? "static" : "receiver"), |
2480 _adapters->number_of_entries(), (method->is_static() ? "static" : "receiver"), |
2481 method->signature()->as_C_string(), insts_size); |
2481 method->signature()->as_C_string(), insts_size); |
2482 tty->print_cr("c2i argument handler starts at %p",entry->get_c2i_entry()); |
2482 tty->print_cr("c2i argument handler starts at %p", entry->get_c2i_entry()); |
2483 if (Verbose || PrintStubCode) { |
2483 if (Verbose || PrintStubCode) { |
2484 address first_pc = entry->base_address(); |
2484 address first_pc = entry->base_address(); |
2485 if (first_pc != NULL) { |
2485 if (first_pc != NULL) { |
2486 Disassembler::decode(first_pc, first_pc + insts_size); |
2486 Disassembler::decode(first_pc, first_pc + insts_size); |
2487 tty->cr(); |
2487 tty->cr(); |
2603 const int total_args_passed = method->size_of_parameters(); |
2603 const int total_args_passed = method->size_of_parameters(); |
2604 |
2604 |
2605 BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType, total_args_passed); |
2605 BasicType* sig_bt = NEW_RESOURCE_ARRAY(BasicType, total_args_passed); |
2606 VMRegPair* regs = NEW_RESOURCE_ARRAY(VMRegPair, total_args_passed); |
2606 VMRegPair* regs = NEW_RESOURCE_ARRAY(VMRegPair, total_args_passed); |
2607 int i=0; |
2607 int i=0; |
2608 if( !method->is_static() ) // Pass in receiver first |
2608 if (!method->is_static()) // Pass in receiver first |
2609 sig_bt[i++] = T_OBJECT; |
2609 sig_bt[i++] = T_OBJECT; |
2610 SignatureStream ss(method->signature()); |
2610 SignatureStream ss(method->signature()); |
2611 for( ; !ss.at_return_type(); ss.next()) { |
2611 for (; !ss.at_return_type(); ss.next()) { |
2612 sig_bt[i++] = ss.type(); // Collect remaining bits of signature |
2612 sig_bt[i++] = ss.type(); // Collect remaining bits of signature |
2613 if( ss.type() == T_LONG || ss.type() == T_DOUBLE ) |
2613 if (ss.type() == T_LONG || ss.type() == T_DOUBLE) |
2614 sig_bt[i++] = T_VOID; // Longs & doubles take 2 Java slots |
2614 sig_bt[i++] = T_VOID; // Longs & doubles take 2 Java slots |
2615 } |
2615 } |
2616 assert(i == total_args_passed, ""); |
2616 assert(i == total_args_passed, ""); |
2617 BasicType ret_type = ss.type(); |
2617 BasicType ret_type = ss.type(); |
2618 |
2618 |
2806 // ResourceObject, so do not put any ResourceMarks in here. |
2806 // ResourceObject, so do not put any ResourceMarks in here. |
2807 char *s = sig->as_C_string(); |
2807 char *s = sig->as_C_string(); |
2808 int len = (int)strlen(s); |
2808 int len = (int)strlen(s); |
2809 s++; len--; // Skip opening paren |
2809 s++; len--; // Skip opening paren |
2810 char *t = s+len; |
2810 char *t = s+len; |
2811 while( *(--t) != ')' ) ; // Find close paren |
2811 while (*(--t) != ')'); // Find close paren |
2812 |
2812 |
2813 BasicType *sig_bt = NEW_RESOURCE_ARRAY( BasicType, 256 ); |
2813 BasicType *sig_bt = NEW_RESOURCE_ARRAY(BasicType, 256); |
2814 VMRegPair *regs = NEW_RESOURCE_ARRAY( VMRegPair, 256 ); |
2814 VMRegPair *regs = NEW_RESOURCE_ARRAY(VMRegPair, 256); |
2815 int cnt = 0; |
2815 int cnt = 0; |
2816 if (has_receiver) { |
2816 if (has_receiver) { |
2817 sig_bt[cnt++] = T_OBJECT; // Receiver is argument 0; not in signature |
2817 sig_bt[cnt++] = T_OBJECT; // Receiver is argument 0; not in signature |
2818 } |
2818 } |
2819 |
2819 |
2820 while( s < t ) { |
2820 while (s < t) { |
2821 switch( *s++ ) { // Switch on signature character |
2821 switch (*s++) { // Switch on signature character |
2822 case 'B': sig_bt[cnt++] = T_BYTE; break; |
2822 case 'B': sig_bt[cnt++] = T_BYTE; break; |
2823 case 'C': sig_bt[cnt++] = T_CHAR; break; |
2823 case 'C': sig_bt[cnt++] = T_CHAR; break; |
2824 case 'D': sig_bt[cnt++] = T_DOUBLE; sig_bt[cnt++] = T_VOID; break; |
2824 case 'D': sig_bt[cnt++] = T_DOUBLE; sig_bt[cnt++] = T_VOID; break; |
2825 case 'F': sig_bt[cnt++] = T_FLOAT; break; |
2825 case 'F': sig_bt[cnt++] = T_FLOAT; break; |
2826 case 'I': sig_bt[cnt++] = T_INT; break; |
2826 case 'I': sig_bt[cnt++] = T_INT; break; |
2827 case 'J': sig_bt[cnt++] = T_LONG; sig_bt[cnt++] = T_VOID; break; |
2827 case 'J': sig_bt[cnt++] = T_LONG; sig_bt[cnt++] = T_VOID; break; |
2828 case 'S': sig_bt[cnt++] = T_SHORT; break; |
2828 case 'S': sig_bt[cnt++] = T_SHORT; break; |
2829 case 'Z': sig_bt[cnt++] = T_BOOLEAN; break; |
2829 case 'Z': sig_bt[cnt++] = T_BOOLEAN; break; |
2830 case 'V': sig_bt[cnt++] = T_VOID; break; |
2830 case 'V': sig_bt[cnt++] = T_VOID; break; |
2831 case 'L': // Oop |
2831 case 'L': // Oop |
2832 while( *s++ != ';' ) ; // Skip signature |
2832 while (*s++ != ';'); // Skip signature |
2833 sig_bt[cnt++] = T_OBJECT; |
2833 sig_bt[cnt++] = T_OBJECT; |
2834 break; |
2834 break; |
2835 case '[': { // Array |
2835 case '[': { // Array |
2836 do { // Skip optional size |
2836 do { // Skip optional size |
2837 while( *s >= '0' && *s <= '9' ) s++; |
2837 while (*s >= '0' && *s <= '9') s++; |
2838 } while( *s++ == '[' ); // Nested arrays? |
2838 } while (*s++ == '['); // Nested arrays? |
2839 // Skip element type |
2839 // Skip element type |
2840 if( s[-1] == 'L' ) |
2840 if (s[-1] == 'L') |
2841 while( *s++ != ';' ) ; // Skip signature |
2841 while (*s++ != ';'); // Skip signature |
2842 sig_bt[cnt++] = T_ARRAY; |
2842 sig_bt[cnt++] = T_ARRAY; |
2843 break; |
2843 break; |
2844 } |
2844 } |
2845 default : ShouldNotReachHere(); |
2845 default : ShouldNotReachHere(); |
2846 } |
2846 } |
2848 |
2848 |
2849 if (has_appendix) { |
2849 if (has_appendix) { |
2850 sig_bt[cnt++] = T_OBJECT; |
2850 sig_bt[cnt++] = T_OBJECT; |
2851 } |
2851 } |
2852 |
2852 |
2853 assert( cnt < 256, "grow table size" ); |
2853 assert(cnt < 256, "grow table size"); |
2854 |
2854 |
2855 int comp_args_on_stack; |
2855 int comp_args_on_stack; |
2856 comp_args_on_stack = java_calling_convention(sig_bt, regs, cnt, true); |
2856 comp_args_on_stack = java_calling_convention(sig_bt, regs, cnt, true); |
2857 |
2857 |
2858 // the calling convention doesn't count out_preserve_stack_slots so |
2858 // the calling convention doesn't count out_preserve_stack_slots so |
2859 // we must add that in to get "true" stack offsets. |
2859 // we must add that in to get "true" stack offsets. |
2860 |
2860 |
2861 if (comp_args_on_stack) { |
2861 if (comp_args_on_stack) { |
2862 for (int i = 0; i < cnt; i++) { |
2862 for (int i = 0; i < cnt; i++) { |
2863 VMReg reg1 = regs[i].first(); |
2863 VMReg reg1 = regs[i].first(); |
2864 if( reg1->is_stack()) { |
2864 if (reg1->is_stack()) { |
2865 // Yuck |
2865 // Yuck |
2866 reg1 = reg1->bias(out_preserve_stack_slots()); |
2866 reg1 = reg1->bias(out_preserve_stack_slots()); |
2867 } |
2867 } |
2868 VMReg reg2 = regs[i].second(); |
2868 VMReg reg2 = regs[i].second(); |
2869 if( reg2->is_stack()) { |
2869 if (reg2->is_stack()) { |
2870 // Yuck |
2870 // Yuck |
2871 reg2 = reg2->bias(out_preserve_stack_slots()); |
2871 reg2 = reg2->bias(out_preserve_stack_slots()); |
2872 } |
2872 } |
2873 regs[i].set_pair(reg2, reg1); |
2873 regs[i].set_pair(reg2, reg1); |
2874 } |
2874 } |
2902 // differently then this code could move to platform specific code or |
2902 // differently then this code could move to platform specific code or |
2903 // the code here could be modified to copy items one at a time using |
2903 // the code here could be modified to copy items one at a time using |
2904 // frame accessor methods and be platform independent. |
2904 // frame accessor methods and be platform independent. |
2905 |
2905 |
2906 frame fr = thread->last_frame(); |
2906 frame fr = thread->last_frame(); |
2907 assert( fr.is_interpreted_frame(), "" ); |
2907 assert(fr.is_interpreted_frame(), ""); |
2908 assert( fr.interpreter_frame_expression_stack_size()==0, "only handle empty stacks" ); |
2908 assert(fr.interpreter_frame_expression_stack_size()==0, "only handle empty stacks"); |
2909 |
2909 |
2910 // Figure out how many monitors are active. |
2910 // Figure out how many monitors are active. |
2911 int active_monitor_count = 0; |
2911 int active_monitor_count = 0; |
2912 for( BasicObjectLock *kptr = fr.interpreter_frame_monitor_end(); |
2912 for (BasicObjectLock *kptr = fr.interpreter_frame_monitor_end(); |
2913 kptr < fr.interpreter_frame_monitor_begin(); |
2913 kptr < fr.interpreter_frame_monitor_begin(); |
2914 kptr = fr.next_monitor_in_interpreter_frame(kptr) ) { |
2914 kptr = fr.next_monitor_in_interpreter_frame(kptr) ) { |
2915 if( kptr->obj() != NULL ) active_monitor_count++; |
2915 if (kptr->obj() != NULL) active_monitor_count++; |
2916 } |
2916 } |
2917 |
2917 |
2918 // QQQ we could place number of active monitors in the array so that compiled code |
2918 // QQQ we could place number of active monitors in the array so that compiled code |
2919 // could double check it. |
2919 // could double check it. |
2920 |
2920 |
2924 int buf_size_words = max_locals + active_monitor_count*2; |
2924 int buf_size_words = max_locals + active_monitor_count*2; |
2925 intptr_t *buf = NEW_C_HEAP_ARRAY(intptr_t,buf_size_words, mtCode); |
2925 intptr_t *buf = NEW_C_HEAP_ARRAY(intptr_t,buf_size_words, mtCode); |
2926 |
2926 |
2927 // Copy the locals. Order is preserved so that loading of longs works. |
2927 // Copy the locals. Order is preserved so that loading of longs works. |
2928 // Since there's no GC I can copy the oops blindly. |
2928 // Since there's no GC I can copy the oops blindly. |
2929 assert( sizeof(HeapWord)==sizeof(intptr_t), "fix this code"); |
2929 assert(sizeof(HeapWord)==sizeof(intptr_t), "fix this code"); |
2930 Copy::disjoint_words((HeapWord*)fr.interpreter_frame_local_at(max_locals-1), |
2930 Copy::disjoint_words((HeapWord*)fr.interpreter_frame_local_at(max_locals-1), |
2931 (HeapWord*)&buf[0], |
2931 (HeapWord*)&buf[0], |
2932 max_locals); |
2932 max_locals); |
2933 |
2933 |
2934 // Inflate locks. Copy the displaced headers. Be careful, there can be holes. |
2934 // Inflate locks. Copy the displaced headers. Be careful, there can be holes. |
2935 int i = max_locals; |
2935 int i = max_locals; |
2936 for( BasicObjectLock *kptr2 = fr.interpreter_frame_monitor_end(); |
2936 for (BasicObjectLock *kptr2 = fr.interpreter_frame_monitor_end(); |
2937 kptr2 < fr.interpreter_frame_monitor_begin(); |
2937 kptr2 < fr.interpreter_frame_monitor_begin(); |
2938 kptr2 = fr.next_monitor_in_interpreter_frame(kptr2) ) { |
2938 kptr2 = fr.next_monitor_in_interpreter_frame(kptr2) ) { |
2939 if( kptr2->obj() != NULL) { // Avoid 'holes' in the monitor array |
2939 if (kptr2->obj() != NULL) { // Avoid 'holes' in the monitor array |
2940 BasicLock *lock = kptr2->lock(); |
2940 BasicLock *lock = kptr2->lock(); |
2941 // Inflate so the displaced header becomes position-independent |
2941 // Inflate so the displaced header becomes position-independent |
2942 if (lock->displaced_header()->is_unlocked()) |
2942 if (lock->displaced_header()->is_unlocked()) |
2943 ObjectSynchronizer::inflate_helper(kptr2->obj()); |
2943 ObjectSynchronizer::inflate_helper(kptr2->obj()); |
2944 // Now the displaced header is free to move |
2944 // Now the displaced header is free to move |
2945 buf[i++] = (intptr_t)lock->displaced_header(); |
2945 buf[i++] = (intptr_t)lock->displaced_header(); |
2946 buf[i++] = cast_from_oop<intptr_t>(kptr2->obj()); |
2946 buf[i++] = cast_from_oop<intptr_t>(kptr2->obj()); |
2947 } |
2947 } |
2948 } |
2948 } |
2949 assert( i - max_locals == active_monitor_count*2, "found the expected number of monitors" ); |
2949 assert(i - max_locals == active_monitor_count*2, "found the expected number of monitors"); |
2950 |
2950 |
2951 return buf; |
2951 return buf; |
2952 JRT_END |
2952 JRT_END |
2953 |
2953 |
2954 JRT_LEAF(void, SharedRuntime::OSR_migration_end( intptr_t* buf) ) |
2954 JRT_LEAF(void, SharedRuntime::OSR_migration_end( intptr_t* buf) ) |
2955 FREE_C_HEAP_ARRAY(intptr_t,buf, mtCode); |
2955 FREE_C_HEAP_ARRAY(intptr_t, buf, mtCode); |
2956 JRT_END |
2956 JRT_END |
2957 |
2957 |
2958 bool AdapterHandlerLibrary::contains(CodeBlob* b) { |
2958 bool AdapterHandlerLibrary::contains(CodeBlob* b) { |
2959 AdapterHandlerTableIterator iter(_adapters); |
2959 AdapterHandlerTableIterator iter(_adapters); |
2960 while (iter.has_next()) { |
2960 while (iter.has_next()) { |
2961 AdapterHandlerEntry* a = iter.next(); |
2961 AdapterHandlerEntry* a = iter.next(); |
2962 if ( b == CodeCache::find_blob(a->get_i2c_entry()) ) return true; |
2962 if (b == CodeCache::find_blob(a->get_i2c_entry())) return true; |
2963 } |
2963 } |
2964 return false; |
2964 return false; |
2965 } |
2965 } |
2966 |
2966 |
2967 void AdapterHandlerLibrary::print_handler_on(outputStream* st, CodeBlob* b) { |
2967 void AdapterHandlerLibrary::print_handler_on(outputStream* st, CodeBlob* b) { |