1 /*
   2  * Copyright (c) 2014, 2020, 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 "oops/klass.hpp"
  29 #include "classfile/dictionary.hpp"
  30 #include "classfile/packageEntry.hpp"
  31 #include "classfile/systemDictionary.hpp"
  32 #include "memory/filemap.hpp"
  33 
  34 
  35 /*===============================================================================
  36 
  37     Handling of the classes in the AppCDS archive
  38 
  39     To ensure safety and to simplify the implementation, archived classes are
  40     "segregated" into 2 types. The following rules describe how they
  41     are stored and looked up.
  42 
  43 [1] Category of archived classes
  44 
  45     There are 2 disjoint groups of classes stored in the AppCDS archive:
  46 
  47     BUILTIN:              These classes may be defined ONLY by the BOOT/PLATFORM/APP
  48                           loaders.
  49 
  50     UNREGISTERED:         These classes may be defined ONLY by a ClassLoader
  51                           instance that's not listed above (using fingerprint matching)
  52 
  53 [2] How classes from different categories are specified in the classlist:
  54 
  55     Starting from JDK9, each class in the classlist may be specified with
  56     these keywords: "id", "super", "interfaces", "loader" and "source".
  57 
  58 
  59     BUILTIN               Only the "id" keyword may be (optionally) specified. All other
  60                           keywords are forbidden.
  61 
  62                           The named class is looked up from the jimage and from
  63                           Xbootclasspath/a and CLASSPATH.
  64 
  65     UNREGISTERED:         The "id", "super", and "source" keywords must all be
  66                           specified.
  67 
  68                           The "interfaces" keyword must be specified if the class implements
  69                           one or more local interfaces. The "interfaces" keyword must not be
  70                           specified if the class does not implement local interfaces.
  71 
  72                           The named class is looked up from the location specified in the
  73                           "source" keyword.
  74 
  75     Example classlist:
  76 
  77     # BUILTIN
  78     java/lang/Object id: 0
  79     java/lang/Cloneable id: 1
  80     java/lang/String
  81 
  82     # UNREGISTERED
  83     Bar id: 3 super: 0 interfaces: 1 source: /foo.jar
  84 
  85 
  86 [3] Identifying the category of archived classes
  87 
  88     BUILTIN:              (C->shared_classpath_index() >= 0)
  89     UNREGISTERED:         (C->shared_classpath_index() == UNREGISTERED_INDEX (-9999))
  90 
  91 [4] Lookup of archived classes at run time:
  92 
  93     (a) BUILTIN loaders:
  94 
  95         search _builtin_dictionary
  96 
  97     (b) UNREGISTERED loaders:
  98 
  99         search _unregistered_dictionary for an entry that matches the
 100         (name, clsfile_len, clsfile_crc32).
 101 
 102 ===============================================================================*/
 103 #define UNREGISTERED_INDEX -9999
 104 
 105 class ClassFileStream;
 106 class DumpTimeSharedClassInfo;
 107 class DumpTimeSharedClassTable;
 108 class LambdaProxyClassDictionary;
 109 class RunTimeSharedClassInfo;
 110 class RunTimeSharedDictionary;
 111 
 112 class SystemDictionaryShared: public SystemDictionary {
 113   friend class ExcludeDumpTimeSharedClasses;
 114 public:
 115   enum {
 116     FROM_FIELD_IS_PROTECTED = 1 << 0,
 117     FROM_IS_ARRAY           = 1 << 1,
 118     FROM_IS_OBJECT          = 1 << 2
 119   };
 120 
 121 private:
 122   // These _shared_xxxs arrays are used to initialize the java.lang.Package and
 123   // java.security.ProtectionDomain objects associated with each shared class.
 124   //
 125   // See SystemDictionaryShared::init_security_info for more info.
 126   static OopHandle _shared_protection_domains;
 127   static OopHandle _shared_jar_urls;
 128   static OopHandle _shared_jar_manifests;
 129 
 130   static InstanceKlass* load_shared_class_for_builtin_loader(
 131                                                Symbol* class_name,
 132                                                Handle class_loader,
 133                                                TRAPS);
 134   static Handle get_package_name(Symbol*  class_name, TRAPS);
 135 
 136   static PackageEntry* get_package_entry_from_class_name(Handle class_loader, Symbol* class_name);
 137 
 138 
 139   // Package handling:
 140   //
 141   // 1. For named modules in the runtime image
 142   //    BOOT classes: Reuses the existing JVM_GetSystemPackage(s) interfaces
 143   //                  to get packages in named modules for shared classes.
 144   //                  Package for non-shared classes in named module is also
 145   //                  handled using JVM_GetSystemPackage(s).
 146   //
 147   //    APP  classes: VM calls ClassLoaders.AppClassLoader::definePackage(String, Module)
 148   //                  to define package for shared app classes from named
 149   //                  modules.
 150   //
 151   //    PLATFORM  classes: VM calls ClassLoaders.PlatformClassLoader::definePackage(String, Module)
 152   //                  to define package for shared platform classes from named
 153   //                  modules.
 154   //
 155   // 2. For unnamed modules
 156   //    BOOT classes: Reuses the existing JVM_GetSystemPackage(s) interfaces to
 157   //                  get packages for shared boot classes in unnamed modules.
 158   //
 159   //    APP  classes: VM calls ClassLoaders.AppClassLoader::defineOrCheckPackage()
 160   //                  with with the manifest and url from archived data.
 161   //
 162   //    PLATFORM  classes: No package is defined.
 163   //
 164   // The following two define_shared_package() functions are used to define
 165   // package for shared APP and PLATFORM classes.
 166   static void define_shared_package(Symbol*  class_name,
 167                                     Handle class_loader,
 168                                     Handle manifest,
 169                                     Handle url,
 170                                     TRAPS);
 171 
 172   static Handle get_shared_jar_manifest(int shared_path_index, TRAPS);
 173   static Handle get_shared_jar_url(int shared_path_index, TRAPS);
 174   static Handle get_protection_domain_from_classloader(Handle class_loader,
 175                                                        Handle url, TRAPS);
 176   static Handle get_shared_protection_domain(Handle class_loader,
 177                                              int shared_path_index,
 178                                              Handle url,
 179                                              TRAPS);
 180   static Handle get_shared_protection_domain(Handle class_loader,
 181                                              ModuleEntry* mod, TRAPS);
 182 
 183   static void atomic_set_array_index(OopHandle array, int index, oop o) {
 184     // Benign race condition:  array.obj_at(index) may already be filled in.
 185     // The important thing here is that all threads pick up the same result.
 186     // It doesn't matter which racing thread wins, as long as only one
 187     // result is used by all threads, and all future queries.
 188     ((objArrayOop)array.resolve())->atomic_compare_exchange_oop(index, o, NULL);
 189   }
 190 
 191   static oop shared_protection_domain(int index);
 192   static void atomic_set_shared_protection_domain(int index, oop pd) {
 193     atomic_set_array_index(_shared_protection_domains, index, pd);
 194   }
 195   static void allocate_shared_protection_domain_array(int size, TRAPS);
 196   static oop shared_jar_url(int index);
 197   static void atomic_set_shared_jar_url(int index, oop url) {
 198     atomic_set_array_index(_shared_jar_urls, index, url);
 199   }
 200   static void allocate_shared_jar_url_array(int size, TRAPS);
 201   static oop shared_jar_manifest(int index);
 202   static void atomic_set_shared_jar_manifest(int index, oop man) {
 203     atomic_set_array_index(_shared_jar_manifests, index, man);
 204   }
 205   static void allocate_shared_jar_manifest_array(int size, TRAPS);
 206   static InstanceKlass* acquire_class_for_current_thread(
 207                                  InstanceKlass *ik,
 208                                  Handle class_loader,
 209                                  Handle protection_domain,
 210                                  const ClassFileStream* cfs,
 211                                  TRAPS);
 212   static DumpTimeSharedClassInfo* find_or_allocate_info_for(InstanceKlass* k);
 213   static void write_dictionary(RunTimeSharedDictionary* dictionary,
 214                                bool is_builtin,
 215                                bool is_static_archive = true);
 216   static void write_lambda_proxy_class_dictionary(LambdaProxyClassDictionary* dictionary);
 217   static bool is_jfr_event_class(InstanceKlass *k);
 218   static bool is_registered_lambda_proxy_class(InstanceKlass* ik);
 219   static bool is_in_shared_lambda_proxy_table(InstanceKlass* ik);
 220   static void warn_excluded(InstanceKlass* k, const char* reason);
 221   static bool should_be_excluded(InstanceKlass* k);
 222 
 223   DEBUG_ONLY(static bool _no_class_loading_should_happen;)
 224 
 225 public:
 226   static bool is_hidden_lambda_proxy(InstanceKlass* ik);
 227   static Handle init_security_info(Handle class_loader, InstanceKlass* ik, PackageEntry* pkg_entry, TRAPS);
 228   static InstanceKlass* find_builtin_class(Symbol* class_name);
 229 
 230   static const RunTimeSharedClassInfo* find_record(RunTimeSharedDictionary* static_dict,
 231                                                    RunTimeSharedDictionary* dynamic_dict,
 232                                                    Symbol* name);
 233 
 234   static bool has_platform_or_app_classes();
 235 
 236   // Called by PLATFORM/APP loader only
 237   static InstanceKlass* find_or_load_shared_class(Symbol* class_name,
 238                                                Handle class_loader,
 239                                                TRAPS);
 240 
 241 
 242   static void allocate_shared_data_arrays(int size, TRAPS);
 243 
 244   // Check if sharing is supported for the class loader.
 245   static bool is_sharing_possible(ClassLoaderData* loader_data);
 246   static bool is_shared_class_visible_for_classloader(InstanceKlass* ik,
 247                                                       Handle class_loader,
 248                                                       Symbol* pkg_name,
 249                                                       PackageEntry* pkg_entry,
 250                                                       ModuleEntry* mod_entry,
 251                                                       TRAPS);
 252 
 253   static bool add_unregistered_class(InstanceKlass* k, TRAPS);
 254   static InstanceKlass* dump_time_resolve_super_or_fail(Symbol* child_name,
 255                                                 Symbol* class_name,
 256                                                 Handle class_loader,
 257                                                 Handle protection_domain,
 258                                                 bool is_superclass,
 259                                                 TRAPS);
 260 
 261   static void init_dumptime_info(InstanceKlass* k) NOT_CDS_RETURN;
 262   static void remove_dumptime_info(InstanceKlass* k) NOT_CDS_RETURN;
 263 
 264   static Dictionary* boot_loader_dictionary() {
 265     return ClassLoaderData::the_null_class_loader_data()->dictionary();
 266   }
 267 
 268   static void update_shared_entry(InstanceKlass* klass, int id);
 269   static void set_shared_class_misc_info(InstanceKlass* k, ClassFileStream* cfs);
 270 
 271   static InstanceKlass* lookup_from_stream(Symbol* class_name,
 272                                            Handle class_loader,
 273                                            Handle protection_domain,
 274                                            const ClassFileStream* st,
 275                                            TRAPS);
 276   // "verification_constraints" are a set of checks performed by
 277   // VerificationType::is_reference_assignable_from when verifying a shared class during
 278   // dump time.
 279   //
 280   // With AppCDS, it is possible to override archived classes by calling
 281   // ClassLoader.defineClass() directly. SystemDictionary::load_shared_class() already
 282   // ensures that you cannot load a shared class if its super type(s) are changed. However,
 283   // we need an additional check to ensure that the verification_constraints did not change
 284   // between dump time and runtime.
 285   static bool add_verification_constraint(InstanceKlass* k, Symbol* name,
 286                   Symbol* from_name, bool from_field_is_protected,
 287                   bool from_is_array, bool from_is_object) NOT_CDS_RETURN_(false);
 288   static void check_verification_constraints(InstanceKlass* klass,
 289                                              TRAPS) NOT_CDS_RETURN;
 290   static void set_class_has_failed_verification(InstanceKlass* ik) NOT_CDS_RETURN;
 291   static bool has_class_failed_verification(InstanceKlass* ik) NOT_CDS_RETURN_(false);
 292   static void add_lambda_proxy_class(InstanceKlass* caller_ik,
 293                                      InstanceKlass* lambda_ik,
 294                                      Symbol* invoked_name,
 295                                      Symbol* invoked_type,
 296                                      Symbol* method_type,
 297                                      Method* member_method,
 298                                      Symbol* instantiated_method_type) NOT_CDS_RETURN;
 299   static InstanceKlass* get_shared_lambda_proxy_class(InstanceKlass* caller_ik,
 300                                                       Symbol* invoked_name,
 301                                                       Symbol* invoked_type,
 302                                                       Symbol* method_type,
 303                                                       Method* member_method,
 304                                                       Symbol* instantiated_method_type) NOT_CDS_RETURN_(NULL);
 305   static InstanceKlass* get_shared_nest_host(InstanceKlass* lambda_ik) NOT_CDS_RETURN_(NULL);
 306   static InstanceKlass* prepare_shared_lambda_proxy_class(InstanceKlass* lambda_ik,
 307                                                           InstanceKlass* caller_ik,
 308                                                           bool initialize, TRAPS) NOT_CDS_RETURN_(NULL);
 309   static bool check_linking_constraints(InstanceKlass* klass, TRAPS) NOT_CDS_RETURN_(false);
 310   static void record_linking_constraint(Symbol* name, InstanceKlass* klass,
 311                                      Handle loader1, Handle loader2, TRAPS) NOT_CDS_RETURN;
 312   static bool is_builtin(InstanceKlass* k) {
 313     return (k->shared_classpath_index() != UNREGISTERED_INDEX);
 314   }
 315   static void check_excluded_classes();
 316   static void validate_before_archiving(InstanceKlass* k);
 317   static bool is_excluded_class(InstanceKlass* k);
 318   static void dumptime_classes_do(class MetaspaceClosure* it);
 319   static size_t estimate_size_for_archive();
 320   static void write_to_archive(bool is_static_archive = true);
 321   static void adjust_lambda_proxy_class_dictionary();
 322   static void serialize_dictionary_headers(class SerializeClosure* soc,
 323                                            bool is_static_archive = true);
 324   static void serialize_well_known_klasses(class SerializeClosure* soc);
 325   static void print() { return print_on(tty); }
 326   static void print_on(outputStream* st) NOT_CDS_RETURN;
 327   static void print_table_statistics(outputStream* st) NOT_CDS_RETURN;
 328   static bool empty_dumptime_table() NOT_CDS_RETURN_(true);
 329 
 330   DEBUG_ONLY(static bool no_class_loading_should_happen() {return _no_class_loading_should_happen;})
 331 
 332 #ifdef ASSERT
 333   class NoClassLoadingMark: public StackObj {
 334   public:
 335     NoClassLoadingMark() {
 336       assert(!_no_class_loading_should_happen, "must not be nested");
 337       _no_class_loading_should_happen = true;
 338     }
 339     ~NoClassLoadingMark() {
 340       _no_class_loading_should_happen = false;
 341     }
 342   };
 343 #endif
 344 
 345   template <typename T>
 346   static unsigned int hash_for_shared_dictionary(T* ptr) {
 347     assert(ptr > (T*)SharedBaseAddress, "must be");
 348     address p = address(ptr) - SharedBaseAddress;
 349     return primitive_hash<address>(p);
 350   }
 351 
 352 #if INCLUDE_CDS_JAVA_HEAP
 353 private:
 354   static void update_archived_mirror_native_pointers_for(RunTimeSharedDictionary* dict);
 355 public:
 356   static void update_archived_mirror_native_pointers() NOT_CDS_RETURN;
 357 #endif
 358 };
 359 
 360 #endif // SHARE_CLASSFILE_SYSTEMDICTIONARYSHARED_HPP