systemDictionary.hpp revision 10420:c558850fac57
155714Skris/* 255714Skris * Copyright (c) 1997, 2016, Oracle and/or its affiliates. All rights reserved. 355714Skris * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 455714Skris * 555714Skris * This code is free software; you can redistribute it and/or modify it 655714Skris * under the terms of the GNU General Public License version 2 only, as 755714Skris * published by the Free Software Foundation. 8280297Sjkim * 955714Skris * This code is distributed in the hope that it will be useful, but WITHOUT 1055714Skris * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 1155714Skris * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 1255714Skris * version 2 for more details (a copy is included in the LICENSE file that 1355714Skris * accompanied this code). 1455714Skris * 15280297Sjkim * You should have received a copy of the GNU General Public License version 1655714Skris * 2 along with this work; if not, write to the Free Software Foundation, 1755714Skris * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 1855714Skris * 1955714Skris * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 2055714Skris * or visit www.oracle.com if you need additional information or have any 2155714Skris * questions. 22280297Sjkim * 2355714Skris */ 2455714Skris 2555714Skris#ifndef SHARE_VM_CLASSFILE_SYSTEMDICTIONARY_HPP 2655714Skris#define SHARE_VM_CLASSFILE_SYSTEMDICTIONARY_HPP 2755714Skris 2855714Skris#include "classfile/classLoader.hpp" 2955714Skris#include "classfile/systemDictionary_ext.hpp" 3055714Skris#include "jvmci/systemDictionary_jvmci.hpp" 3155714Skris#include "oops/objArrayOop.hpp" 3255714Skris#include "oops/symbol.hpp" 3355714Skris#include "runtime/java.hpp" 3455714Skris#include "runtime/reflectionUtils.hpp" 3555714Skris#include "utilities/hashtable.hpp" 3655714Skris#include "utilities/hashtable.inline.hpp" 37280297Sjkim 3855714Skris// The system dictionary stores all loaded classes and maps: 3955714Skris// 40280297Sjkim// [class name,class loader] -> class i.e. [Symbol*,oop] -> Klass* 4155714Skris// 4255714Skris// Classes are loaded lazily. The default VM class loader is 4355714Skris// represented as NULL. 4455714Skris 4555714Skris// The underlying data structure is an open hash table with a fixed number 4655714Skris// of buckets. During loading the loader object is locked, (for the VM loader 4755714Skris// a private lock object is used). Class loading can thus be done concurrently, 4855714Skris// but only by different loaders. 4955714Skris// 5055714Skris// During loading a placeholder (name, loader) is temporarily placed in 5155714Skris// a side data structure, and is used to detect ClassCircularityErrors 52280297Sjkim// and to perform verification during GC. A GC can occur in the midst 5355714Skris// of class loading, as we call out to Java, have to take locks, etc. 5455714Skris// 5555714Skris// When class loading is finished, a new entry is added to the system 5655714Skris// dictionary and the place holder is removed. Note that the protection 5755714Skris// domain field of the system dictionary has not yet been filled in when 5859191Skris// the "real" system dictionary entry is created. 59100928Snectar// 6059191Skris// Clients of this class who are interested in finding if a class has 6159191Skris// been completely loaded -- not classes in the process of being loaded -- 6259191Skris// can read the SystemDictionary unlocked. This is safe because 6359191Skris// - entries are only deleted at safepoints 6459191Skris// - readers cannot come to a safepoint while actively examining 6559191Skris// an entry (an entry cannot be deleted from under a reader) 66280297Sjkim// - entries must be fully formed before they are available to concurrent 6759191Skris// readers (we must ensure write ordering) 6859191Skris// 6959191Skris// Note that placeholders are deleted at any time, as they are removed 7059191Skris// when a class is completely loaded. Therefore, readers as well as writers 7159191Skris// of placeholders must hold the SystemDictionary_lock. 7259191Skris// 7359191Skris 7459191Skrisclass ClassFileStream; 7559191Skrisclass Dictionary; 7659191Skrisclass PlaceholderTable; 7759191Skrisclass LoaderConstraintTable; 7859191Skristemplate <MEMFLAGS F> class HashtableBucket; 7959191Skrisclass ResolutionErrorTable; 8059191Skrisclass SymbolPropertyTable; 8159191Skris 8259191Skris// Certain classes are preloaded, such as java.lang.Object and java.lang.String. 8359191Skris// They are all "well-known", in the sense that no class loader is allowed 8459191Skris// to provide a different definition. 8559191Skris// 8659191Skris// These klasses must all have names defined in vmSymbols. 8759191Skris 8859191Skris#define WK_KLASS_ENUM_NAME(kname) kname##_knum 8959191Skris 9059191Skris// Each well-known class has a short klass name (like object_klass), 9159191Skris// a vmSymbol name (like java_lang_Object), and a flag word 9259191Skris// that makes some minor distinctions, like whether the klass 9359191Skris// is preloaded, optional, release-specific, etc. 9459191Skris// The order of these definitions is significant; it is the order in which 9559191Skris// preloading is actually performed by initialize_preloaded_classes. 9659191Skris 9759191Skris#define WK_KLASSES_DO(do_klass) \ 9859191Skris /* well-known classes */ \ 9959191Skris do_klass(Object_klass, java_lang_Object, Pre ) \ 10059191Skris do_klass(String_klass, java_lang_String, Pre ) \ 10159191Skris do_klass(Class_klass, java_lang_Class, Pre ) \ 10259191Skris do_klass(Cloneable_klass, java_lang_Cloneable, Pre ) \ 10359191Skris do_klass(ClassLoader_klass, java_lang_ClassLoader, Pre ) \ 10459191Skris do_klass(Serializable_klass, java_io_Serializable, Pre ) \ 10559191Skris do_klass(System_klass, java_lang_System, Pre ) \ 10659191Skris do_klass(Throwable_klass, java_lang_Throwable, Pre ) \ 10759191Skris do_klass(Error_klass, java_lang_Error, Pre ) \ 10859191Skris do_klass(ThreadDeath_klass, java_lang_ThreadDeath, Pre ) \ 10959191Skris do_klass(Exception_klass, java_lang_Exception, Pre ) \ 11059191Skris do_klass(RuntimeException_klass, java_lang_RuntimeException, Pre ) \ 111160814Ssimon do_klass(SecurityManager_klass, java_lang_SecurityManager, Pre ) \ 112160814Ssimon do_klass(ProtectionDomain_klass, java_security_ProtectionDomain, Pre ) \ 113280297Sjkim do_klass(AccessControlContext_klass, java_security_AccessControlContext, Pre ) \ 114160814Ssimon do_klass(SecureClassLoader_klass, java_security_SecureClassLoader, Pre ) \ 115160814Ssimon do_klass(ClassNotFoundException_klass, java_lang_ClassNotFoundException, Pre ) \ 11655714Skris do_klass(NoClassDefFoundError_klass, java_lang_NoClassDefFoundError, Pre ) \ 117109998Smarkm do_klass(LinkageError_klass, java_lang_LinkageError, Pre ) \ 11859191Skris do_klass(ClassCastException_klass, java_lang_ClassCastException, Pre ) \ 11955714Skris do_klass(ArrayStoreException_klass, java_lang_ArrayStoreException, Pre ) \ 120109998Smarkm do_klass(VirtualMachineError_klass, java_lang_VirtualMachineError, Pre ) \ 12155714Skris do_klass(OutOfMemoryError_klass, java_lang_OutOfMemoryError, Pre ) \ 12255714Skris do_klass(StackOverflowError_klass, java_lang_StackOverflowError, Pre ) \ 12355714Skris do_klass(IllegalMonitorStateException_klass, java_lang_IllegalMonitorStateException, Pre ) \ 12455714Skris do_klass(Reference_klass, java_lang_ref_Reference, Pre ) \ 12555714Skris \ 12655714Skris /* Preload ref klasses and set reference types */ \ 127280297Sjkim do_klass(SoftReference_klass, java_lang_ref_SoftReference, Pre ) \ 128280297Sjkim do_klass(WeakReference_klass, java_lang_ref_WeakReference, Pre ) \ 129280297Sjkim do_klass(FinalReference_klass, java_lang_ref_FinalReference, Pre ) \ 130280297Sjkim do_klass(PhantomReference_klass, java_lang_ref_PhantomReference, Pre ) \ 13159191Skris do_klass(Finalizer_klass, java_lang_ref_Finalizer, Pre ) \ 132280297Sjkim \ 133280297Sjkim do_klass(Thread_klass, java_lang_Thread, Pre ) \ 13459191Skris do_klass(ThreadGroup_klass, java_lang_ThreadGroup, Pre ) \ 135280297Sjkim do_klass(Properties_klass, java_util_Properties, Pre ) \ 136280297Sjkim do_klass(reflect_AccessibleObject_klass, java_lang_reflect_AccessibleObject, Pre ) \ 137280297Sjkim do_klass(reflect_Field_klass, java_lang_reflect_Field, Pre ) \ 138280297Sjkim do_klass(reflect_Module_klass, java_lang_reflect_Module, Pre ) \ 139280297Sjkim do_klass(reflect_Parameter_klass, java_lang_reflect_Parameter, Opt ) \ 140280297Sjkim do_klass(reflect_Method_klass, java_lang_reflect_Method, Pre ) \ 141280297Sjkim do_klass(reflect_Constructor_klass, java_lang_reflect_Constructor, Pre ) \ 142280297Sjkim \ 143280297Sjkim /* NOTE: needed too early in bootstrapping process to have checks based on JDK version */ \ 144280297Sjkim /* It's okay if this turns out to be NULL in non-1.4 JDKs. */ \ 145280297Sjkim do_klass(reflect_MagicAccessorImpl_klass, sun_reflect_MagicAccessorImpl, Opt ) \ 14659191Skris do_klass(reflect_MethodAccessorImpl_klass, sun_reflect_MethodAccessorImpl, Pre ) \ 147280297Sjkim do_klass(reflect_ConstructorAccessorImpl_klass, sun_reflect_ConstructorAccessorImpl, Pre ) \ 148280297Sjkim do_klass(reflect_DelegatingClassLoader_klass, sun_reflect_DelegatingClassLoader, Opt ) \ 149280297Sjkim do_klass(reflect_ConstantPool_klass, sun_reflect_ConstantPool, Opt ) \ 150280297Sjkim do_klass(reflect_UnsafeStaticFieldAccessorImpl_klass, sun_reflect_UnsafeStaticFieldAccessorImpl, Opt ) \ 151280297Sjkim do_klass(reflect_CallerSensitive_klass, sun_reflect_CallerSensitive, Opt ) \ 152280297Sjkim \ 153280297Sjkim /* support for dynamic typing; it's OK if these are NULL in earlier JDKs */ \ 154280297Sjkim do_klass(DirectMethodHandle_klass, java_lang_invoke_DirectMethodHandle, Opt ) \ 155280297Sjkim do_klass(MethodHandle_klass, java_lang_invoke_MethodHandle, Pre ) \ 156280297Sjkim do_klass(MemberName_klass, java_lang_invoke_MemberName, Pre ) \ 157280297Sjkim do_klass(MethodHandleNatives_klass, java_lang_invoke_MethodHandleNatives, Pre ) \ 158280297Sjkim do_klass(LambdaForm_klass, java_lang_invoke_LambdaForm, Opt ) \ 15959191Skris do_klass(MethodType_klass, java_lang_invoke_MethodType, Pre ) \ 160280297Sjkim do_klass(BootstrapMethodError_klass, java_lang_BootstrapMethodError, Pre ) \ 161290207Sjkim do_klass(CallSite_klass, java_lang_invoke_CallSite, Pre ) \ 162280297Sjkim do_klass(Context_klass, java_lang_invoke_MethodHandleNatives_CallSiteContext, Pre ) \ 163280297Sjkim do_klass(ConstantCallSite_klass, java_lang_invoke_ConstantCallSite, Pre ) \ 16455714Skris do_klass(MutableCallSite_klass, java_lang_invoke_MutableCallSite, Pre ) \ 165280297Sjkim do_klass(VolatileCallSite_klass, java_lang_invoke_VolatileCallSite, Pre ) \ 166290207Sjkim /* Note: MethodHandle must be first, and VolatileCallSite last in group */ \ 16755714Skris \ 168280297Sjkim do_klass(StringBuffer_klass, java_lang_StringBuffer, Pre ) \ 169280297Sjkim do_klass(StringBuilder_klass, java_lang_StringBuilder, Pre ) \ 170280297Sjkim do_klass(internal_Unsafe_klass, jdk_internal_misc_Unsafe, Pre ) \ 171284283Sjkim do_klass(module_Modules_klass, jdk_internal_module_Modules, Pre ) \ 172280297Sjkim \ 173280297Sjkim /* support for CDS */ \ 174280297Sjkim do_klass(ByteArrayInputStream_klass, java_io_ByteArrayInputStream, Pre ) \ 175280297Sjkim do_klass(File_klass, java_io_File, Pre ) \ 17655714Skris do_klass(URL_klass, java_net_URL, Pre ) \ 177280297Sjkim do_klass(Jar_Manifest_klass, java_util_jar_Manifest, Pre ) \ 178280297Sjkim do_klass(jdk_internal_loader_ClassLoaders_AppClassLoader_klass, jdk_internal_loader_ClassLoaders_AppClassLoader, Pre ) \ 179280297Sjkim do_klass(jdk_internal_loader_ClassLoaders_PlatformClassLoader_klass, jdk_internal_loader_ClassLoaders_PlatformClassLoader, Pre ) \ 180280297Sjkim do_klass(CodeSource_klass, java_security_CodeSource, Pre ) \ 181280297Sjkim do_klass(ParseUtil_klass, sun_net_www_ParseUtil, Pre ) \ 182280297Sjkim \ 183280297Sjkim do_klass(StackTraceElement_klass, java_lang_StackTraceElement, Opt ) \ 184280297Sjkim \ 185280297Sjkim /* It's okay if this turns out to be NULL in non-1.4 JDKs. */ \ 186280297Sjkim do_klass(nio_Buffer_klass, java_nio_Buffer, Opt ) \ 187280297Sjkim \ 188280297Sjkim /* Stack Walking */ \ 189205128Ssimon do_klass(StackWalker_klass, java_lang_StackWalker, Opt ) \ 190109998Smarkm do_klass(AbstractStackWalker_klass, java_lang_StackStreamFactory_AbstractStackWalker, Opt ) \ 191280297Sjkim do_klass(StackFrameInfo_klass, java_lang_StackFrameInfo, Opt ) \ 192280297Sjkim do_klass(LiveStackFrameInfo_klass, java_lang_LiveStackFrameInfo, Opt ) \ 193280297Sjkim \ 194280297Sjkim /* Preload boxing klasses */ \ 195280297Sjkim do_klass(Boolean_klass, java_lang_Boolean, Pre ) \ 19655714Skris do_klass(Character_klass, java_lang_Character, Pre ) \ 197290207Sjkim do_klass(Float_klass, java_lang_Float, Pre ) \ 198280297Sjkim do_klass(Double_klass, java_lang_Double, Pre ) \ 199280297Sjkim do_klass(Byte_klass, java_lang_Byte, Pre ) \ 20055714Skris do_klass(Short_klass, java_lang_Short, Pre ) \ 201280297Sjkim do_klass(Integer_klass, java_lang_Integer, Pre ) \ 202290207Sjkim do_klass(Long_klass, java_lang_Long, Pre ) \ 203280297Sjkim \ 20455714Skris /* Extensions */ \ 205238405Sjkim WK_KLASSES_DO_EXT(do_klass) \ 206280297Sjkim /* JVMCI classes. These are loaded on-demand. */ \ 207280297Sjkim JVMCI_WK_KLASSES_DO(do_klass) \ 208280297Sjkim \ 209280297Sjkim /*end*/ 210246772Sjkim 211280297Sjkim 212280297Sjkimclass SystemDictionary : AllStatic { 213280297Sjkim friend class VMStructs; 214280297Sjkim friend class SystemDictionaryHandles; 215280297Sjkim friend class SharedClassUtil; 216280297Sjkim 217280297Sjkim public: 218280297Sjkim enum WKID { 219280297Sjkim NO_WKID = 0, 220280297Sjkim 221280297Sjkim #define WK_KLASS_ENUM(name, symbol, ignore_o) WK_KLASS_ENUM_NAME(name), WK_KLASS_ENUM_NAME(symbol) = WK_KLASS_ENUM_NAME(name), 222280297Sjkim WK_KLASSES_DO(WK_KLASS_ENUM) 223280297Sjkim #undef WK_KLASS_ENUM 224280297Sjkim 225280297Sjkim WKID_LIMIT, 226280297Sjkim 227238405Sjkim#if INCLUDE_JVMCI 228280297Sjkim FIRST_JVMCI_WKID = WK_KLASS_ENUM_NAME(HotSpotCompiledCode_klass), 229280297Sjkim LAST_JVMCI_WKID = WK_KLASS_ENUM_NAME(Value_klass), 230280297Sjkim#endif 231280297Sjkim 232280297Sjkim FIRST_WKID = NO_WKID + 1 233238405Sjkim }; 234238405Sjkim 23555714Skris enum InitOption { 236280297Sjkim Pre, // preloaded; error if not present 237280297Sjkim 238280297Sjkim // Order is significant. Options before this point require resolve_or_fail. 239280297Sjkim // Options after this point will use resolve_or_null instead. 24055714Skris 241238405Sjkim Opt, // preload tried; NULL if not present 242280297Sjkim#if INCLUDE_JVMCI 243280297Sjkim Jvmci, // preload tried; error if not present, use only with JVMCI 244290207Sjkim#endif 245280297Sjkim OPTION_LIMIT, 246238405Sjkim CEIL_LG_OPTION_LIMIT = 2 // OPTION_LIMIT <= (1<<CEIL_LG_OPTION_LIMIT) 24755714Skris }; 248280297Sjkim 249280297Sjkim 25055714Skris // Returns a class with a given class name and class loader. Loads the 251280297Sjkim // class if needed. If not found a NoClassDefFoundError or a 252280297Sjkim // ClassNotFoundException is thrown, depending on the value on the 25355714Skris // throw_error flag. For most uses the throw_error argument should be set 254280297Sjkim // to true. 255280297Sjkim 256280297Sjkim static Klass* resolve_or_fail(Symbol* class_name, Handle class_loader, Handle protection_domain, bool throw_error, TRAPS); 257280297Sjkim // Convenient call for null loader and protection domain. 258280297Sjkim static Klass* resolve_or_fail(Symbol* class_name, bool throw_error, TRAPS); 259280297Sjkimprotected: 260280297Sjkim // handle error translation for resolve_or_null results 26155714Skris static Klass* handle_resolution_exception(Symbol* class_name, bool throw_error, KlassHandle klass_h, TRAPS); 262280297Sjkim 263280297Sjkimpublic: 26455714Skris 265280297Sjkim // Returns a class with a given class name and class loader. 266280297Sjkim // Loads the class if needed. If not found NULL is returned. 267280297Sjkim static Klass* resolve_or_null(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS); 268280297Sjkim // Version with null loader and protection domain 269280297Sjkim static Klass* resolve_or_null(Symbol* class_name, TRAPS); 27055714Skris 271280297Sjkim // Resolve a superclass or superinterface. Called from ClassFileParser, 272280297Sjkim // parse_interfaces, resolve_instance_class_or_null, load_shared_class 273280297Sjkim // "child_name" is the class whose super class or interface is being resolved. 274280297Sjkim static Klass* resolve_super_or_fail(Symbol* child_name, 275280297Sjkim Symbol* class_name, 27655714Skris Handle class_loader, 277280297Sjkim Handle protection_domain, 278280297Sjkim bool is_superclass, 279280297Sjkim TRAPS); 280280297Sjkim 281280297Sjkim // Parse new stream. This won't update the system dictionary or 282280297Sjkim // class hierarchy, simply parse the stream. Used by JVMTI RedefineClasses. 283280297Sjkim static Klass* parse_stream(Symbol* class_name, 284280297Sjkim Handle class_loader, 285280297Sjkim Handle protection_domain, 286280297Sjkim ClassFileStream* st, 287280297Sjkim TRAPS) { 288280297Sjkim return parse_stream(class_name, 289205128Ssimon class_loader, 290280297Sjkim protection_domain, 291280297Sjkim st, 292280297Sjkim NULL, // host klass 293280297Sjkim NULL, // cp_patches 294280297Sjkim THREAD); 29555714Skris } 296280297Sjkim static Klass* parse_stream(Symbol* class_name, 297280297Sjkim Handle class_loader, 298280297Sjkim Handle protection_domain, 299280297Sjkim ClassFileStream* st, 300280297Sjkim const Klass* host_klass, 301280297Sjkim GrowableArray<Handle>* cp_patches, 302280297Sjkim TRAPS); 303280297Sjkim 30455714Skris // Resolve from stream (called by jni_DefineClass and JVM_DefineClass) 30555714Skris static Klass* resolve_from_stream(Symbol* class_name, 306280297Sjkim Handle class_loader, 307280297Sjkim Handle protection_domain, 30855714Skris ClassFileStream* st, 309280297Sjkim TRAPS); 310280297Sjkim 311280297Sjkim // Lookup an already loaded class. If not found NULL is returned. 312280297Sjkim static Klass* find(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS); 313280297Sjkim 31455714Skris // Lookup an already loaded instance or array class. 315280297Sjkim // Do not make any queries to class loaders; consult only the cache. 316280297Sjkim // If not found NULL is returned. 31755714Skris static Klass* find_instance_or_array_klass(Symbol* class_name, 318280297Sjkim Handle class_loader, 319280297Sjkim Handle protection_domain, 320280297Sjkim TRAPS); 32155714Skris 322290207Sjkim // Lookup an instance or array class that has already been loaded 323280297Sjkim // either into the given class loader, or else into another class 324280297Sjkim // loader that is constrained (via loader constraints) to produce 325290207Sjkim // a consistent class. Do not take protection domains into account. 326205128Ssimon // Do not make any queries to class loaders; consult only the cache. 327290207Sjkim // Return NULL if the class is not found. 328290207Sjkim // 329205128Ssimon // This function is a strict superset of find_instance_or_array_klass. 330290207Sjkim // This function (the unchecked version) makes a conservative prediction 331290207Sjkim // of the result of the checked version, assuming successful lookup. 332280297Sjkim // If both functions return non-null, they must return the same value. 333280297Sjkim // Also, the unchecked version may sometimes be non-null where the 334290207Sjkim // checked version is null. This can occur in several ways: 335290207Sjkim // 1. No query has yet been made to the class loader. 336280297Sjkim // 2. The class loader was queried, but chose not to delegate. 33755714Skris // 3. ClassLoader.checkPackageAccess rejected a proposed protection domain. 338280297Sjkim // 4. Loading was attempted, but there was a linkage error of some sort. 339280297Sjkim // In all of these cases, the loader constraints on this type are 340280297Sjkim // satisfied, and it is safe for classes in the given class loader 341280297Sjkim // to manipulate strongly-typed values of the found class, subject 34259191Skris // to local linkage and access checks. 34355714Skris static Klass* find_constrained_instance_or_array_klass(Symbol* class_name, 344280297Sjkim Handle class_loader, 345280297Sjkim TRAPS); 346280297Sjkim 347280297Sjkim // Iterate over all klasses in dictionary 348280297Sjkim // Just the classes from defining class loaders 34955714Skris static void classes_do(void f(Klass*)); 350280297Sjkim // Added for initialize_itable_for_klass to handle exceptions 351280297Sjkim static void classes_do(void f(Klass*, TRAPS), TRAPS); 352280297Sjkim // All classes, and their class loaders 353280297Sjkim static void classes_do(void f(Klass*, ClassLoaderData*)); 354280297Sjkim 355280297Sjkim static void placeholders_do(void f(Symbol*)); 356280297Sjkim 357280297Sjkim // Iterate over all methods in all klasses in dictionary 358280297Sjkim static void methods_do(void f(Method*)); 359306198Sjkim 360280297Sjkim // Garbage collection support 361280297Sjkim 362280297Sjkim // This method applies "blk->do_oop" to all the pointers to "system" 36355714Skris // classes and loaders. 364280297Sjkim static void always_strong_oops_do(OopClosure* blk); 36555714Skris static void always_strong_classes_do(KlassClosure* closure); 366306198Sjkim 367280297Sjkim // Unload (that is, break root links to) all unmarked classes and 36859191Skris // loaders. Returns "true" iff something was unloaded. 369280297Sjkim static bool do_unloading(BoolObjectClosure* is_alive, 370306198Sjkim bool clean_previous_versions = true); 371280297Sjkim 372280297Sjkim // Used by DumpSharedSpaces only to remove classes that failed verification 373306198Sjkim static void remove_classes_in_error_state(); 374306198Sjkim 375280297Sjkim static int calculate_systemdictionary_size(int loadedclasses); 376280297Sjkim 377280297Sjkim // Applies "f->do_oop" to all root oops in the system dictionary. 378280297Sjkim static void oops_do(OopClosure* f); 379280297Sjkim static void roots_oops_do(OopClosure* strong, OopClosure* weak); 380280297Sjkim 381280297Sjkim // System loader lock 382109998Smarkm static oop system_loader_lock() { return _system_loader_lock_obj; } 383280297Sjkim 384280297Sjkimprotected: 385280297Sjkim // Extended Redefine classes support (tbi) 386280297Sjkim static void preloaded_classes_do(KlassClosure* f); 387280297Sjkim static void lazily_loaded_classes_do(KlassClosure* f); 388280297Sjkimpublic: 389280297Sjkim // Sharing support. 390280297Sjkim static void reorder_dictionary(); 391280297Sjkim static void copy_buckets(char** top, char* end); 392280297Sjkim static void copy_table(char** top, char* end); 393280297Sjkim static void reverse(); 394280297Sjkim static void set_shared_dictionary(HashtableBucket<mtClass>* t, int length, 39555714Skris int number_of_entries); 396280297Sjkim // Printing 397280297Sjkim static void print(bool details = true); 398306198Sjkim static void print_shared(bool details = true); 399306198Sjkim 400280297Sjkim // Number of contained klasses 401280297Sjkim // This is both fully loaded classes and classes in the process 402280297Sjkim // of being loaded 40359191Skris static int number_of_classes(); 404306198Sjkim 40559191Skris // Monotonically increasing counter which grows as classes are 406280297Sjkim // loaded or modifications such as hot-swapping or setting/removing 407280297Sjkim // of breakpoints are performed 408280297Sjkim static inline int number_of_modifications() { assert_locked_or_safepoint(Compile_lock); return _number_of_modifications; } 409280297Sjkim // Needed by evolution and breakpoint code 410280297Sjkim static inline void notice_modification() { assert_locked_or_safepoint(Compile_lock); ++_number_of_modifications; } 41155714Skris 412280297Sjkim // Verification 41355714Skris static void verify(); 414280297Sjkim 415280297Sjkim#ifdef ASSERT 416280297Sjkim static bool is_internal_format(Symbol* class_name); 417280297Sjkim#endif 418280297Sjkim 419280297Sjkim // Initialization 420306198Sjkim static void initialize(TRAPS); 421306198Sjkim 422306198Sjkim // Fast access to commonly used classes (preloaded) 423306198Sjkim static InstanceKlass* check_klass(InstanceKlass* k) { 424306198Sjkim assert(k != NULL, "preloaded klass not initialized"); 425306198Sjkim return k; 426306198Sjkim } 427280297Sjkim 428280297Sjkim static InstanceKlass* check_klass_Pre(InstanceKlass* k) { return check_klass(k); } 429280297Sjkim static InstanceKlass* check_klass_Opt(InstanceKlass* k) { return k; } 430280297Sjkim 431280297Sjkim JVMCI_ONLY(static InstanceKlass* check_klass_Jvmci(InstanceKlass* k) { return k; }) 43255714Skris 433306198Sjkim static bool initialize_wk_klass(WKID id, int init_opt, TRAPS); 434280297Sjkim static void initialize_wk_klasses_until(WKID limit_id, WKID &start_id, TRAPS); 435280297Sjkim static void initialize_wk_klasses_through(WKID end_id, WKID &start_id, TRAPS) { 436246772Sjkim int limit = (int)end_id + 1; 437280297Sjkim initialize_wk_klasses_until((WKID) limit, start_id, THREAD); 438280297Sjkim } 439280297Sjkim 440280297Sjkimpublic: 441280297Sjkim #define WK_KLASS_DECLARE(name, symbol, option) \ 442280297Sjkim static InstanceKlass* name() { return check_klass_##option(_well_known_klasses[WK_KLASS_ENUM_NAME(name)]); } \ 443280297Sjkim static InstanceKlass** name##_addr() { \ 444280297Sjkim return &SystemDictionary::_well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)]; \ 445280297Sjkim } 446280297Sjkim WK_KLASSES_DO(WK_KLASS_DECLARE); 447280297Sjkim #undef WK_KLASS_DECLARE 448280297Sjkim 449280297Sjkim static InstanceKlass* well_known_klass(WKID id) { 450280297Sjkim assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob"); 451280297Sjkim return _well_known_klasses[id]; 452238405Sjkim } 453280297Sjkim 454280297Sjkim static InstanceKlass** well_known_klass_addr(WKID id) { 455280297Sjkim assert(id >= (int)FIRST_WKID && id < (int)WKID_LIMIT, "oob"); 456280297Sjkim return &_well_known_klasses[id]; 457280297Sjkim } 458280297Sjkim 459238405Sjkim // Local definition for direct access to the private array: 460246772Sjkim #define WK_KLASS(name) _well_known_klasses[SystemDictionary::WK_KLASS_ENUM_NAME(name)] 461280297Sjkim 462306198Sjkim static InstanceKlass* box_klass(BasicType t) { 463306198Sjkim assert((uint)t < T_VOID+1, "range check"); 464280297Sjkim return check_klass(_box_klasses[t]); 465280297Sjkim } 466306198Sjkim static BasicType box_klass_type(Klass* k); // inverse of box_klass 467306198Sjkim 468280297Sjkim // methods returning lazily loaded klasses 469280297Sjkim // The corresponding method to load the class must be called before calling them. 470280297Sjkim static InstanceKlass* abstract_ownable_synchronizer_klass() { return check_klass(_abstract_ownable_synchronizer_klass); } 471280297Sjkim 472280297Sjkim static void load_abstract_ownable_synchronizer_klass(TRAPS); 473280297Sjkim 474280297Sjkimprotected: 475280297Sjkim // Tells whether ClassLoader.loadClassInternal is present 47655714Skris static bool has_loadClassInternal() { return _has_loadClassInternal; } 47755714Skris 478280297Sjkim // Returns the class loader data to be used when looking up/updating the 479280297Sjkim // system dictionary. 480280297Sjkim static ClassLoaderData *class_loader_data(Handle class_loader) { 48155714Skris return ClassLoaderData::class_loader_data(class_loader()); 482280297Sjkim } 483280297Sjkim 484280297Sjkimpublic: 485280297Sjkim // Tells whether ClassLoader.checkPackageAccess is present 486280297Sjkim static bool has_checkPackageAccess() { return _has_checkPackageAccess; } 487280297Sjkim 48855714Skris static bool Parameter_klass_loaded() { return WK_KLASS(reflect_Parameter_klass) != NULL; } 489280297Sjkim static bool Class_klass_loaded() { return WK_KLASS(Class_klass) != NULL; } 490280297Sjkim static bool Cloneable_klass_loaded() { return WK_KLASS(Cloneable_klass) != NULL; } 491280297Sjkim static bool Object_klass_loaded() { return WK_KLASS(Object_klass) != NULL; } 492280297Sjkim static bool ClassLoader_klass_loaded() { return WK_KLASS(ClassLoader_klass) != NULL; } 493280297Sjkim 494280297Sjkim // Returns default system loader 495160814Ssimon static oop java_system_loader(); 496280297Sjkim 497280297Sjkim // Compute the default system loader 498280297Sjkim static void compute_java_system_loader(TRAPS); 499238405Sjkim 500280297Sjkim // Register a new class loader 501280297Sjkim static ClassLoaderData* register_loader(Handle class_loader, TRAPS); 502280297Sjkimprotected: 503280297Sjkim // Mirrors for primitive classes (created eagerly) 504290207Sjkim static oop check_mirror(oop m) { 505290207Sjkim assert(m != NULL, "mirror not initialized"); 506290207Sjkim return m; 507290207Sjkim } 508290207Sjkim 509290207Sjkimpublic: 510290207Sjkim // Note: java_lang_Class::primitive_type is the inverse of java_mirror 511290207Sjkim 512290207Sjkim // Check class loader constraints 513290207Sjkim static bool add_loader_constraint(Symbol* name, Handle loader1, 514280297Sjkim Handle loader2, TRAPS); 515290207Sjkim static Symbol* check_signature_loaders(Symbol* signature, Handle loader1, 516280297Sjkim Handle loader2, bool is_method, TRAPS); 517280297Sjkim 518280297Sjkim // JSR 292 519280297Sjkim // find a java.lang.invoke.MethodHandle.invoke* method for a given signature 520280297Sjkim // (asks Java to compute it if necessary, except in a compiler thread) 52155714Skris static methodHandle find_method_handle_invoker(Symbol* name, 52255714Skris Symbol* signature, 523280297Sjkim KlassHandle accessing_klass, 524280297Sjkim Handle *appendix_result, 52555714Skris Handle *method_type_result, 526280297Sjkim TRAPS); 527280297Sjkim // for a given signature, find the internal MethodHandle method (linkTo* or invokeBasic) 528280297Sjkim // (does not ask Java, since this is a low-level intrinsic defined by the JVM) 529280297Sjkim static methodHandle find_method_handle_intrinsic(vmIntrinsics::ID iid, 530280297Sjkim Symbol* signature, 531280297Sjkim TRAPS); 532280297Sjkim // find a java.lang.invoke.MethodType object for a given signature 533280297Sjkim // (asks Java to compute it if necessary, except in a compiler thread) 534280297Sjkim static Handle find_method_handle_type(Symbol* signature, 535280297Sjkim KlassHandle accessing_klass, 536280297Sjkim TRAPS); 537280297Sjkim 538280297Sjkim // ask Java to compute a java.lang.invoke.MethodHandle object for a given CP entry 539280297Sjkim static Handle link_method_handle_constant(KlassHandle caller, 540280297Sjkim int ref_kind, //e.g., JVM_REF_invokeVirtual 541280297Sjkim KlassHandle callee, 542280297Sjkim Symbol* name, 543306198Sjkim Symbol* signature, 544306198Sjkim TRAPS); 545306198Sjkim 546280297Sjkim // ask Java to create a dynamic call site, while linking an invokedynamic op 547280297Sjkim static methodHandle find_dynamic_call_site_invoker(KlassHandle caller, 548280297Sjkim Handle bootstrap_method, 549280297Sjkim Symbol* name, 550280297Sjkim Symbol* type, 551280297Sjkim Handle *appendix_result, 552280297Sjkim Handle *method_type_result, 553280297Sjkim TRAPS); 554280297Sjkim 555280297Sjkim // Utility for printing loader "name" as part of tracing constraints 556280297Sjkim static const char* loader_name(const oop loader); 557280297Sjkim static const char* loader_name(const ClassLoaderData* loader_data); 558280297Sjkim 559306198Sjkim // Record the error when the first attempt to resolve a reference from a constant 560280297Sjkim // pool entry to a class fails. 561306198Sjkim static void add_resolution_error(const constantPoolHandle& pool, int which, Symbol* error, 562306198Sjkim Symbol* message); 563280297Sjkim static void delete_resolution_error(ConstantPool* pool); 564280297Sjkim static Symbol* find_resolution_error(const constantPoolHandle& pool, int which, 565280297Sjkim Symbol** message); 566280297Sjkim 567280297Sjkim protected: 568280297Sjkim 569280297Sjkim enum Constants { 570280297Sjkim _loader_constraint_size = 107, // number of entries in constraint table 571280297Sjkim _resolution_error_size = 107, // number of entries in resolution error table 572280297Sjkim _invoke_method_size = 139, // number of entries in invoke method table 573280297Sjkim _nof_buckets = 1009, // number of buckets in hash table for placeholders 574280297Sjkim _old_default_sdsize = 1009, // backward compat for system dictionary size 575280297Sjkim _prime_array_size = 8, // array of primes for system dictionary size 576280297Sjkim _average_depth_goal = 3 // goal for lookup length 577280297Sjkim }; 578280297Sjkim 579280297Sjkim 580280297Sjkim // Static variables 581280297Sjkim 582280297Sjkim // hashtable sizes for system dictionary to allow growth 583280297Sjkim // prime numbers for system dictionary size 584280297Sjkim static int _sdgeneration; 585280297Sjkim static const int _primelist[_prime_array_size]; 58655714Skris 587238405Sjkim // Hashtable holding loaded classes. 588280297Sjkim static Dictionary* _dictionary; 589280297Sjkim 590238405Sjkim // Hashtable holding placeholders for classes being loaded. 591238405Sjkim static PlaceholderTable* _placeholders; 592238405Sjkim 593238405Sjkim // Hashtable holding classes from the shared archive. 594238405Sjkim static Dictionary* _shared_dictionary; 595238405Sjkim 596238405Sjkim // Monotonically increasing counter which grows with 597238405Sjkim // _number_of_classes as well as hot-swapping and breakpoint setting 598238405Sjkim // and removal. 599238405Sjkim static int _number_of_modifications; 600238405Sjkim 601238405Sjkim // Lock object for system class loader 602238405Sjkim static oop _system_loader_lock_obj; 603238405Sjkim 604238405Sjkim // Constraints on class loaders 605238405Sjkim static LoaderConstraintTable* _loader_constraints; 606238405Sjkim 607238405Sjkim // Resolution errors 608280297Sjkim static ResolutionErrorTable* _resolution_errors; 609280297Sjkim 610280297Sjkim // Invoke methods (JSR 292) 611280297Sjkim static SymbolPropertyTable* _invoke_method_table; 612280297Sjkim 613238405Sjkimpublic: 614280297Sjkim // for VM_CounterDecay iteration support 615280297Sjkim friend class CounterDecay; 616280297Sjkim static Klass* try_get_next_class(); 617280297Sjkim 618280297Sjkimprotected: 619280297Sjkim static void validate_protection_domain(instanceKlassHandle klass, 620280297Sjkim Handle class_loader, 621280297Sjkim Handle protection_domain, TRAPS); 622280297Sjkim 623280297Sjkim friend class VM_PopulateDumpSharedSpace; 624280297Sjkim friend class TraversePlaceholdersClosure; 625280297Sjkim static Dictionary* dictionary() { return _dictionary; } 626280297Sjkim static Dictionary* shared_dictionary() { return _shared_dictionary; } 627280297Sjkim static PlaceholderTable* placeholders() { return _placeholders; } 628238405Sjkim static LoaderConstraintTable* constraints() { return _loader_constraints; } 629238405Sjkim static ResolutionErrorTable* resolution_errors() { return _resolution_errors; } 630280297Sjkim static SymbolPropertyTable* invoke_method_table() { return _invoke_method_table; } 631280297Sjkim 632280297Sjkim // Basic loading operations 633280297Sjkim static Klass* resolve_instance_class_or_null(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS); 634238405Sjkim static Klass* resolve_array_class_or_null(Symbol* class_name, Handle class_loader, Handle protection_domain, TRAPS); 635280297Sjkim static instanceKlassHandle handle_parallel_super_load(Symbol* class_name, Symbol* supername, Handle class_loader, Handle protection_domain, Handle lockObject, TRAPS); 636280297Sjkim // Wait on SystemDictionary_lock; unlocks lockObject before 637280297Sjkim // waiting; relocks lockObject with correct recursion count 638280297Sjkim // after waiting, but before reentering SystemDictionary_lock 639280297Sjkim // to preserve lock order semantics. 640280297Sjkim static void double_lock_wait(Handle lockObject, TRAPS); 641280297Sjkim static void define_instance_class(instanceKlassHandle k, TRAPS); 642280297Sjkim static instanceKlassHandle find_or_define_instance_class(Symbol* class_name, 643280297Sjkim Handle class_loader, 644280297Sjkim instanceKlassHandle k, TRAPS); 645280297Sjkim static bool is_shared_class_visible(Symbol* class_name, instanceKlassHandle ik, 646280297Sjkim Handle class_loader, TRAPS); 647238405Sjkim static instanceKlassHandle load_shared_class(instanceKlassHandle ik, 648280297Sjkim Handle class_loader, 649280297Sjkim Handle protection_domain, 650280297Sjkim TRAPS); 651280297Sjkim static instanceKlassHandle load_instance_class(Symbol* class_name, Handle class_loader, TRAPS); 652238405Sjkim static Handle compute_loader_lock_object(Handle class_loader, TRAPS); 653280297Sjkim static void check_loader_lock_contention(Handle loader_lock, TRAPS); 654280297Sjkim static bool is_parallelCapable(Handle class_loader); 655238405Sjkim static bool is_parallelDefine(Handle class_loader); 656238405Sjkim 657238405Sjkimpublic: 658280297Sjkim static instanceKlassHandle load_shared_class(Symbol* class_name, 659280297Sjkim Handle class_loader, 660280297Sjkim TRAPS); 661205128Ssimon static bool is_platform_class_loader(Handle class_loader); 662291719Sjkim 663280297Sjkimprotected: 664280297Sjkim static Klass* find_shared_class(Symbol* class_name); 665280297Sjkim 666280297Sjkim // Setup link to hierarchy 667238405Sjkim static void add_to_hierarchy(instanceKlassHandle k, TRAPS); 668280297Sjkim 669238405Sjkim // We pass in the hashtable index so we can calculate it outside of 670238405Sjkim // the SystemDictionary_lock. 671280297Sjkim 672280297Sjkim // Basic find on loaded classes 673280297Sjkim static Klass* find_class(int index, unsigned int hash, 674280297Sjkim Symbol* name, ClassLoaderData* loader_data); 675280297Sjkim static Klass* find_class(Symbol* class_name, ClassLoaderData* loader_data); 676280297Sjkim 677280297Sjkim // Basic find on classes in the midst of being loaded 678238405Sjkim static Symbol* find_placeholder(Symbol* name, ClassLoaderData* loader_data); 679280297Sjkim 680280297Sjkim // Add a placeholder for a class being loaded 681238405Sjkim static void add_placeholder(int index, 682280297Sjkim Symbol* class_name, 683280297Sjkim ClassLoaderData* loader_data); 684280297Sjkim static void remove_placeholder(int index, 685280297Sjkim Symbol* class_name, 686280297Sjkim ClassLoaderData* loader_data); 68755714Skris 688280297Sjkim // Performs cleanups after resolve_super_or_fail. This typically needs 689280297Sjkim // to be called on failure. 690238405Sjkim // Won't throw, but can block. 691280297Sjkim static void resolution_cleanups(Symbol* class_name, 692280297Sjkim ClassLoaderData* loader_data, 693280297Sjkim TRAPS); 694280297Sjkim 695238405Sjkim // Initialization 696238405Sjkim static void initialize_preloaded_classes(TRAPS); 697280297Sjkim 698280297Sjkim // Class loader constraints 699280297Sjkim static void check_constraints(int index, unsigned int hash, 700238405Sjkim instanceKlassHandle k, Handle loader, 701291719Sjkim bool defining, TRAPS); 702280297Sjkim static void update_dictionary(int d_index, unsigned int d_hash, 703280297Sjkim int p_index, unsigned int p_hash, 704280297Sjkim instanceKlassHandle k, Handle loader, 705238405Sjkim TRAPS); 706238405Sjkim 707280297Sjkim // Variables holding commonly used klasses (preloaded) 708238405Sjkim static InstanceKlass* _well_known_klasses[]; 709238405Sjkim 710280297Sjkim // Lazily loaded klasses 711280297Sjkim static InstanceKlass* volatile _abstract_ownable_synchronizer_klass; 712280297Sjkim 713238405Sjkim // table of box klasses (int_klass, etc.) 714280297Sjkim static InstanceKlass* _box_klasses[T_VOID+1]; 715280297Sjkim 716238405Sjkim static oop _java_system_loader; 717280297Sjkim 718280297Sjkim static bool _has_loadClassInternal; 719238405Sjkim static bool _has_checkPackageAccess; 720280297Sjkim}; 721280297Sjkim 722280297Sjkim#endif // SHARE_VM_CLASSFILE_SYSTEMDICTIONARY_HPP 723280297Sjkim