comparison src/share/vm/runtime/sharedRuntime.cpp @ 4970:33df1aeaebbf

Merge with http://hg.openjdk.java.net/hsx/hsx24/hotspot/
author Thomas Wuerthinger <thomas.wuerthinger@oracle.com>
date Mon, 27 Feb 2012 13:10:13 +0100
parents 6336b144e391 09d00c18e323
children 18a5539bf19b
comparison
equal deleted inserted replaced
4703:2cfb7fb2dce7 4970:33df1aeaebbf
1 /* 1 /*
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
119 119
120 //----------------------------generate_ricochet_blob--------------------------- 120 //----------------------------generate_ricochet_blob---------------------------
121 void SharedRuntime::generate_ricochet_blob() { 121 void SharedRuntime::generate_ricochet_blob() {
122 if (!EnableInvokeDynamic) return; // leave it as a null 122 if (!EnableInvokeDynamic) return; // leave it as a null
123 123
124 #ifndef TARGET_ARCH_NYI_6939861
125 // allocate space for the code 124 // allocate space for the code
126 ResourceMark rm; 125 ResourceMark rm;
127 // setup code generation tools 126 // setup code generation tools
128 CodeBuffer buffer("ricochet_blob", 256 LP64_ONLY(+ 256), 256); // XXX x86 LP64L: 512, 512 127 CodeBuffer buffer("ricochet_blob", 256 LP64_ONLY(+ 256), 256); // XXX x86 LP64L: 512, 512
129 MacroAssembler* masm = new MacroAssembler(&buffer); 128 MacroAssembler* masm = new MacroAssembler(&buffer);
140 assert(false, "bad ricochet blob"); 139 assert(false, "bad ricochet blob");
141 return; 140 return;
142 } 141 }
143 142
144 _ricochet_blob = RicochetBlob::create(&buffer, bounce_offset, exception_offset, frame_size_in_words); 143 _ricochet_blob = RicochetBlob::create(&buffer, bounce_offset, exception_offset, frame_size_in_words);
145 #endif
146 } 144 }
147 145
148 146
149 #include <math.h> 147 #include <math.h>
150 148
838 // and processed. 836 // and processed.
839 // For stack overflow in deoptimization blob, cleanup thread. 837 // For stack overflow in deoptimization blob, cleanup thread.
840 if (thread->deopt_mark() != NULL) { 838 if (thread->deopt_mark() != NULL) {
841 Deoptimization::cleanup_deopt_info(thread, NULL); 839 Deoptimization::cleanup_deopt_info(thread, NULL);
842 } 840 }
841 Events::log_exception(thread, "StackOverflowError at " INTPTR_FORMAT, pc);
843 return StubRoutines::throw_StackOverflowError_entry(); 842 return StubRoutines::throw_StackOverflowError_entry();
844 } 843 }
845 844
846 case IMPLICIT_NULL: { 845 case IMPLICIT_NULL: {
847 if (VtableStubs::contains(pc)) { 846 if (VtableStubs::contains(pc)) {
854 // If vt_stub is NULL, then return NULL to signal handler to report the SEGV error. 853 // If vt_stub is NULL, then return NULL to signal handler to report the SEGV error.
855 if (vt_stub == NULL) return NULL; 854 if (vt_stub == NULL) return NULL;
856 855
857 if (vt_stub->is_abstract_method_error(pc)) { 856 if (vt_stub->is_abstract_method_error(pc)) {
858 assert(!vt_stub->is_vtable_stub(), "should never see AbstractMethodErrors from vtable-type VtableStubs"); 857 assert(!vt_stub->is_vtable_stub(), "should never see AbstractMethodErrors from vtable-type VtableStubs");
858 Events::log_exception(thread, "AbstractMethodError at " INTPTR_FORMAT, pc);
859 return StubRoutines::throw_AbstractMethodError_entry(); 859 return StubRoutines::throw_AbstractMethodError_entry();
860 } else { 860 } else {
861 Events::log_exception(thread, "NullPointerException at vtable entry " INTPTR_FORMAT, pc);
861 return StubRoutines::throw_NullPointerException_at_call_entry(); 862 return StubRoutines::throw_NullPointerException_at_call_entry();
862 } 863 }
863 } else { 864 } else {
864 CodeBlob* cb = CodeCache::find_blob(pc); 865 CodeBlob* cb = CodeCache::find_blob(pc);
865 866
872 // 3. Implict null exception in nmethod 873 // 3. Implict null exception in nmethod
873 874
874 if (!cb->is_nmethod()) { 875 if (!cb->is_nmethod()) {
875 guarantee(cb->is_adapter_blob() || cb->is_method_handles_adapter_blob(), 876 guarantee(cb->is_adapter_blob() || cb->is_method_handles_adapter_blob(),
876 "exception happened outside interpreter, nmethods and vtable stubs (1)"); 877 "exception happened outside interpreter, nmethods and vtable stubs (1)");
878 Events::log_exception(thread, "NullPointerException in code blob at " INTPTR_FORMAT, pc);
877 // There is no handler here, so we will simply unwind. 879 // There is no handler here, so we will simply unwind.
878 return StubRoutines::throw_NullPointerException_at_call_entry(); 880 return StubRoutines::throw_NullPointerException_at_call_entry();
879 } 881 }
880 882
881 // Otherwise, it's an nmethod. Consult its exception handlers. 883 // Otherwise, it's an nmethod. Consult its exception handlers.
883 if (nm->inlinecache_check_contains(pc)) { 885 if (nm->inlinecache_check_contains(pc)) {
884 // exception happened inside inline-cache check code 886 // exception happened inside inline-cache check code
885 // => the nmethod is not yet active (i.e., the frame 887 // => the nmethod is not yet active (i.e., the frame
886 // is not set up yet) => use return address pushed by 888 // is not set up yet) => use return address pushed by
887 // caller => don't push another return address 889 // caller => don't push another return address
890 Events::log_exception(thread, "NullPointerException in IC check " INTPTR_FORMAT, pc);
888 return StubRoutines::throw_NullPointerException_at_call_entry(); 891 return StubRoutines::throw_NullPointerException_at_call_entry();
889 } 892 }
890 893
891 #ifndef PRODUCT 894 #ifndef PRODUCT
892 _implicit_null_throws++; 895 _implicit_null_throws++;
931 assert(exception_kind == IMPLICIT_NULL || exception_kind == IMPLICIT_DIVIDE_BY_ZERO, "wrong implicit exception kind"); 934 assert(exception_kind == IMPLICIT_NULL || exception_kind == IMPLICIT_DIVIDE_BY_ZERO, "wrong implicit exception kind");
932 935
933 // for AbortVMOnException flag 936 // for AbortVMOnException flag
934 NOT_PRODUCT(Exceptions::debug_check_abort("java.lang.NullPointerException")); 937 NOT_PRODUCT(Exceptions::debug_check_abort("java.lang.NullPointerException"));
935 if (exception_kind == IMPLICIT_NULL) { 938 if (exception_kind == IMPLICIT_NULL) {
936 Events::log("Implicit null exception at " INTPTR_FORMAT " to " INTPTR_FORMAT, pc, target_pc); 939 Events::log_exception(thread, "Implicit null exception at " INTPTR_FORMAT " to " INTPTR_FORMAT, pc, target_pc);
937 } else { 940 } else {
938 Events::log("Implicit division by zero exception at " INTPTR_FORMAT " to " INTPTR_FORMAT, pc, target_pc); 941 Events::log_exception(thread, "Implicit division by zero exception at " INTPTR_FORMAT " to " INTPTR_FORMAT, pc, target_pc);
939 } 942 }
940 return target_pc; 943 return target_pc;
941 } 944 }
942 945
943 ShouldNotReachHere(); 946 ShouldNotReachHere();
1586 // so no update to the caller is needed. 1589 // so no update to the caller is needed.
1587 1590
1588 if (caller.is_compiled_frame() && !caller.is_deoptimized_frame()) { 1591 if (caller.is_compiled_frame() && !caller.is_deoptimized_frame()) {
1589 1592
1590 address pc = caller.pc(); 1593 address pc = caller.pc();
1591 Events::log("update call-site at pc " INTPTR_FORMAT, pc);
1592 1594
1593 // Default call_addr is the location of the "basic" call. 1595 // Default call_addr is the location of the "basic" call.
1594 // Determine the address of the call we a reresolving. With 1596 // Determine the address of the call we a reresolving. With
1595 // Inline Caches we will always find a recognizable call. 1597 // Inline Caches we will always find a recognizable call.
1596 // With Inline Caches disabled we may or may not find a 1598 // With Inline Caches disabled we may or may not find a
2724 CompileBroker::handle_full_code_cache(); 2726 CompileBroker::handle_full_code_cache();
2725 } 2727 }
2726 return nm; 2728 return nm;
2727 } 2729 }
2728 2730
2731 JRT_ENTRY_NO_ASYNC(void, SharedRuntime::block_for_jni_critical(JavaThread* thread))
2732 assert(thread == JavaThread::current(), "must be");
2733 // The code is about to enter a JNI lazy critical native method and
2734 // _needs_gc is true, so if this thread is already in a critical
2735 // section then just return, otherwise this thread should block
2736 // until needs_gc has been cleared.
2737 if (thread->in_critical()) {
2738 return;
2739 }
2740 // Lock and unlock a critical section to give the system a chance to block
2741 GC_locker::lock_critical(thread);
2742 GC_locker::unlock_critical(thread);
2743 JRT_END
2744
2729 #ifdef HAVE_DTRACE_H 2745 #ifdef HAVE_DTRACE_H
2730 // Create a dtrace nmethod for this method. The wrapper converts the 2746 // Create a dtrace nmethod for this method. The wrapper converts the
2731 // java compiled calling convention to the native convention, makes a dummy call 2747 // java compiled calling convention to the native convention, makes a dummy call
2732 // (actually nops for the size of the call instruction, which become a trap if 2748 // (actually nops for the size of the call instruction, which become a trap if
2733 // probe is enabled). The returns to the caller. Since this all looks like a 2749 // probe is enabled). The returns to the caller. Since this all looks like a