1 /*
  2  * Copyright (c) 2023, 2026, 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_AOTCACHEACCESS_HPP
 26 #define SHARE_CDS_AOTCACHEACCESS_HPP
 27 
 28 #include "cds/archiveBuilder.hpp"
 29 #include "cds/archiveUtils.hpp"
 30 #include "memory/allStatic.hpp"
 31 #include "oops/oopsHierarchy.hpp"
 32 #include "utilities/globalDefinitions.hpp"
 33 
 34 class InstanceKlass;
 35 class Klass;
 36 class Method;
 37 class ReservedSpace;
 38 
 39 class AOTCacheAccess : AllStatic {
 40 private:
 41   static bool can_generate_aot_code(address addr) NOT_CDS_RETURN_(false);
 42   static bool class_or_super_has_runtime_setup(InstanceKlass *ik) ;
 43 
 44 public:
 45   static bool can_generate_aot_code(Method* m) {
 46     return can_generate_aot_code((address)m);
 47   }
 48   static bool can_generate_aot_code(Klass* k) {
 49     assert(!k->is_instance_klass(), "other method should be called");
 50     return can_generate_aot_code((address)k);
 51   }
 52   static bool can_generate_aot_code_for(InstanceKlass* ik) NOT_CDS_RETURN_(false);
 53 
 54   /*
 55    * Will this class be moved into fully_initialized state before execution
 56    * of Java bytecodes? This function can be called during assembly or production.
 57    */
 58   static bool is_early_aot_inited_class(InstanceKlass* ik) NOT_CDS_RETURN_(false);
 59 
 60   /*
 61    * Used during an assembly run to compute the offset of the metadata object in the AOT Cache.
 62    * The input argument is the "source" address of a metadata object (Method/Klass) loaded by the assembly JVM.
 63    * Computation of the offset requires mapping the supplied metadata object to its "requested" address
 64    * and subtracting that address from the requested base address.
 65    * See ArchiveBuilder.hpp for definition of "source" and "requested" address.
 66    */
 67   static uint delta_from_base_address(address addr);
 68 
 69   /*
 70    * Used during a production run to materialize a pointer to a Klass located in a loaded AOT Cache.
 71    * The offset argument identifies a delta from the AOT Cache's currently mapped base address to the start of the Klass object.
 72    * The offset is normally obtained by reading a value embedded in some other AOT-ed entry, like an AOT compiled code.
 73    */
 74   static Klass* convert_offset_to_klass(uint offset_from_base_addr) {
 75     Metadata* metadata = (Metadata*)((address)SharedBaseAddress + offset_from_base_addr);
 76     assert(metadata->is_klass(), "sanity check");
 77     return (Klass*)metadata;
 78   }
 79 
 80   /*
 81    * Used during a production run to materialize a pointer to a Method located in a loaded AOT Cache.
 82    * The offset argument identifies a delta from the AOT Cache's currently mapped base address to the start of the Method object.
 83    * The offset is normally obtained by reading a value embedded in some other AOT-ed entry, like an AOT compiled code.
 84    */
 85   static Method* convert_offset_to_method(uint offset_from_base_addr) {
 86     Metadata* metadata = (Metadata*)((address)SharedBaseAddress + offset_from_base_addr);
 87     assert(metadata->is_method(), "sanity check");
 88     return (Method*)metadata;
 89   }
 90 
 91   // Used during production run to convert a Method in AOTCache to offset from SharedBaseAddress
 92   static uint convert_method_to_offset(Method* method);
 93 
 94   static int get_archived_object_permanent_index(oop obj) NOT_CDS_JAVA_HEAP_RETURN_(-1);
 95   static oop get_archived_object(int permanent_index) NOT_CDS_JAVA_HEAP_RETURN_(nullptr);
 96 
 97   static void* allocate_aot_code_region(size_t size) NOT_CDS_RETURN_(nullptr);
 98 
 99   static size_t get_aot_code_region_size() NOT_CDS_RETURN_(0);
100   static void set_aot_code_region_size(size_t sz) NOT_CDS_RETURN;
101 
102   static bool map_aot_code_region(ReservedSpace rs) NOT_CDS_RETURN_(false);
103 
104   static bool is_aot_code_region_empty() NOT_CDS_RETURN_(true);
105 
106   template <typename T>
107   static void set_pointer(T** ptr, T* value) {
108     set_pointer((address*)ptr, (address)value);
109   }
110   static void set_pointer(address* ptr, address value);
111 };
112 
113 #endif // SHARE_CDS_AOTCACHEACCESS_HPP