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