提交 3a91e593 编写于 作者: T twisti

8000263: JSR 292: signature types may appear to be unloaded

Reviewed-by: kvn, jrose
上级 1e0a5288
......@@ -208,8 +208,6 @@ address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler*
Register O1_scratch = O1;
Register O4_param_size = O4; // size of parameters
address code_start = __ pc();
// here's where control starts out:
__ align(CodeEntryAlignment);
address entry_point = __ pc();
......@@ -252,22 +250,9 @@ address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler*
// O4_first_arg_addr is live!
if (TraceMethodHandles) {
const char* name = vmIntrinsics::name_at(iid);
if (*name == '_') name += 1;
const size_t len = strlen(name) + 50;
char* qname = NEW_C_HEAP_ARRAY(char, len, mtInternal);
const char* suffix = "";
if (vmIntrinsics::method_for(iid) == NULL ||
!vmIntrinsics::method_for(iid)->access_flags().is_public()) {
if (is_signature_polymorphic_static(iid))
suffix = "/static";
else
suffix = "/private";
}
jio_snprintf(qname, len, "MethodHandle::interpreter_entry::%s%s", name, suffix);
if (O0_mh != noreg)
__ mov(O0_mh, G3_method_handle); // make stub happy
trace_method_handle(_masm, qname);
trace_method_handle_interpreter_entry(_masm, iid);
}
if (iid == vmIntrinsics::_invokeBasic) {
......@@ -287,14 +272,6 @@ address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler*
generate_method_handle_dispatch(_masm, iid, O0_recv, G5_member, not_for_compiler_entry);
}
if (PrintMethodHandleStubs) {
address code_end = __ pc();
tty->print_cr("--------");
tty->print_cr("method handle interpreter entry for %s", vmIntrinsics::name_at(iid));
Disassembler::decode(code_start, code_end);
tty->cr();
}
return entry_point;
}
......
......@@ -58,5 +58,3 @@ public:
Register recv, Register method_temp,
Register temp2, Register temp3,
bool for_compiler_entry);
static void trace_method_handle(MacroAssembler* _masm, const char* adaptername) PRODUCT_RETURN;
......@@ -209,8 +209,6 @@ address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler*
Register rcx_mh = rcx; // MH receiver; dies quickly and is recycled
Register rbx_method = rbx; // eventual target of this invocation
address code_start = __ pc();
// here's where control starts out:
__ align(CodeEntryAlignment);
address entry_point = __ pc();
......@@ -251,23 +249,7 @@ address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler*
// rdx_first_arg_addr is live!
if (TraceMethodHandles) {
const char* name = vmIntrinsics::name_at(iid);
if (*name == '_') name += 1;
const size_t len = strlen(name) + 50;
char* qname = NEW_C_HEAP_ARRAY(char, len, mtInternal);
const char* suffix = "";
if (vmIntrinsics::method_for(iid) == NULL ||
!vmIntrinsics::method_for(iid)->access_flags().is_public()) {
if (is_signature_polymorphic_static(iid))
suffix = "/static";
else
suffix = "/private";
}
jio_snprintf(qname, len, "MethodHandle::interpreter_entry::%s%s", name, suffix);
// note: stub look for mh in rcx
trace_method_handle(_masm, qname);
}
trace_method_handle_interpreter_entry(_masm, iid);
if (iid == vmIntrinsics::_invokeBasic) {
generate_method_handle_dispatch(_masm, iid, rcx_mh, noreg, not_for_compiler_entry);
......@@ -287,14 +269,6 @@ address MethodHandles::generate_method_handle_interpreter_entry(MacroAssembler*
generate_method_handle_dispatch(_masm, iid, rcx_recv, rbx_member, not_for_compiler_entry);
}
if (PrintMethodHandleStubs) {
address code_end = __ pc();
tty->print_cr("--------");
tty->print_cr("method handle interpreter entry for %s", vmIntrinsics::name_at(iid));
Disassembler::decode(code_start, code_end);
tty->cr();
}
return entry_point;
}
......
......@@ -55,8 +55,6 @@ public:
Register temp2,
bool for_compiler_entry);
static void trace_method_handle(MacroAssembler* _masm, const char* adaptername) PRODUCT_RETURN;
static Register saved_last_sp_register() {
// Should be in sharedRuntime, not here.
return LP64_ONLY(r13) NOT_LP64(rsi);
......
......@@ -973,9 +973,12 @@ Klass* SystemDictionary::find_well_known_klass(Symbol* class_name) {
if (sid != vmSymbols::NO_SID) {
Klass* k = NULL;
switch (sid) {
#define WK_KLASS_CASE(name, symbol, ignore_option) \
#define WK_KLASS_CASE(name, symbol, option) \
case vmSymbols::VM_SYMBOL_ENUM_NAME(symbol): \
k = WK_KLASS(name); break;
if (option == Pre_Link) { \
k = WK_KLASS(name); \
} \
break;
WK_KLASSES_DO(WK_KLASS_CASE)
#undef WK_KLASS_CASE
}
......@@ -1955,6 +1958,16 @@ void SystemDictionary::initialize_wk_klasses_until(WKID limit_id, WKID &start_id
start_id = limit_id;
}
#ifdef ASSERT
void SystemDictionary::check_wk_pre_link_klasses() {
#define WK_KLASS_CHECK(name, symbol, option) \
if (option == Pre_Link) { \
assert(name()->is_public(), ""); \
}
WK_KLASSES_DO(WK_KLASS_CHECK);
#undef WK_KLASS_CHECK
}
#endif
void SystemDictionary::initialize_preloaded_classes(TRAPS) {
assert(WK_KLASS(Object_klass) == NULL, "preloaded classes should only be initialized once");
......@@ -2010,6 +2023,8 @@ void SystemDictionary::initialize_preloaded_classes(TRAPS) {
initialize_wk_klasses_until(WKID_LIMIT, scan, CHECK);
check_wk_pre_link_klasses();
_box_klasses[T_BOOLEAN] = WK_KLASS(Boolean_klass);
_box_klasses[T_CHAR] = WK_KLASS(Character_klass);
_box_klasses[T_FLOAT] = WK_KLASS(Float_klass);
......
......@@ -92,93 +92,93 @@ class SymbolPropertyTable;
// The order of these definitions is significant; it is the order in which
// preloading is actually performed by initialize_preloaded_classes.
#define WK_KLASSES_DO(template) \
#define WK_KLASSES_DO(do_klass) \
/* well-known classes */ \
template(Object_klass, java_lang_Object, Pre) \
template(String_klass, java_lang_String, Pre) \
template(Class_klass, java_lang_Class, Pre) \
template(Cloneable_klass, java_lang_Cloneable, Pre) \
template(ClassLoader_klass, java_lang_ClassLoader, Pre) \
template(Serializable_klass, java_io_Serializable, Pre) \
template(System_klass, java_lang_System, Pre) \
template(Throwable_klass, java_lang_Throwable, Pre) \
template(Error_klass, java_lang_Error, Pre) \
template(ThreadDeath_klass, java_lang_ThreadDeath, Pre) \
template(Exception_klass, java_lang_Exception, Pre) \
template(RuntimeException_klass, java_lang_RuntimeException, Pre) \
template(ProtectionDomain_klass, java_security_ProtectionDomain, Pre) \
template(AccessControlContext_klass, java_security_AccessControlContext, Pre) \
template(ClassNotFoundException_klass, java_lang_ClassNotFoundException, Pre) \
template(NoClassDefFoundError_klass, java_lang_NoClassDefFoundError, Pre) \
template(LinkageError_klass, java_lang_LinkageError, Pre) \
template(ClassCastException_klass, java_lang_ClassCastException, Pre) \
template(ArrayStoreException_klass, java_lang_ArrayStoreException, Pre) \
template(VirtualMachineError_klass, java_lang_VirtualMachineError, Pre) \
template(OutOfMemoryError_klass, java_lang_OutOfMemoryError, Pre) \
template(StackOverflowError_klass, java_lang_StackOverflowError, Pre) \
template(IllegalMonitorStateException_klass, java_lang_IllegalMonitorStateException, Pre) \
template(Reference_klass, java_lang_ref_Reference, Pre) \
do_klass(Object_klass, java_lang_Object, Pre_Link ) \
do_klass(String_klass, java_lang_String, Pre_Link ) \
do_klass(Class_klass, java_lang_Class, Pre_Link ) \
do_klass(Cloneable_klass, java_lang_Cloneable, Pre_Link ) \
do_klass(ClassLoader_klass, java_lang_ClassLoader, Pre_Link ) \
do_klass(Serializable_klass, java_io_Serializable, Pre_Link ) \
do_klass(System_klass, java_lang_System, Pre_Link ) \
do_klass(Throwable_klass, java_lang_Throwable, Pre_Link ) \
do_klass(Error_klass, java_lang_Error, Pre_Link ) \
do_klass(ThreadDeath_klass, java_lang_ThreadDeath, Pre_Link ) \
do_klass(Exception_klass, java_lang_Exception, Pre_Link ) \
do_klass(RuntimeException_klass, java_lang_RuntimeException, Pre_Link ) \
do_klass(ProtectionDomain_klass, java_security_ProtectionDomain, Pre_Link ) \
do_klass(AccessControlContext_klass, java_security_AccessControlContext, Pre_Link ) \
do_klass(ClassNotFoundException_klass, java_lang_ClassNotFoundException, Pre_Link ) \
do_klass(NoClassDefFoundError_klass, java_lang_NoClassDefFoundError, Pre_Link ) \
do_klass(LinkageError_klass, java_lang_LinkageError, Pre_Link ) \
do_klass(ClassCastException_klass, java_lang_ClassCastException, Pre_Link ) \
do_klass(ArrayStoreException_klass, java_lang_ArrayStoreException, Pre_Link ) \
do_klass(VirtualMachineError_klass, java_lang_VirtualMachineError, Pre_Link ) \
do_klass(OutOfMemoryError_klass, java_lang_OutOfMemoryError, Pre_Link ) \
do_klass(StackOverflowError_klass, java_lang_StackOverflowError, Pre_Link ) \
do_klass(IllegalMonitorStateException_klass, java_lang_IllegalMonitorStateException, Pre_Link ) \
do_klass(Reference_klass, java_lang_ref_Reference, Pre_Link ) \
\
/* Preload ref klasses and set reference types */ \
template(SoftReference_klass, java_lang_ref_SoftReference, Pre) \
template(WeakReference_klass, java_lang_ref_WeakReference, Pre) \
template(FinalReference_klass, java_lang_ref_FinalReference, Pre) \
template(PhantomReference_klass, java_lang_ref_PhantomReference, Pre) \
template(Finalizer_klass, java_lang_ref_Finalizer, Pre) \
do_klass(SoftReference_klass, java_lang_ref_SoftReference, Pre_Link ) \
do_klass(WeakReference_klass, java_lang_ref_WeakReference, Pre_Link ) \
do_klass(FinalReference_klass, java_lang_ref_FinalReference, Pre ) \
do_klass(PhantomReference_klass, java_lang_ref_PhantomReference, Pre_Link ) \
do_klass(Finalizer_klass, java_lang_ref_Finalizer, Pre ) \
\
template(Thread_klass, java_lang_Thread, Pre) \
template(ThreadGroup_klass, java_lang_ThreadGroup, Pre) \
template(Properties_klass, java_util_Properties, Pre) \
template(reflect_AccessibleObject_klass, java_lang_reflect_AccessibleObject, Pre) \
template(reflect_Field_klass, java_lang_reflect_Field, Pre) \
template(reflect_Method_klass, java_lang_reflect_Method, Pre) \
template(reflect_Constructor_klass, java_lang_reflect_Constructor, Pre) \
do_klass(Thread_klass, java_lang_Thread, Pre_Link ) \
do_klass(ThreadGroup_klass, java_lang_ThreadGroup, Pre_Link ) \
do_klass(Properties_klass, java_util_Properties, Pre_Link ) \
do_klass(reflect_AccessibleObject_klass, java_lang_reflect_AccessibleObject, Pre_Link ) \
do_klass(reflect_Field_klass, java_lang_reflect_Field, Pre_Link ) \
do_klass(reflect_Method_klass, java_lang_reflect_Method, Pre_Link ) \
do_klass(reflect_Constructor_klass, java_lang_reflect_Constructor, Pre_Link ) \
\
/* NOTE: needed too early in bootstrapping process to have checks based on JDK version */ \
/* Universe::is_gte_jdk14x_version() is not set up by this point. */ \
/* It's okay if this turns out to be NULL in non-1.4 JDKs. */ \
template(reflect_MagicAccessorImpl_klass, sun_reflect_MagicAccessorImpl, Opt) \
template(reflect_MethodAccessorImpl_klass, sun_reflect_MethodAccessorImpl, Opt_Only_JDK14NewRef) \
template(reflect_ConstructorAccessorImpl_klass, sun_reflect_ConstructorAccessorImpl, Opt_Only_JDK14NewRef) \
template(reflect_DelegatingClassLoader_klass, sun_reflect_DelegatingClassLoader, Opt) \
template(reflect_ConstantPool_klass, sun_reflect_ConstantPool, Opt_Only_JDK15) \
template(reflect_UnsafeStaticFieldAccessorImpl_klass, sun_reflect_UnsafeStaticFieldAccessorImpl, Opt_Only_JDK15) \
do_klass(reflect_MagicAccessorImpl_klass, sun_reflect_MagicAccessorImpl, Opt ) \
do_klass(reflect_MethodAccessorImpl_klass, sun_reflect_MethodAccessorImpl, Opt_Only_JDK14NewRef) \
do_klass(reflect_ConstructorAccessorImpl_klass, sun_reflect_ConstructorAccessorImpl, Opt_Only_JDK14NewRef) \
do_klass(reflect_DelegatingClassLoader_klass, sun_reflect_DelegatingClassLoader, Opt ) \
do_klass(reflect_ConstantPool_klass, sun_reflect_ConstantPool, Opt_Only_JDK15 ) \
do_klass(reflect_UnsafeStaticFieldAccessorImpl_klass, sun_reflect_UnsafeStaticFieldAccessorImpl, Opt_Only_JDK15 ) \
\
/* support for dynamic typing; it's OK if these are NULL in earlier JDKs */ \
template(MethodHandle_klass, java_lang_invoke_MethodHandle, Pre_JSR292) \
template(MemberName_klass, java_lang_invoke_MemberName, Pre_JSR292) \
template(MethodHandleNatives_klass, java_lang_invoke_MethodHandleNatives, Pre_JSR292) \
template(LambdaForm_klass, java_lang_invoke_LambdaForm, Opt) \
template(MethodType_klass, java_lang_invoke_MethodType, Pre_JSR292) \
template(BootstrapMethodError_klass, java_lang_BootstrapMethodError, Pre_JSR292) \
template(CallSite_klass, java_lang_invoke_CallSite, Pre_JSR292) \
template(ConstantCallSite_klass, java_lang_invoke_ConstantCallSite, Pre_JSR292) \
template(MutableCallSite_klass, java_lang_invoke_MutableCallSite, Pre_JSR292) \
template(VolatileCallSite_klass, java_lang_invoke_VolatileCallSite, Pre_JSR292) \
do_klass(MethodHandle_klass, java_lang_invoke_MethodHandle, Pre_Link ) \
do_klass(MemberName_klass, java_lang_invoke_MemberName, Pre ) \
do_klass(MethodHandleNatives_klass, java_lang_invoke_MethodHandleNatives, Pre ) \
do_klass(LambdaForm_klass, java_lang_invoke_LambdaForm, Opt ) \
do_klass(MethodType_klass, java_lang_invoke_MethodType, Pre_Link ) \
do_klass(BootstrapMethodError_klass, java_lang_BootstrapMethodError, Pre_Link ) \
do_klass(CallSite_klass, java_lang_invoke_CallSite, Pre_Link ) \
do_klass(ConstantCallSite_klass, java_lang_invoke_ConstantCallSite, Pre_Link ) \
do_klass(MutableCallSite_klass, java_lang_invoke_MutableCallSite, Pre_Link ) \
do_klass(VolatileCallSite_klass, java_lang_invoke_VolatileCallSite, Pre_Link ) \
/* Note: MethodHandle must be first, and VolatileCallSite last in group */ \
\
template(StringBuffer_klass, java_lang_StringBuffer, Pre) \
template(StringBuilder_klass, java_lang_StringBuilder, Pre) \
do_klass(StringBuffer_klass, java_lang_StringBuffer, Pre_Link ) \
do_klass(StringBuilder_klass, java_lang_StringBuilder, Pre_Link ) \
\
/* It's NULL in non-1.4 JDKs. */ \
template(StackTraceElement_klass, java_lang_StackTraceElement, Opt) \
do_klass(StackTraceElement_klass, java_lang_StackTraceElement, Opt ) \
/* Universe::is_gte_jdk14x_version() is not set up by this point. */ \
/* It's okay if this turns out to be NULL in non-1.4 JDKs. */ \
template(nio_Buffer_klass, java_nio_Buffer, Opt) \
do_klass(nio_Buffer_klass, java_nio_Buffer, Opt ) \
\
template(DownloadManager_klass, sun_jkernel_DownloadManager, Opt_Kernel) \
do_klass(DownloadManager_klass, sun_jkernel_DownloadManager, Opt_Kernel ) \
\
template(PostVMInitHook_klass, sun_misc_PostVMInitHook, Opt) \
do_klass(PostVMInitHook_klass, sun_misc_PostVMInitHook, Opt ) \
\
/* Preload boxing klasses */ \
template(Boolean_klass, java_lang_Boolean, Pre) \
template(Character_klass, java_lang_Character, Pre) \
template(Float_klass, java_lang_Float, Pre) \
template(Double_klass, java_lang_Double, Pre) \
template(Byte_klass, java_lang_Byte, Pre) \
template(Short_klass, java_lang_Short, Pre) \
template(Integer_klass, java_lang_Integer, Pre) \
template(Long_klass, java_lang_Long, Pre) \
do_klass(Boolean_klass, java_lang_Boolean, Pre_Link ) \
do_klass(Character_klass, java_lang_Character, Pre_Link ) \
do_klass(Float_klass, java_lang_Float, Pre_Link ) \
do_klass(Double_klass, java_lang_Double, Pre_Link ) \
do_klass(Byte_klass, java_lang_Byte, Pre_Link ) \
do_klass(Short_klass, java_lang_Short, Pre_Link ) \
do_klass(Integer_klass, java_lang_Integer, Pre_Link ) \
do_klass(Long_klass, java_lang_Long, Pre_Link ) \
/*end*/
......@@ -201,7 +201,7 @@ class SystemDictionary : AllStatic {
enum InitOption {
Pre, // preloaded; error if not present
Pre_JSR292, // preloaded if EnableInvokeDynamic
Pre_Link, // preloaded; error if not present; link as well-known
// Order is significant. Options before this point require resolve_or_fail.
// Options after this point will use resolve_or_null instead.
......@@ -392,9 +392,9 @@ public:
return k;
}
static Klass* check_klass_Pre(Klass* k) { return check_klass(k); }
static Klass* check_klass_Pre_JSR292(Klass* k) { return EnableInvokeDynamic ? check_klass(k) : k; }
static Klass* check_klass_Opt(Klass* k) { return k; }
static Klass* check_klass_Pre( Klass* k) { return check_klass(k); }
static Klass* check_klass_Pre_Link( Klass* k) { return check_klass(k); }
static Klass* check_klass_Opt( Klass* k) { return k; }
static Klass* check_klass_Opt_Kernel(Klass* k) { return k; } //== Opt
static Klass* check_klass_Opt_Only_JDK15(Klass* k) {
assert(JDK_Version::is_gte_jdk15x_version(), "JDK 1.5 only");
......@@ -413,6 +413,8 @@ public:
initialize_wk_klasses_until((WKID) limit, start_id, THREAD);
}
static void check_wk_pre_link_klasses() NOT_DEBUG_RETURN;
public:
#define WK_KLASS_DECLARE(name, symbol, option) \
static Klass* name() { return check_klass_##option(_well_known_klasses[WK_KLASS_ENUM_NAME(name)]); } \
......
......@@ -324,24 +324,6 @@ vmIntrinsics::ID vmIntrinsics::for_raw_conversion(BasicType src, BasicType dest)
return vmIntrinsics::_none;
}
Method* vmIntrinsics::method_for(vmIntrinsics::ID id) {
if (id == _none) return NULL;
Symbol* cname = vmSymbols::symbol_at(class_for(id));
Symbol* mname = vmSymbols::symbol_at(name_for(id));
Symbol* msig = vmSymbols::symbol_at(signature_for(id));
if (cname == NULL || mname == NULL || msig == NULL) return NULL;
Klass* k = SystemDictionary::find_well_known_klass(cname);
if (k == NULL) return NULL;
Method* m = InstanceKlass::cast(k)->find_method(mname, msig);
if (m == NULL &&
cname == vmSymbols::java_lang_invoke_MethodHandle() &&
msig == vmSymbols::star_name()) {
// Any signature polymorphic method is represented by a fixed concrete signature:
m = InstanceKlass::cast(k)->find_method(mname, vmSymbols::object_array_object_signature());
}
return m;
}
#define VM_INTRINSIC_INITIALIZE(id, klass, name, sig, flags) #id "\0"
static const char* vm_intrinsic_name_bodies =
......
......@@ -1138,9 +1138,6 @@ public:
static const char* short_name_as_C_string(ID id, char* buf, int size);
// Access to intrinsic methods:
static Method* method_for(ID id);
// Wrapper object methods:
static ID for_boxing(BasicType type);
static ID for_unboxing(BasicType type);
......
......@@ -2378,7 +2378,9 @@ const TypeOopPtr* LibraryCallKit::sharpen_unsafe_type(Compile::AliasType* alias_
}
}
if (sharpened_klass != NULL) {
// The sharpened class might be unloaded if there is no class loader
// contraint in place.
if (sharpened_klass != NULL && sharpened_klass->is_loaded()) {
const TypeOopPtr* tjp = TypeOopPtr::make_from_klass(sharpened_klass);
#ifndef PRODUCT
......
......@@ -196,7 +196,27 @@ public:
# include "methodHandles_ppc.hpp"
#endif
// Tracing
static void trace_method_handle(MacroAssembler* _masm, const char* adaptername) PRODUCT_RETURN;
static void trace_method_handle_interpreter_entry(MacroAssembler* _masm, vmIntrinsics::ID iid) {
if (TraceMethodHandles) {
const char* name = vmIntrinsics::name_at(iid);
if (*name == '_') name += 1;
const size_t len = strlen(name) + 50;
char* qname = NEW_C_HEAP_ARRAY(char, len, mtInternal);
const char* suffix = "";
if (is_signature_polymorphic(iid)) {
if (is_signature_polymorphic_static(iid))
suffix = "/static";
else
suffix = "/private";
}
jio_snprintf(qname, len, "MethodHandle::interpreter_entry::%s%s", name, suffix);
trace_method_handle(_masm, qname);
// Note: Don't free the allocated char array because it's used
// during runtime.
}
}
};
......
......@@ -1000,7 +1000,7 @@ class CommandLineFlags {
product(bool, ClassUnloading, true, \
"Do unloading of classes") \
\
diagnostic(bool, LinkWellKnownClasses, false, \
diagnostic(bool, LinkWellKnownClasses, true, \
"Resolve a well known class as soon as its name is seen") \
\
develop(bool, DisableStartThread, false, \
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册