1 /*
  2  * Copyright (c) 2014, 2024, Oracle and/or its affiliates. All rights reserved.
  3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4  *
  5  * This code is free software; you can redistribute it and/or modify it
  6  * under the terms of the GNU General Public License version 2 only, as
  7  * published by the Free Software Foundation.
  8  *
  9  * This code is distributed in the hope that it will be useful, but WITHOUT
 10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 12  * version 2 for more details (a copy is included in the LICENSE file that
 13  * accompanied this code).
 14  *
 15  * You should have received a copy of the GNU General Public License version
 16  * 2 along with this work; if not, write to the Free Software Foundation,
 17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 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 
 58 [2] How classes from different categories are specified in the classlist:
 59 
 60     Starting from JDK9, each class in the classlist may be specified with
 61     these keywords: "id", "super", "interfaces", "loader" and "source".
 62 
 63 
 64     BUILTIN               Only the "id" keyword may be (optionally) specified. All other
 65                           keywords are forbidden.
 66 
 67                           The named class is looked up from the jimage and from
 68                           Xbootclasspath/a and CLASSPATH.
 69 
 70     UNREGISTERED:         The "id", "super", and "source" keywords must all be
 71                           specified.
 72 
 73                           The "interfaces" keyword must be specified if the class implements
 74                           one or more local interfaces. The "interfaces" keyword must not be
 75                           specified if the class does not implement local interfaces.
 76 
 77                           The named class is looked up from the location specified in the
 78                           "source" keyword.
 79 
 80     Example classlist:
 81 
 82     # BUILTIN
 83     java/lang/Object id: 0
 84     java/lang/Cloneable id: 1
 85     java/lang/String
 86 
 87     # UNREGISTERED
 88     Bar id: 3 super: 0 interfaces: 1 source: /foo.jar
 89 
 90 
 91 [3] Identifying the category of archived classes
 92 
 93     BUILTIN:              (C->shared_classpath_index() >= 0)
 94     UNREGISTERED:         (C->shared_classpath_index() == UNREGISTERED_INDEX (-9999))
 95 
 96 [4] Lookup of archived classes at run time:
 97 
 98     (a) BUILTIN loaders:
 99 
100         search _builtin_dictionary
101 
102     (b) UNREGISTERED loaders:
103 
104         search _unregistered_dictionary for an entry that matches the
105         (name, clsfile_len, clsfile_crc32).
106 
107 ===============================================================================*/
108 #define UNREGISTERED_INDEX -9999
109 
110 class BootstrapInfo;
111 class ClassFileStream;
112 class ConstantPoolCache;
113 class Dictionary;
114 class DumpTimeClassInfo;
115 class DumpTimeSharedClassTable;
116 class LambdaProxyClassDictionary;
117 class RunTimeClassInfo;
118 class RunTimeSharedDictionary;
119 class DumpTimeLambdaProxyClassDictionary;
120 class LambdaProxyClassKey;
121 
122 class SharedClassLoadingMark {
123  private:
124   Thread* THREAD;
125   InstanceKlass* _klass;
126  public:
127   SharedClassLoadingMark(Thread* current, InstanceKlass* ik) : THREAD(current), _klass(ik) {}
128   ~SharedClassLoadingMark() {
129     assert(THREAD != nullptr, "Current thread is nullptr");
130     assert(_klass != nullptr, "InstanceKlass is nullptr");
131     if (HAS_PENDING_EXCEPTION) {
132       if (_klass->is_shared()) {
133         _klass->set_shared_loading_failed();
134       }
135     }
136   }
137 };
138 
139 class SystemDictionaryShared: public SystemDictionary {
140   friend class ExcludeDumpTimeSharedClasses;
141   friend class CleanupDumpTimeLambdaProxyClassTable;
142 
143   struct ArchiveInfo {
144     RunTimeSharedDictionary _builtin_dictionary;
145     RunTimeSharedDictionary _unregistered_dictionary;
146     LambdaProxyClassDictionary _lambda_proxy_class_dictionary;
147 
148     const RunTimeLambdaProxyClassInfo* lookup_lambda_proxy_class(RunTimeLambdaProxyClassKey* key) {
149       return _lambda_proxy_class_dictionary.lookup(key, key->hash(), 0);
150     }
151 
152     void print_on(const char* prefix, outputStream* st);
153     void print_table_statistics(const char* prefix, outputStream* st);
154   };
155 
156 public:
157   enum : char {
158     FROM_FIELD_IS_PROTECTED = 1 << 0,
159     FROM_IS_ARRAY           = 1 << 1,
160     FROM_IS_OBJECT          = 1 << 2
161   };
162 
163 private:
164 
165   static DumpTimeSharedClassTable* _dumptime_table;
166   static DumpTimeLambdaProxyClassDictionary* _dumptime_lambda_proxy_class_dictionary;
167 
168   static ArchiveInfo _static_archive;
169   static ArchiveInfo _dynamic_archive;
170 
171   static ArchiveInfo* get_archive(bool is_static_archive) {
172     return is_static_archive ? &_static_archive : &_dynamic_archive;
173   }
174 
175   static InstanceKlass* load_shared_class_for_builtin_loader(
176                                                Symbol* class_name,
177                                                Handle class_loader,
178                                                TRAPS);
179   static InstanceKlass* acquire_class_for_current_thread(
180                                  InstanceKlass *ik,
181                                  Handle class_loader,
182                                  Handle protection_domain,
183                                  const ClassFileStream* cfs,
184                                  TRAPS);
185 
186   // Guaranteed to return non-null value for non-shared classes.
187   // k must not be a shared class.
188   static DumpTimeClassInfo* get_info(InstanceKlass* k);
189   static DumpTimeClassInfo* get_info_locked(InstanceKlass* k);
190 
191   static void find_all_archivable_classes_impl();
192   static void write_dictionary(RunTimeSharedDictionary* dictionary,
193                                bool is_builtin);
194   static void write_lambda_proxy_class_dictionary(LambdaProxyClassDictionary* dictionary);
195   static void cleanup_lambda_proxy_class_dictionary();
196   static void reset_registered_lambda_proxy_class(InstanceKlass* ik);
197   static bool is_jfr_event_class(InstanceKlass *k);
198   static bool is_registered_lambda_proxy_class(InstanceKlass* ik);
199   static bool check_for_exclusion_impl(InstanceKlass* k);
200   static void remove_dumptime_info(InstanceKlass* k) NOT_CDS_RETURN;
201   static bool has_been_redefined(InstanceKlass* k);
202   static InstanceKlass* retrieve_lambda_proxy_class(const RunTimeLambdaProxyClassInfo* info) NOT_CDS_RETURN_(nullptr);
203   static void scan_constant_pool(InstanceKlass* k);
204   DEBUG_ONLY(static bool _class_loading_may_happen;)
205 
206 public:
207   static bool should_hidden_class_be_archived(InstanceKlass* k);
208   static void mark_required_hidden_class(InstanceKlass* k);
209   static bool is_hidden_lambda_proxy(InstanceKlass* ik);
210   static bool is_early_klass(InstanceKlass* k);   // Was k loaded while JvmtiExport::is_early_phase()==true
211   static bool has_archived_enum_objs(InstanceKlass* ik);
212   static void set_has_archived_enum_objs(InstanceKlass* ik);
213 
214   static InstanceKlass* find_builtin_class(Symbol* class_name);
215 
216   static const RunTimeClassInfo* find_record(RunTimeSharedDictionary* static_dict,
217                                                    RunTimeSharedDictionary* dynamic_dict,
218                                                    Symbol* name);
219 
220   static bool has_platform_or_app_classes();
221 
222   // Called by PLATFORM/APP loader only
223   static InstanceKlass* find_or_load_shared_class(Symbol* class_name,
224                                                Handle class_loader,
225                                                TRAPS);
226 
227 
228   static void allocate_shared_data_arrays(int size, TRAPS);
229 
230   static bool is_builtin_loader(ClassLoaderData* loader_data);
231 
232   static InstanceKlass* lookup_super_for_unregistered_class(Symbol* class_name,
233                                                             Symbol* super_name,  bool is_superclass);
234 
235   static void initialize() NOT_CDS_RETURN;
236   static void init_dumptime_info(InstanceKlass* k) NOT_CDS_RETURN;
237   static void handle_class_unloading(InstanceKlass* k) NOT_CDS_RETURN;
238 
239   static Dictionary* boot_loader_dictionary() {
240     return ClassLoaderData::the_null_class_loader_data()->dictionary();
241   }
242 
243   static void update_shared_entry(InstanceKlass* klass, int id);
244   static void set_shared_class_misc_info(InstanceKlass* k, ClassFileStream* cfs);
245 
246   static InstanceKlass* lookup_from_stream(Symbol* class_name,
247                                            Handle class_loader,
248                                            Handle protection_domain,
249                                            const ClassFileStream* st,
250                                            TRAPS);
251   // "verification_constraints" are a set of checks performed by
252   // VerificationType::is_reference_assignable_from when verifying a shared class during
253   // dump time.
254   //
255   // With AppCDS, it is possible to override archived classes by calling
256   // ClassLoader.defineClass() directly. SystemDictionary::load_shared_class() already
257   // ensures that you cannot load a shared class if its super type(s) are changed. However,
258   // we need an additional check to ensure that the verification_constraints did not change
259   // between dump time and runtime.
260   static bool add_verification_constraint(InstanceKlass* k, Symbol* name,
261                   Symbol* from_name, bool from_field_is_protected,
262                   bool from_is_array, bool from_is_object) NOT_CDS_RETURN_(false);
263   static void check_verification_constraints(InstanceKlass* klass,
264                                              TRAPS) NOT_CDS_RETURN;
265   static void add_enum_klass_static_field(InstanceKlass* ik, int root_index);
266   static void set_class_has_failed_verification(InstanceKlass* ik) NOT_CDS_RETURN;
267   static bool has_class_failed_verification(InstanceKlass* ik) NOT_CDS_RETURN_(false);
268   static void add_lambda_proxy_class(InstanceKlass* caller_ik,
269                                      InstanceKlass* lambda_ik,
270                                      Symbol* invoked_name,
271                                      Symbol* invoked_type,
272                                      Symbol* method_type,
273                                      Method* member_method,
274                                      Symbol* instantiated_method_type, TRAPS) NOT_CDS_RETURN;
275   static void add_to_dump_time_lambda_proxy_class_dictionary(LambdaProxyClassKey& key,
276                                                              InstanceKlass* proxy_klass) NOT_CDS_RETURN;
277   static InstanceKlass* get_shared_lambda_proxy_class(InstanceKlass* caller_ik,
278                                                       Symbol* invoked_name,
279                                                       Symbol* invoked_type,
280                                                       Symbol* method_type,
281                                                       Method* member_method,
282                                                       Symbol* instantiated_method_type) NOT_CDS_RETURN_(nullptr);
283   static InstanceKlass* get_shared_nest_host(InstanceKlass* lambda_ik) NOT_CDS_RETURN_(nullptr);
284   static InstanceKlass* prepare_shared_lambda_proxy_class(InstanceKlass* lambda_ik,
285                                                           InstanceKlass* caller_ik, TRAPS) NOT_CDS_RETURN_(nullptr);
286   static bool check_linking_constraints(Thread* current, InstanceKlass* klass) NOT_CDS_RETURN_(false);
287   static void record_linking_constraint(Symbol* name, InstanceKlass* klass,
288                                      Handle loader1, Handle loader2) NOT_CDS_RETURN;
289   static bool is_builtin(InstanceKlass* k) {
290     return (k->shared_classpath_index() != UNREGISTERED_INDEX);
291   }
292   static bool add_unregistered_class(Thread* current, InstanceKlass* k);
293 
294   static void find_all_archivable_classes();
295   static bool should_be_excluded(Klass* k);
296   static bool check_for_exclusion(InstanceKlass* k, DumpTimeClassInfo* info);
297   static void validate_before_archiving(InstanceKlass* k);
298   static bool is_excluded_class(InstanceKlass* k);
299   static void set_excluded(InstanceKlass* k);
300   static void set_excluded_locked(InstanceKlass* k);
301   static bool warn_excluded(InstanceKlass* k, const char* reason);
302   static void dumptime_classes_do(class MetaspaceClosure* it);
303   static size_t estimate_size_for_archive();
304   static void write_to_archive(bool is_static_archive = true);
305   static void adjust_lambda_proxy_class_dictionary();
306   static void serialize_dictionary_headers(class SerializeClosure* soc,
307                                            bool is_static_archive = true);
308   static void serialize_vm_classes(class SerializeClosure* soc);
309   static void print() { return print_on(tty); }
310   static void print_on(outputStream* st) NOT_CDS_RETURN;
311   static void print_shared_archive(outputStream* st, bool is_static = true) NOT_CDS_RETURN;
312   static void print_table_statistics(outputStream* st) NOT_CDS_RETURN;
313   static bool is_dumptime_table_empty() NOT_CDS_RETURN_(true);
314   static bool is_supported_invokedynamic(BootstrapInfo* bsi) NOT_CDS_RETURN_(false);
315   DEBUG_ONLY(static bool class_loading_may_happen() {return _class_loading_may_happen;})
316 
317 #ifdef ASSERT
318   // This object marks a critical period when writing the CDS archive. During this
319   // period, the JVM must not load any new classes, so as to avoid adding new
320   // items in the SystemDictionaryShared::_dumptime_table.
321   class NoClassLoadingMark: public StackObj {
322   public:
323     NoClassLoadingMark() {
324       assert(_class_loading_may_happen, "must not be nested");
325       _class_loading_may_happen = false;
326     }
327     ~NoClassLoadingMark() {
328       _class_loading_may_happen = true;
329     }
330   };
331 #endif
332 
333   template <typename T>
334   static unsigned int hash_for_shared_dictionary_quick(T* ptr) {
335     assert(MetaspaceObj::is_shared((const MetaspaceObj*)ptr), "must be");
336     assert(ptr > (T*)SharedBaseAddress, "must be");
337     uintx offset = uintx(ptr) - uintx(SharedBaseAddress);
338     return primitive_hash<uintx>(offset);
339   }
340 
341   static unsigned int hash_for_shared_dictionary(address ptr);
342 };
343 
344 #endif // SHARE_CLASSFILE_SYSTEMDICTIONARYSHARED_HPP