1 /* 2 * Copyright (c) 1999, 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 #include "ci/ciKlass.hpp" 26 #include "ci/ciSymbol.hpp" 27 #include "ci/ciUtilities.inline.hpp" 28 #include "oops/klass.inline.hpp" 29 #include "oops/oop.inline.hpp" 30 31 // ciKlass 32 // 33 // This class represents a Klass* in the HotSpot virtual 34 // machine. 35 36 // ------------------------------------------------------------------ 37 // ciKlass::ciKlass 38 ciKlass::ciKlass(Klass* k) : ciType(k) { 39 assert(get_Klass()->is_klass(), "wrong type"); 40 Klass* klass = get_Klass(); 41 _layout_helper = klass->layout_helper(); 42 Symbol* klass_name = klass->name(); 43 assert(klass_name != nullptr, "wrong ciKlass constructor"); 44 _name = CURRENT_ENV->get_symbol(klass_name); 45 } 46 47 // ------------------------------------------------------------------ 48 // ciKlass::ciKlass 49 // 50 // Nameless klass variant. 51 ciKlass::ciKlass(Klass* k, ciSymbol* name) : ciType(k) { 52 assert(get_Klass()->is_klass(), "wrong type"); 53 _name = name; 54 _layout_helper = Klass::_lh_neutral_value; 55 } 56 57 // ------------------------------------------------------------------ 58 // ciKlass::ciKlass 59 // 60 // Unloaded klass variant. 61 ciKlass::ciKlass(ciSymbol* name, BasicType bt) : ciType(bt) { 62 _name = name; 63 _layout_helper = Klass::_lh_neutral_value; 64 } 65 66 // ------------------------------------------------------------------ 67 // ciKlass::is_subtype_of 68 bool ciKlass::is_subtype_of(ciKlass* that) { 69 assert(this->is_loaded(), "must be loaded: %s", this->name()->as_quoted_ascii()); 70 assert(that->is_loaded(), "must be loaded: %s", that->name()->as_quoted_ascii()); 71 72 // Check to see if the klasses are identical. 73 if (this == that) { 74 return true; 75 } 76 77 bool is_subtype; 78 GUARDED_VM_ENTRY(is_subtype = get_Klass()->is_subtype_of(that->get_Klass());) 79 80 // Ensure consistency with ciInstanceKlass::has_subklass(). 81 assert(!that->is_instance_klass() || // array klasses are irrelevant 82 that->is_interface() || // has_subklass is always false for interfaces 83 !is_subtype || that->as_instance_klass()->has_subklass(), "inconsistent"); 84 85 return is_subtype; 86 } 87 88 // ------------------------------------------------------------------ 89 // ciKlass::is_subclass_of 90 bool ciKlass::is_subclass_of(ciKlass* that) { 91 assert(this->is_loaded(), "must be loaded: %s", this->name()->as_quoted_ascii()); 92 assert(that->is_loaded(), "must be loaded: %s", that->name()->as_quoted_ascii()); 93 94 // Check to see if the klasses are identical. 95 if (this == that) { 96 return true; 97 } 98 99 bool is_subclass; 100 GUARDED_VM_ENTRY(is_subclass = get_Klass()->is_subclass_of(that->get_Klass());) 101 102 // Ensure consistency with ciInstanceKlass::has_subklass(). 103 assert(!that->is_instance_klass() || // array klasses are irrelevant 104 that->is_interface() || // has_subklass is always false for interfaces 105 !is_subclass || that->as_instance_klass()->has_subklass(), "inconsistent"); 106 107 return is_subclass; 108 } 109 110 // ------------------------------------------------------------------ 111 // ciKlass::super_depth 112 juint ciKlass::super_depth() { 113 assert(is_loaded(), "must be loaded"); 114 115 VM_ENTRY_MARK; 116 Klass* this_klass = get_Klass(); 117 return this_klass->super_depth(); 118 } 119 120 // ------------------------------------------------------------------ 121 // ciKlass::super_check_offset 122 juint ciKlass::super_check_offset() { 123 assert(is_loaded(), "must be loaded"); 124 125 VM_ENTRY_MARK; 126 Klass* this_klass = get_Klass(); 127 return this_klass->super_check_offset(); 128 } 129 130 // ------------------------------------------------------------------ 131 // ciKlass::super_of_depth 132 ciKlass* ciKlass::super_of_depth(juint i) { 133 assert(is_loaded(), "must be loaded"); 134 135 VM_ENTRY_MARK; 136 Klass* this_klass = get_Klass(); 137 Klass* super = this_klass->primary_super_of_depth(i); 138 return (super != nullptr) ? CURRENT_THREAD_ENV->get_klass(super) : nullptr; 139 } 140 141 // ------------------------------------------------------------------ 142 // ciKlass::least_common_ancestor 143 // 144 // Get the shared parent of two klasses. 145 // 146 // Implementation note: this method currently goes "over the wall" 147 // and does all of the work on the VM side. It could be rewritten 148 // to use the super() method and do all of the work (aside from the 149 // lazy computation of super()) in native mode. This may be 150 // worthwhile if the compiler is repeatedly requesting the same lca 151 // computation or possibly if most of the superklasses have already 152 // been created as ciObjects anyway. Something to think about... 153 ciKlass* 154 ciKlass::least_common_ancestor(ciKlass* that) { 155 assert(is_loaded() && that->is_loaded(), "must be loaded"); 156 // Check to see if the klasses are identical. 157 if (this == that) { 158 return this; 159 } 160 161 VM_ENTRY_MARK; 162 Klass* this_klass = get_Klass(); 163 Klass* that_klass = that->get_Klass(); 164 Klass* lca = this_klass->LCA(that_klass); 165 166 // Many times the LCA will be either this_klass or that_klass. 167 // Treat these as special cases. 168 if (lca == that_klass) { 169 assert(this->is_subtype_of(that), "sanity"); 170 return that; 171 } 172 if (this_klass == lca) { 173 assert(that->is_subtype_of(this), "sanity"); 174 return this; 175 } 176 177 // Create the ciInstanceKlass for the lca. 178 ciKlass* result = 179 CURRENT_THREAD_ENV->get_klass(lca); 180 181 assert(this->is_subtype_of(result) && that->is_subtype_of(result), "sanity"); 182 return result; 183 } 184 185 // ------------------------------------------------------------------ 186 // ciKlass::find_klass 187 // 188 // Find a klass using this klass's class loader. 189 ciKlass* ciKlass::find_klass(ciSymbol* klass_name) { 190 assert(is_loaded(), "cannot find_klass through an unloaded klass"); 191 return CURRENT_ENV->get_klass_by_name(this, 192 klass_name, false); 193 } 194 195 // ------------------------------------------------------------------ 196 // ciKlass::java_mirror 197 // 198 // Get the instance of java.lang.Class corresponding to this klass. 199 // If it is an unloaded instance or array klass, return an unloaded 200 // mirror object of type Class. 201 ciInstance* ciKlass::java_mirror() { 202 GUARDED_VM_ENTRY( 203 if (!is_loaded()) 204 return ciEnv::current()->get_unloaded_klass_mirror(this); 205 oop java_mirror = get_Klass()->java_mirror(); 206 return CURRENT_ENV->get_instance(java_mirror); 207 ) 208 } 209 210 // ------------------------------------------------------------------ 211 // ciKlass::modifier_flags 212 jint ciKlass::modifier_flags() { 213 assert(is_loaded(), "not loaded"); 214 GUARDED_VM_ENTRY( 215 return get_Klass()->modifier_flags(); 216 ) 217 } 218 219 // ------------------------------------------------------------------ 220 // ciKlass::access_flags 221 jint ciKlass::access_flags() { 222 assert(is_loaded(), "not loaded"); 223 GUARDED_VM_ENTRY( 224 return get_Klass()->access_flags().as_unsigned_short(); 225 ) 226 } 227 228 // ------------------------------------------------------------------ 229 // ciKlass::misc_flags 230 klass_flags_t ciKlass::misc_flags() { 231 assert(is_loaded(), "not loaded"); 232 GUARDED_VM_ENTRY( 233 return get_Klass()->misc_flags(); 234 ) 235 } 236 237 // ------------------------------------------------------------------ 238 // ciKlass::print_impl 239 // 240 // Implementation of the print method 241 void ciKlass::print_impl(outputStream* st) { 242 st->print(" name="); 243 print_name_on(st); 244 st->print(" loaded=%s", (is_loaded() ? "true" : "false")); 245 } 246 247 // ------------------------------------------------------------------ 248 // ciKlass::print_name 249 // 250 // Print the name of this klass 251 void ciKlass::print_name_on(outputStream* st) { 252 name()->print_symbol_on(st); 253 } 254 255 const char* ciKlass::external_name() const { 256 GUARDED_VM_ENTRY( 257 return get_Klass()->external_name(); 258 ) 259 } 260 261 // ------------------------------------------------------------------ 262 // ciKlass::prototype_header_offset 263 juint ciKlass::prototype_header_offset() { 264 assert(is_loaded(), "must be loaded"); 265 266 VM_ENTRY_MARK; 267 Klass* this_klass = get_Klass(); 268 return in_bytes(this_klass->prototype_header_offset()); 269 } 270 271 // ------------------------------------------------------------------ 272 // ciKlass::prototype_header 273 uintptr_t ciKlass::prototype_header() { 274 assert(is_loaded(), "must be loaded"); 275 276 VM_ENTRY_MARK; 277 Klass* this_klass = get_Klass(); 278 return (uintptr_t)this_klass->prototype_header().to_pointer(); 279 }