1 /*
  2  * Copyright (c) 2024, 2025, 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_CDS_FINALIMAGERECIPES_HPP
 26 #define SHARE_CDS_FINALIMAGERECIPES_HPP
 27 
 28 #include "oops/oopsHierarchy.hpp"
 29 #include "utilities/exceptions.hpp"
 30 
 31 class InstanceKlass;
 32 class Klass;
 33 
 34 template <typename T> class GrowableArray;
 35 template <typename T> class Array;
 36 
 37 // This class is used for transferring information from the AOTConfiguration file (aka the "preimage")
 38 // to the JVM that creates the AOTCache (aka the "final image").
 39 //   - The recipes are recorded when CDSConfig::is_dumping_preimage_static_archive() is true.
 40 //   - The recipes are applied when CDSConfig::is_dumping_final_static_archive() is true.
 41 // The following information are recorded:
 42 //   - The list of all classes that are stored in the AOTConfiguration file.
 43 //   - The list of all classes that require AOT resolution of invokedynamic call sites.
 44 class FinalImageRecipes {
 45   // A list of all the archived classes from the preimage. We want to transfer all of these
 46   // into the final image.
 47   Array<Klass*>* _all_klasses;
 48 
 49   // The classes who have resolved at least one indy CP entry during the training run.
 50   // _indy_cp_indices[i] is a list of all resolved CP entries for _indy_klasses[i].
 51   Array<InstanceKlass*>* _indy_klasses;
 52   Array<Array<int>*>*    _indy_cp_indices;
 53 
 54   // The RefectionData for  _reflect_klasses[i] should be initialized with _reflect_flags[i]
 55   Array<InstanceKlass*>* _reflect_klasses;
 56   Array<int>*            _reflect_flags;
 57 
 58   static GrowableArray<InstanceKlass*>* _tmp_reflect_klasses;
 59   static GrowableArray<int>* _tmp_reflect_flags;
 60 
 61   struct TmpDynamicProxyClassInfo {
 62     int _loader_type;
 63     int _access_flags;
 64     const char* _proxy_name;
 65     GrowableArray<Klass*>* _interfaces;
 66   };
 67 
 68   struct DynamicProxyClassInfo {
 69     int _loader_type;
 70     int _access_flags;
 71     const char* _proxy_name;
 72     Array<Klass*>* _interfaces;
 73   };
 74 
 75   Array<DynamicProxyClassInfo>* _dynamic_proxy_classes;
 76 
 77   static GrowableArray<TmpDynamicProxyClassInfo>* _tmp_dynamic_proxy_classes;
 78 
 79   FinalImageRecipes() : _indy_klasses(nullptr), _indy_cp_indices(nullptr),
 80                         _reflect_klasses(nullptr), _reflect_flags(nullptr),
 81                         _dynamic_proxy_classes(nullptr) {}
 82 
 83 
 84   void* operator new(size_t size) throw();
 85 
 86   // Called when dumping preimage
 87   void record_recipes_impl();
 88 
 89   // Called when dumping final image
 90   void apply_recipes_impl(TRAPS);
 91   void load_all_classes(TRAPS);
 92   void apply_recipes_for_dynamic_proxies(TRAPS);
 93   void apply_recipes_for_invokedynamic(TRAPS);
 94   void apply_recipes_for_reflection_data(JavaThread* current);
 95 
 96 public:
 97   static void serialize(SerializeClosure* soc);
 98 
 99   // Called when dumping preimage
100   static void add_dynamic_proxy_class(oop loader, const char* proxy_name, objArrayOop interfaces, int access_flags);
101   static void add_reflection_data_flags(InstanceKlass* ik, TRAPS);
102   static void record_recipes();
103 
104   // Called when dumping final image
105   static void apply_recipes(TRAPS);
106 };
107 
108 #endif // SHARE_CDS_FINALIMAGERECIPES_HPP