< prev index next >

src/hotspot/share/classfile/systemDictionaryShared.hpp

Print this page

 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  *
 23  */
 24 
 25 #ifndef SHARE_CLASSFILE_SYSTEMDICTIONARYSHARED_HPP
 26 #define SHARE_CLASSFILE_SYSTEMDICTIONARYSHARED_HPP
 27 
 28 #include "cds/cds_globals.hpp"
 29 #include "cds/filemap.hpp"
 30 #include "cds/dumpTimeClassInfo.hpp"
 31 #include "cds/lambdaProxyClassDictionary.hpp"
 32 #include "cds/runTimeClassInfo.hpp"
 33 #include "classfile/classLoaderData.hpp"
 34 #include "classfile/packageEntry.hpp"
 35 #include "classfile/systemDictionary.hpp"
 36 #include "oops/klass.hpp"
 37 #include "oops/oopHandle.hpp"

 38 
 39 
 40 /*===============================================================================
 41 
 42     Handling of the classes in the AppCDS archive
 43 
 44     To ensure safety and to simplify the implementation, archived classes are
 45     "segregated" into 2 types. The following rules describe how they
 46     are stored and looked up.
 47 
 48 [1] Category of archived classes
 49 
 50     There are 2 disjoint groups of classes stored in the AppCDS archive:
 51 
 52     BUILTIN:              These classes may be defined ONLY by the BOOT/PLATFORM/APP
 53                           loaders.
 54 
 55     UNREGISTERED:         These classes may be defined ONLY by a ClassLoader
 56                           instance that's not listed above (using fingerprint matching)
 57 

158   static DumpTimeLambdaProxyClassDictionary* _dumptime_lambda_proxy_class_dictionary;
159 
160   static ArchiveInfo _static_archive;
161   static ArchiveInfo _dynamic_archive;
162 
163   static ArchiveInfo* get_archive(bool is_static_archive) {
164     return is_static_archive ? &_static_archive : &_dynamic_archive;
165   }
166 
167   static InstanceKlass* load_shared_class_for_builtin_loader(
168                                                Symbol* class_name,
169                                                Handle class_loader,
170                                                TRAPS);
171   static InstanceKlass* acquire_class_for_current_thread(
172                                  InstanceKlass *ik,
173                                  Handle class_loader,
174                                  Handle protection_domain,
175                                  const ClassFileStream* cfs,
176                                  TRAPS);
177 
178   // Guaranteed to return non-null value for non-shared classes.
179   // k must not be a shared class.
180   static DumpTimeClassInfo* get_info(InstanceKlass* k);
181   static DumpTimeClassInfo* get_info_locked(InstanceKlass* k);
182 
183   static void write_dictionary(RunTimeSharedDictionary* dictionary,
184                                bool is_builtin);
185   static void write_lambda_proxy_class_dictionary(LambdaProxyClassDictionary* dictionary);
186   static void cleanup_lambda_proxy_class_dictionary();
187   static void reset_registered_lambda_proxy_class(InstanceKlass* ik);
188   static bool is_jfr_event_class(InstanceKlass *k);
189   static bool check_for_exclusion_impl(InstanceKlass* k);
190   static void remove_dumptime_info(InstanceKlass* k) NOT_CDS_RETURN;
191   static bool has_been_redefined(InstanceKlass* k);
192   static InstanceKlass* retrieve_lambda_proxy_class(const RunTimeLambdaProxyClassInfo* info) NOT_CDS_RETURN_(nullptr);
193   DEBUG_ONLY(static bool _class_loading_may_happen;)
194 
195   static void copy_verification_constraints_from_preimage(InstanceKlass* klass);
196   static void copy_linking_constraints_from_preimage(InstanceKlass* klass);
197 
198 public:










199   static bool is_registered_lambda_proxy_class(InstanceKlass* ik);

200   static bool is_hidden_lambda_proxy(InstanceKlass* ik);
201   static bool is_early_klass(InstanceKlass* k);   // Was k loaded while JvmtiExport::is_early_phase()==true
202   static bool has_archived_enum_objs(InstanceKlass* ik);
203   static void set_has_archived_enum_objs(InstanceKlass* ik);
204 
205   static InstanceKlass* find_builtin_class(Symbol* class_name);
206 
207   static const RunTimeClassInfo* find_record(RunTimeSharedDictionary* static_dict,
208                                                    RunTimeSharedDictionary* dynamic_dict,
209                                                    Symbol* name);
210 
211   static bool has_platform_or_app_classes();
212 
213   // Called by PLATFORM/APP loader only
214   static InstanceKlass* find_or_load_shared_class(Symbol* class_name,
215                                                Handle class_loader,
216                                                TRAPS);
217 
218 
219   static void allocate_shared_data_arrays(int size, TRAPS);
220 
221   static bool is_builtin_loader(ClassLoaderData* loader_data);
222 
223   static InstanceKlass* lookup_super_for_unregistered_class(Symbol* class_name,
224                                                             Symbol* super_name,  bool is_superclass);
225 
226   static void initialize() NOT_CDS_RETURN;
227   static void init_dumptime_info(InstanceKlass* k) NOT_CDS_RETURN;
228   static void init_dumptime_info_from_preimage(InstanceKlass* k) NOT_CDS_RETURN;
229   static void handle_class_unloading(InstanceKlass* k) NOT_CDS_RETURN;
230 




231   static Dictionary* boot_loader_dictionary() {
232     return ClassLoaderData::the_null_class_loader_data()->dictionary();
233   }
234 
235   static void update_shared_entry(InstanceKlass* klass, int id);
236   static void set_shared_class_misc_info(InstanceKlass* k, ClassFileStream* cfs);
237 
238   static InstanceKlass* lookup_from_stream(Symbol* class_name,
239                                            Handle class_loader,
240                                            Handle protection_domain,
241                                            const ClassFileStream* st,
242                                            TRAPS);
243   // "verification_constraints" are a set of checks performed by
244   // VerificationType::is_reference_assignable_from when verifying a shared class during
245   // dump time.
246   //
247   // With AppCDS, it is possible to override archived classes by calling
248   // ClassLoader.defineClass() directly. SystemDictionary::load_shared_class() already
249   // ensures that you cannot load a shared class if its super type(s) are changed. However,
250   // we need an additional check to ensure that the verification_constraints did not change

261                                      InstanceKlass* lambda_ik,
262                                      Symbol* invoked_name,
263                                      Symbol* invoked_type,
264                                      Symbol* method_type,
265                                      Method* member_method,
266                                      Symbol* instantiated_method_type, TRAPS) NOT_CDS_RETURN;
267   static void add_to_dump_time_lambda_proxy_class_dictionary(LambdaProxyClassKey& key,
268                                                              InstanceKlass* proxy_klass) NOT_CDS_RETURN;
269   static InstanceKlass* get_shared_lambda_proxy_class(InstanceKlass* caller_ik,
270                                                       Symbol* invoked_name,
271                                                       Symbol* invoked_type,
272                                                       Symbol* method_type,
273                                                       Method* member_method,
274                                                       Symbol* instantiated_method_type) NOT_CDS_RETURN_(nullptr);
275   static InstanceKlass* get_shared_nest_host(InstanceKlass* lambda_ik) NOT_CDS_RETURN_(nullptr);
276   static InstanceKlass* prepare_shared_lambda_proxy_class(InstanceKlass* lambda_ik,
277                                                           InstanceKlass* caller_ik, TRAPS) NOT_CDS_RETURN_(nullptr);
278   static bool check_linking_constraints(Thread* current, InstanceKlass* klass) NOT_CDS_RETURN_(false);
279   static void record_linking_constraint(Symbol* name, InstanceKlass* klass,
280                                      Handle loader1, Handle loader2) NOT_CDS_RETURN;
281   static bool is_builtin(InstanceKlass* k) {
282     return (k->shared_classpath_index() != UNREGISTERED_INDEX);
283   }
284   static bool add_unregistered_class(Thread* current, InstanceKlass* k);
285 
286   static void finish_exclusion_checks();
287   static DumpTimeSharedClassTable* dumptime_table() { return _dumptime_table; }
288 
289   static bool should_be_excluded(Klass* k);
290   static bool check_for_exclusion(InstanceKlass* k, DumpTimeClassInfo* info);
291   static void validate_before_archiving(InstanceKlass* k);
292   static bool is_excluded_class(InstanceKlass* k);
293   static void set_excluded(InstanceKlass* k);
294   static void set_excluded_locked(InstanceKlass* k);
295   static bool warn_excluded(InstanceKlass* k, const char* reason);
296   static void dumptime_classes_do(class MetaspaceClosure* it);
297   static size_t estimate_size_for_archive();
298   static void write_to_archive(bool is_static_archive = true);
299   static void adjust_lambda_proxy_class_dictionary();

300   static void serialize_dictionary_headers(class SerializeClosure* soc,
301                                            bool is_static_archive = true);
302   static void serialize_vm_classes(class SerializeClosure* soc);
303   static void print() { return print_on(tty); }
304   static void print_on(outputStream* st) NOT_CDS_RETURN;
305   static void print_shared_archive(outputStream* st, bool is_static = true) NOT_CDS_RETURN;
306   static void print_table_statistics(outputStream* st) NOT_CDS_RETURN;
307   static bool is_dumptime_table_empty() NOT_CDS_RETURN_(true);
308   static bool is_supported_invokedynamic(BootstrapInfo* bsi) NOT_CDS_RETURN_(false);
309   DEBUG_ONLY(static bool class_loading_may_happen() {return _class_loading_may_happen;})



310 
311 #ifdef ASSERT
312   // This object marks a critical period when writing the CDS archive. During this
313   // period, the JVM must not load any new classes, so as to avoid adding new
314   // items in the SystemDictionaryShared::_dumptime_table.
315   class NoClassLoadingMark: public StackObj {
316   public:
317     NoClassLoadingMark() {
318       assert(_class_loading_may_happen, "must not be nested");
319       _class_loading_may_happen = false;
320     }
321     ~NoClassLoadingMark() {
322       _class_loading_may_happen = true;
323     }
324   };
325 #endif
326 
327   template <typename T>
328   static unsigned int hash_for_shared_dictionary_quick(T* ptr) {
329     assert(MetaspaceObj::is_shared((const MetaspaceObj*)ptr), "must be");
330     assert(ptr > (T*)SharedBaseAddress, "must be");
331     uintx offset = uintx(ptr) - uintx(SharedBaseAddress);
332     return primitive_hash<uintx>(offset);
333   }
334 
335   static unsigned int hash_for_shared_dictionary(address ptr);


336 };
337 
338 #endif // SHARE_CLASSFILE_SYSTEMDICTIONARYSHARED_HPP

 18  *
 19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
 20  * or visit www.oracle.com if you need additional information or have any
 21  * questions.
 22  *
 23  */
 24 
 25 #ifndef SHARE_CLASSFILE_SYSTEMDICTIONARYSHARED_HPP
 26 #define SHARE_CLASSFILE_SYSTEMDICTIONARYSHARED_HPP
 27 
 28 #include "cds/cds_globals.hpp"
 29 #include "cds/filemap.hpp"
 30 #include "cds/dumpTimeClassInfo.hpp"
 31 #include "cds/lambdaProxyClassDictionary.hpp"
 32 #include "cds/runTimeClassInfo.hpp"
 33 #include "classfile/classLoaderData.hpp"
 34 #include "classfile/packageEntry.hpp"
 35 #include "classfile/systemDictionary.hpp"
 36 #include "oops/klass.hpp"
 37 #include "oops/oopHandle.hpp"
 38 #include "oops/trainingData.hpp"
 39 
 40 
 41 /*===============================================================================
 42 
 43     Handling of the classes in the AppCDS archive
 44 
 45     To ensure safety and to simplify the implementation, archived classes are
 46     "segregated" into 2 types. The following rules describe how they
 47     are stored and looked up.
 48 
 49 [1] Category of archived classes
 50 
 51     There are 2 disjoint groups of classes stored in the AppCDS archive:
 52 
 53     BUILTIN:              These classes may be defined ONLY by the BOOT/PLATFORM/APP
 54                           loaders.
 55 
 56     UNREGISTERED:         These classes may be defined ONLY by a ClassLoader
 57                           instance that's not listed above (using fingerprint matching)
 58 

159   static DumpTimeLambdaProxyClassDictionary* _dumptime_lambda_proxy_class_dictionary;
160 
161   static ArchiveInfo _static_archive;
162   static ArchiveInfo _dynamic_archive;
163 
164   static ArchiveInfo* get_archive(bool is_static_archive) {
165     return is_static_archive ? &_static_archive : &_dynamic_archive;
166   }
167 
168   static InstanceKlass* load_shared_class_for_builtin_loader(
169                                                Symbol* class_name,
170                                                Handle class_loader,
171                                                TRAPS);
172   static InstanceKlass* acquire_class_for_current_thread(
173                                  InstanceKlass *ik,
174                                  Handle class_loader,
175                                  Handle protection_domain,
176                                  const ClassFileStream* cfs,
177                                  TRAPS);
178 




179 
180   static void write_dictionary(RunTimeSharedDictionary* dictionary,
181                                bool is_builtin);
182   static void write_lambda_proxy_class_dictionary(LambdaProxyClassDictionary* dictionary);
183   static void cleanup_lambda_proxy_class_dictionary();
184   static void reset_registered_lambda_proxy_class(InstanceKlass* ik);

185   static bool check_for_exclusion_impl(InstanceKlass* k);
186   static void remove_dumptime_info(InstanceKlass* k) NOT_CDS_RETURN;

187   static InstanceKlass* retrieve_lambda_proxy_class(const RunTimeLambdaProxyClassInfo* info) NOT_CDS_RETURN_(nullptr);
188   DEBUG_ONLY(static bool _class_loading_may_happen;)
189 
190   static void copy_verification_constraints_from_preimage(InstanceKlass* klass);
191   static void copy_linking_constraints_from_preimage(InstanceKlass* klass);
192 
193 public:
194   // Guaranteed to return non-null value for non-shared classes.
195   // k must not be a shared class.
196   static DumpTimeClassInfo* get_info(InstanceKlass* k);
197   static DumpTimeClassInfo* get_info_locked(InstanceKlass* k);
198   static DumpTimeSharedClassTable* dumptime_table() { return _dumptime_table; }
199 
200   static bool should_hidden_class_be_archived(InstanceKlass* k);
201   static void mark_required_hidden_class(InstanceKlass* k);
202   static bool has_been_redefined(InstanceKlass* k);
203   static bool is_jfr_event_class(InstanceKlass *k);
204   static bool is_registered_lambda_proxy_class(InstanceKlass* ik);
205 
206   static bool is_hidden_lambda_proxy(InstanceKlass* ik);
207   static bool is_early_klass(InstanceKlass* k);   // Was k loaded while JvmtiExport::is_early_phase()==true
208   static bool has_archived_enum_objs(InstanceKlass* ik);
209   static void set_has_archived_enum_objs(InstanceKlass* ik);
210 
211   static InstanceKlass* find_builtin_class(Symbol* class_name);
212 
213   static const RunTimeClassInfo* find_record(RunTimeSharedDictionary* static_dict,
214                                                    RunTimeSharedDictionary* dynamic_dict,
215                                                    Symbol* name);
216 
217   static bool has_platform_or_app_classes();
218 
219   // Called by PLATFORM/APP loader only
220   static InstanceKlass* find_or_load_shared_class(Symbol* class_name,
221                                                Handle class_loader,
222                                                TRAPS);
223 
224 
225   static void allocate_shared_data_arrays(int size, TRAPS);
226 
227   static bool is_builtin_loader(ClassLoaderData* loader_data);
228 
229   static InstanceKlass* lookup_super_for_unregistered_class(Symbol* class_name,
230                                                             Symbol* super_name,  bool is_superclass);
231 
232   static void initialize() NOT_CDS_RETURN;
233   static void init_dumptime_info(InstanceKlass* k) NOT_CDS_RETURN;
234   static void init_dumptime_info_from_preimage(InstanceKlass* k) NOT_CDS_RETURN;
235   static void handle_class_unloading(InstanceKlass* k) NOT_CDS_RETURN;
236 
237   static bool can_be_preinited(InstanceKlass* ik);
238   static bool can_be_preinited_locked(InstanceKlass* ik);
239   static void reset_preinit_check();
240 
241   static Dictionary* boot_loader_dictionary() {
242     return ClassLoaderData::the_null_class_loader_data()->dictionary();
243   }
244 
245   static void update_shared_entry(InstanceKlass* klass, int id);
246   static void set_shared_class_misc_info(InstanceKlass* k, ClassFileStream* cfs);
247 
248   static InstanceKlass* lookup_from_stream(Symbol* class_name,
249                                            Handle class_loader,
250                                            Handle protection_domain,
251                                            const ClassFileStream* st,
252                                            TRAPS);
253   // "verification_constraints" are a set of checks performed by
254   // VerificationType::is_reference_assignable_from when verifying a shared class during
255   // dump time.
256   //
257   // With AppCDS, it is possible to override archived classes by calling
258   // ClassLoader.defineClass() directly. SystemDictionary::load_shared_class() already
259   // ensures that you cannot load a shared class if its super type(s) are changed. However,
260   // we need an additional check to ensure that the verification_constraints did not change

271                                      InstanceKlass* lambda_ik,
272                                      Symbol* invoked_name,
273                                      Symbol* invoked_type,
274                                      Symbol* method_type,
275                                      Method* member_method,
276                                      Symbol* instantiated_method_type, TRAPS) NOT_CDS_RETURN;
277   static void add_to_dump_time_lambda_proxy_class_dictionary(LambdaProxyClassKey& key,
278                                                              InstanceKlass* proxy_klass) NOT_CDS_RETURN;
279   static InstanceKlass* get_shared_lambda_proxy_class(InstanceKlass* caller_ik,
280                                                       Symbol* invoked_name,
281                                                       Symbol* invoked_type,
282                                                       Symbol* method_type,
283                                                       Method* member_method,
284                                                       Symbol* instantiated_method_type) NOT_CDS_RETURN_(nullptr);
285   static InstanceKlass* get_shared_nest_host(InstanceKlass* lambda_ik) NOT_CDS_RETURN_(nullptr);
286   static InstanceKlass* prepare_shared_lambda_proxy_class(InstanceKlass* lambda_ik,
287                                                           InstanceKlass* caller_ik, TRAPS) NOT_CDS_RETURN_(nullptr);
288   static bool check_linking_constraints(Thread* current, InstanceKlass* klass) NOT_CDS_RETURN_(false);
289   static void record_linking_constraint(Symbol* name, InstanceKlass* klass,
290                                      Handle loader1, Handle loader2) NOT_CDS_RETURN;
291   static bool is_builtin(const InstanceKlass* k) {
292     return (k->shared_classpath_index() != UNREGISTERED_INDEX);
293   }
294   static bool add_unregistered_class(Thread* current, InstanceKlass* k);
295 
296   static void finish_exclusion_checks();

297 
298   static bool should_be_excluded(Klass* k);
299   static bool check_for_exclusion(InstanceKlass* k, DumpTimeClassInfo* info);
300   static void validate_before_archiving(InstanceKlass* k);
301   static bool is_excluded_class(InstanceKlass* k);
302   static void set_excluded(InstanceKlass* k);
303   static void set_excluded_locked(InstanceKlass* k);
304   static bool warn_excluded(InstanceKlass* k, const char* reason);
305   static void dumptime_classes_do(class MetaspaceClosure* it);
306   static size_t estimate_size_for_archive();
307   static void write_to_archive(bool is_static_archive = true);
308   static void adjust_lambda_proxy_class_dictionary();
309 
310   static void serialize_dictionary_headers(class SerializeClosure* soc,
311                                            bool is_static_archive = true);
312   static void serialize_vm_classes(class SerializeClosure* soc);
313   static void print() { return print_on(tty); }
314   static void print_on(outputStream* st) NOT_CDS_RETURN;
315   static void print_shared_archive(outputStream* st, bool is_static = true) NOT_CDS_RETURN;
316   static void print_table_statistics(outputStream* st) NOT_CDS_RETURN;
317   static bool is_dumptime_table_empty() NOT_CDS_RETURN_(true);
318   static bool is_supported_invokedynamic(BootstrapInfo* bsi) NOT_CDS_RETURN_(false);
319   DEBUG_ONLY(static bool class_loading_may_happen() {return _class_loading_may_happen;})
320   // Do not archive any new InstanceKlasses that are loaded after this method is called.
321   // This avoids polluting the archive with classes that are only used by GenerateJLIClassesHelper.
322   static void ignore_new_classes();
323 
324 #ifdef ASSERT
325   // This object marks a critical period when writing the CDS archive. During this
326   // period, the JVM must not load any new classes, so as to avoid adding new
327   // items in the SystemDictionaryShared::_dumptime_table.
328   class NoClassLoadingMark: public StackObj {
329   public:
330     NoClassLoadingMark() {
331       assert(_class_loading_may_happen, "must not be nested");
332       _class_loading_may_happen = false;
333     }
334     ~NoClassLoadingMark() {
335       _class_loading_may_happen = true;
336     }
337   };
338 #endif
339 
340   template <typename T>
341   static unsigned int hash_for_shared_dictionary_quick(T* ptr) {
342     assert(MetaspaceObj::is_shared((const MetaspaceObj*)ptr), "must be");
343     assert(ptr > (T*)SharedBaseAddress, "must be");
344     uintx offset = uintx(ptr) - uintx(SharedBaseAddress);
345     return primitive_hash<uintx>(offset);
346   }
347 
348   static unsigned int hash_for_shared_dictionary(address ptr);
349   static const char* class_loader_name_for_shared(Klass* k);
350   static void create_loader_positive_lookup_cache(TRAPS);
351 };
352 
353 #endif // SHARE_CLASSFILE_SYSTEMDICTIONARYSHARED_HPP
< prev index next >