1 /* 2 * Copyright (c) 2003, 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 "interpreter/interpreter.hpp" 26 #include "memory/metadataFactory.hpp" 27 #include "memory/metaspaceClosure.hpp" 28 #include "memory/resourceArea.hpp" 29 #include "oops/constMethod.hpp" 30 #include "oops/method.hpp" 31 #include "runtime/safepointVerifiers.hpp" 32 #include "runtime/signature.hpp" 33 #include "utilities/align.hpp" 34 #include "utilities/checkedCast.hpp" 35 36 // Static initialization 37 const u2 ConstMethod::MAX_IDNUM = 0xFFFE; 38 const u2 ConstMethod::UNSET_IDNUM = 0xFFFF; 39 40 ConstMethod* ConstMethod::allocate(ClassLoaderData* loader_data, 41 int byte_code_size, 42 InlineTableSizes* sizes, 43 MethodType method_type, 44 TRAPS) { 45 int size = ConstMethod::size(byte_code_size, sizes); 46 return new (loader_data, size, MetaspaceObj::ConstMethodType, THREAD) ConstMethod( 47 byte_code_size, sizes, method_type, size); 48 } 49 50 ConstMethod::ConstMethod(int byte_code_size, 51 InlineTableSizes* sizes, 52 MethodType method_type, 53 int size) { 54 55 NoSafepointVerifier no_safepoint; 56 init_fingerprint(); 57 set_constants(nullptr); 58 set_stackmap_data(nullptr); 59 set_code_size(byte_code_size); 60 set_constMethod_size(size); 61 set_inlined_tables_length(sizes); // sets _flags 62 set_method_type(method_type); 63 assert(this->size() == size, "wrong size for object"); 64 set_name_index(0); 65 set_signature_index(0); 66 set_constants(nullptr); 67 set_max_stack(0); 68 set_max_locals(0); 69 set_method_idnum(0); 70 set_size_of_parameters(0); 71 set_result_type((BasicType)0); 72 } 73 74 // Derive size of parameters, return type, and fingerprint, 75 // all in one pass, which is run at load time. 76 // We need the first two, and might as well grab the third. 77 void ConstMethod::compute_from_signature(Symbol* sig, bool is_static) { 78 // At this point, since we are scanning the signature, 79 // we might as well compute the whole fingerprint. 80 Fingerprinter fp(sig, is_static); 81 set_size_of_parameters(fp.size_of_parameters()); 82 set_num_stack_arg_slots(fp.num_stack_arg_slots()); 83 set_result_type(fp.return_type()); 84 set_fingerprint(fp.fingerprint()); 85 } 86 87 88 // Accessor that copies to metadata. 89 void ConstMethod::copy_stackmap_data(ClassLoaderData* loader_data, 90 u1* sd, int length, TRAPS) { 91 _stackmap_data = MetadataFactory::new_array<u1>(loader_data, length, CHECK); 92 memcpy((void*)_stackmap_data->adr_at(0), (void*)sd, length); 93 } 94 95 // Deallocate metadata fields associated with ConstMethod* 96 void ConstMethod::deallocate_contents(ClassLoaderData* loader_data) { 97 if (stackmap_data() != nullptr) { 98 MetadataFactory::free_array<u1>(loader_data, stackmap_data()); 99 } 100 set_stackmap_data(nullptr); 101 102 // deallocate annotation arrays 103 if (has_method_annotations()) 104 MetadataFactory::free_array<u1>(loader_data, method_annotations()); 105 if (has_parameter_annotations()) 106 MetadataFactory::free_array<u1>(loader_data, parameter_annotations()); 107 if (has_type_annotations()) 108 MetadataFactory::free_array<u1>(loader_data, type_annotations()); 109 if (has_default_annotations()) 110 MetadataFactory::free_array<u1>(loader_data, default_annotations()); 111 } 112 113 // How big must this constMethodObject be? 114 115 int ConstMethod::size(int code_size, 116 InlineTableSizes* sizes) { 117 int extra_bytes = code_size; 118 if (sizes->compressed_linenumber_size() > 0) { 119 extra_bytes += sizes->compressed_linenumber_size(); 120 } 121 if (sizes->checked_exceptions_length() > 0) { 122 extra_bytes += sizeof(u2); 123 extra_bytes += sizes->checked_exceptions_length() * (int)sizeof(CheckedExceptionElement); 124 } 125 if (sizes->localvariable_table_length() > 0) { 126 extra_bytes += sizeof(u2); 127 extra_bytes += 128 sizes->localvariable_table_length() * (int)sizeof(LocalVariableTableElement); 129 } 130 if (sizes->exception_table_length() > 0) { 131 extra_bytes += sizeof(u2); 132 extra_bytes += sizes->exception_table_length() * (int)sizeof(ExceptionTableElement); 133 } 134 if (sizes->generic_signature_index() != 0) { 135 extra_bytes += sizeof(u2); 136 } 137 // This has to be a less-than-or-equal check, because we might be 138 // storing information from a zero-length MethodParameters 139 // attribute. We have to store these, because in some cases, they 140 // cause the reflection API to throw a MalformedParametersException. 141 if (sizes->method_parameters_length() >= 0) { 142 extra_bytes += sizeof(u2); 143 extra_bytes += sizes->method_parameters_length() * (int)sizeof(MethodParametersElement); 144 } 145 146 // Align sizes up to a word. 147 extra_bytes = align_up(extra_bytes, BytesPerWord); 148 149 // One pointer per annotation array 150 if (sizes->method_annotations_length() > 0) { 151 extra_bytes += (int)sizeof(AnnotationArray*); 152 } 153 if (sizes->parameter_annotations_length() > 0) { 154 extra_bytes += (int)sizeof(AnnotationArray*); 155 } 156 if (sizes->type_annotations_length() > 0) { 157 extra_bytes += (int)sizeof(AnnotationArray*); 158 } 159 if (sizes->default_annotations_length() > 0) { 160 extra_bytes += (int)sizeof(AnnotationArray*); 161 } 162 163 int extra_words = align_up(extra_bytes, BytesPerWord) / BytesPerWord; 164 assert(extra_words == extra_bytes/BytesPerWord, "should already be aligned"); 165 return align_metadata_size(header_size() + extra_words); 166 } 167 168 Method* ConstMethod::method() const { 169 return _constants->pool_holder()->method_with_idnum(_method_idnum); 170 } 171 172 // linenumber table - note that length is unknown until decompression, 173 // see class CompressedLineNumberReadStream. 174 175 u_char* ConstMethod::compressed_linenumber_table() const { 176 // Located immediately following the bytecodes. 177 assert(has_linenumber_table(), "called only if table is present"); 178 return code_end(); 179 } 180 181 // Last short in ConstMethod* before annotations 182 u2* ConstMethod::last_u2_element() const { 183 int offset = 0; 184 if (has_method_annotations()) offset++; 185 if (has_parameter_annotations()) offset++; 186 if (has_type_annotations()) offset++; 187 if (has_default_annotations()) offset++; 188 return (u2*)((AnnotationArray**)constMethod_end() - offset) - 1; 189 } 190 191 u2* ConstMethod::generic_signature_index_addr() const { 192 // Located at the end of the constMethod. 193 assert(has_generic_signature(), "called only if generic signature exists"); 194 return last_u2_element(); 195 } 196 197 u2* ConstMethod::method_parameters_length_addr() const { 198 assert(has_method_parameters(), "called only if table is present"); 199 return has_generic_signature() ? (last_u2_element() - 1) : 200 last_u2_element(); 201 } 202 203 u2* ConstMethod::checked_exceptions_length_addr() const { 204 // Located immediately before the generic signature index. 205 assert(has_checked_exceptions(), "called only if table is present"); 206 if(has_method_parameters()) { 207 // If method parameters present, locate immediately before them. 208 return (u2*)method_parameters_start() - 1; 209 } else { 210 // Else, the exception table is at the end of the constMethod. 211 return has_generic_signature() ? (last_u2_element() - 1) : 212 last_u2_element(); 213 } 214 } 215 216 u2* ConstMethod::exception_table_length_addr() const { 217 assert(has_exception_table(), "called only if table is present"); 218 if (has_checked_exceptions()) { 219 // If checked_exception present, locate immediately before them. 220 return (u2*) checked_exceptions_start() - 1; 221 } else { 222 if(has_method_parameters()) { 223 // If method parameters present, locate immediately before them. 224 return (u2*)method_parameters_start() - 1; 225 } else { 226 // Else, the exception table is at the end of the constMethod. 227 return has_generic_signature() ? (last_u2_element() - 1) : 228 last_u2_element(); 229 } 230 } 231 } 232 233 u2* ConstMethod::localvariable_table_length_addr() const { 234 assert(has_localvariable_table(), "called only if table is present"); 235 if (has_exception_table()) { 236 // If exception_table present, locate immediately before them. 237 return (u2*) exception_table_start() - 1; 238 } else { 239 if (has_checked_exceptions()) { 240 // If checked_exception present, locate immediately before them. 241 return (u2*) checked_exceptions_start() - 1; 242 } else { 243 if(has_method_parameters()) { 244 // If method parameters present, locate immediately before them. 245 return (u2*)method_parameters_start() - 1; 246 } else { 247 // Else, the exception table is at the end of the constMethod. 248 return has_generic_signature() ? (last_u2_element() - 1) : 249 last_u2_element(); 250 } 251 } 252 } 253 } 254 255 // Update the flags to indicate the presence of these optional fields. 256 void ConstMethod::set_inlined_tables_length(InlineTableSizes* sizes) { 257 if (sizes->compressed_linenumber_size() > 0) 258 set_has_linenumber_table(); 259 if (sizes->generic_signature_index() != 0) 260 set_has_generic_signature(); 261 if (sizes->method_parameters_length() >= 0) 262 set_has_method_parameters(); 263 if (sizes->checked_exceptions_length() > 0) 264 set_has_checked_exceptions(); 265 if (sizes->exception_table_length() > 0) 266 set_has_exception_table(); 267 if (sizes->localvariable_table_length() > 0) 268 set_has_localvariable_table(); 269 270 // annotations, they are all pointer sized embedded objects so don't have 271 // a length embedded also. 272 if (sizes->method_annotations_length() > 0) 273 set_has_method_annotations(); 274 if (sizes->parameter_annotations_length() > 0) 275 set_has_parameter_annotations(); 276 if (sizes->type_annotations_length() > 0) 277 set_has_type_annotations(); 278 if (sizes->default_annotations_length() > 0) 279 set_has_default_annotations(); 280 281 // This code is extremely brittle and should possibly be revised. 282 // The *_length_addr functions walk backwards through the 283 // constMethod data, using each of the length indexes ahead of them, 284 // as well as the flags variable. Therefore, the indexes must be 285 // initialized in reverse order, or else they will compute the wrong 286 // offsets. Moving the initialization of _flags into a separate 287 // block solves *half* of the problem, but the following part will 288 // still break if the order is not exactly right. 289 // 290 // Also, the servicability agent needs to be informed anytime 291 // anything is added here. It might be advisable to have some sort 292 // of indication of this inline. 293 if (sizes->generic_signature_index() != 0) 294 *(generic_signature_index_addr()) = checked_cast<u2>(sizes->generic_signature_index()); 295 // New data should probably go here. 296 if (sizes->method_parameters_length() >= 0) 297 *(method_parameters_length_addr()) = checked_cast<u2>(sizes->method_parameters_length()); 298 if (sizes->checked_exceptions_length() > 0) 299 *(checked_exceptions_length_addr()) = checked_cast<u2>(sizes->checked_exceptions_length()); 300 if (sizes->exception_table_length() > 0) 301 *(exception_table_length_addr()) = checked_cast<u2>(sizes->exception_table_length()); 302 if (sizes->localvariable_table_length() > 0) 303 *(localvariable_table_length_addr()) = checked_cast<u2>(sizes->localvariable_table_length()); 304 } 305 306 int ConstMethod::method_parameters_length() const { 307 return has_method_parameters() ? *(method_parameters_length_addr()) : -1; 308 } 309 310 MethodParametersElement* ConstMethod::method_parameters_start() const { 311 u2* addr = method_parameters_length_addr(); 312 u2 length = *addr; 313 addr -= length * sizeof(MethodParametersElement) / sizeof(u2); 314 return (MethodParametersElement*) addr; 315 } 316 317 318 u2 ConstMethod::checked_exceptions_length() const { 319 return has_checked_exceptions() ? *(checked_exceptions_length_addr()) : 0; 320 } 321 322 323 CheckedExceptionElement* ConstMethod::checked_exceptions_start() const { 324 u2* addr = checked_exceptions_length_addr(); 325 u2 length = *addr; 326 assert(length > 0, "should only be called if table is present"); 327 addr -= length * sizeof(CheckedExceptionElement) / sizeof(u2); 328 return (CheckedExceptionElement*) addr; 329 } 330 331 332 u2 ConstMethod::localvariable_table_length() const { 333 return has_localvariable_table() ? *(localvariable_table_length_addr()) : 0; 334 } 335 336 337 LocalVariableTableElement* ConstMethod::localvariable_table_start() const { 338 u2* addr = localvariable_table_length_addr(); 339 u2 length = *addr; 340 assert(length > 0, "should only be called if table is present"); 341 addr -= length * sizeof(LocalVariableTableElement) / sizeof(u2); 342 return (LocalVariableTableElement*) addr; 343 } 344 345 u2 ConstMethod::exception_table_length() const { 346 return has_exception_table() ? *(exception_table_length_addr()) : 0; 347 } 348 349 ExceptionTableElement* ConstMethod::exception_table_start() const { 350 u2* addr = exception_table_length_addr(); 351 u2 length = *addr; 352 assert(length > 0, "should only be called if table is present"); 353 addr -= length * sizeof(ExceptionTableElement) / sizeof(u2); 354 return (ExceptionTableElement*)addr; 355 } 356 357 AnnotationArray** ConstMethod::method_annotations_addr() const { 358 assert(has_method_annotations(), "should only be called if method annotations are present"); 359 return (AnnotationArray**)constMethod_end() - 1; 360 } 361 362 AnnotationArray** ConstMethod::parameter_annotations_addr() const { 363 assert(has_parameter_annotations(), "should only be called if method parameter annotations are present"); 364 int offset = 1; 365 if (has_method_annotations()) offset++; 366 return (AnnotationArray**)constMethod_end() - offset; 367 } 368 369 AnnotationArray** ConstMethod::type_annotations_addr() const { 370 assert(has_type_annotations(), "should only be called if method type annotations are present"); 371 int offset = 1; 372 if (has_method_annotations()) offset++; 373 if (has_parameter_annotations()) offset++; 374 return (AnnotationArray**)constMethod_end() - offset; 375 } 376 377 AnnotationArray** ConstMethod::default_annotations_addr() const { 378 assert(has_default_annotations(), "should only be called if method default annotations are present"); 379 int offset = 1; 380 if (has_method_annotations()) offset++; 381 if (has_parameter_annotations()) offset++; 382 if (has_type_annotations()) offset++; 383 return (AnnotationArray**)constMethod_end() - offset; 384 } 385 386 static Array<u1>* copy_annotations(ClassLoaderData* loader_data, AnnotationArray* from, TRAPS) { 387 int length = from->length(); 388 Array<u1>* a = MetadataFactory::new_array<u1>(loader_data, length, 0, CHECK_NULL); 389 memcpy((void*)a->adr_at(0), (void*)from->adr_at(0), length); 390 return a; 391 } 392 393 // copy annotations from 'cm' to 'this' 394 // Must make copy because these are deallocated with their constMethod, if redefined. 395 void ConstMethod::copy_annotations_from(ClassLoaderData* loader_data, ConstMethod* cm, TRAPS) { 396 Array<u1>* a; 397 if (cm->has_method_annotations()) { 398 assert(has_method_annotations(), "should be allocated already"); 399 a = copy_annotations(loader_data, cm->method_annotations(), CHECK); 400 set_method_annotations(a); 401 } 402 if (cm->has_parameter_annotations()) { 403 assert(has_parameter_annotations(), "should be allocated already"); 404 a = copy_annotations(loader_data, cm->parameter_annotations(), CHECK); 405 set_parameter_annotations(a); 406 } 407 if (cm->has_type_annotations()) { 408 assert(has_type_annotations(), "should be allocated already"); 409 a = copy_annotations(loader_data, cm->type_annotations(), CHECK); 410 set_type_annotations(a); 411 } 412 if (cm->has_default_annotations()) { 413 assert(has_default_annotations(), "should be allocated already"); 414 a = copy_annotations(loader_data, cm->default_annotations(), CHECK); 415 set_default_annotations(a); 416 } 417 } 418 419 void ConstMethod::metaspace_pointers_do(MetaspaceClosure* it) { 420 log_trace(cds)("Iter(ConstMethod): %p", this); 421 422 if (constants()->pool_holder() != nullptr && !method()->method_holder()->is_rewritten()) { 423 // holder is null for MH intrinsic methods 424 it->push(&_constants, MetaspaceClosure::_writable); 425 } else { 426 it->push(&_constants); 427 } 428 it->push(&_stackmap_data); 429 if (has_method_annotations()) { 430 it->push(method_annotations_addr()); 431 } 432 if (has_parameter_annotations()) { 433 it->push(parameter_annotations_addr()); 434 } 435 if (has_type_annotations()) { 436 it->push(type_annotations_addr()); 437 } 438 if (has_default_annotations()) { 439 it->push(default_annotations_addr()); 440 } 441 } 442 443 // Printing 444 445 void ConstMethod::print_on(outputStream* st) const { 446 ResourceMark rm; 447 st->print_cr("%s", internal_name()); 448 Method* m = method(); 449 st->print(" - method: " PTR_FORMAT " ", p2i(m)); 450 if (m != nullptr) { 451 m->print_value_on(st); 452 } 453 st->cr(); 454 st->print(" - flags: 0x%x ", _flags.as_int()); _flags.print_on(st); st->cr(); 455 if (has_stackmap_table()) { 456 st->print(" - stackmap data: "); 457 stackmap_data()->print_value_on(st); 458 st->cr(); 459 } 460 } 461 462 // Short version of printing ConstMethod* - just print the name of the 463 // method it belongs to. 464 void ConstMethod::print_value_on(outputStream* st) const { 465 st->print(" const part of method " ); 466 Method* m = method(); 467 if (m != nullptr) { 468 m->print_value_on(st); 469 } else { 470 st->print("null"); 471 } 472 } 473 474 // Verification 475 476 void ConstMethod::verify_on(outputStream* st) { 477 // Verification can occur during oop construction before the method or 478 // other fields have been initialized. 479 guarantee(method() != nullptr && method()->is_method(), "should be method"); 480 481 address m_end = (address)((intptr_t) this + size()); 482 address compressed_table_start = code_end(); 483 guarantee(compressed_table_start <= m_end, "invalid method layout"); 484 address compressed_table_end = compressed_table_start; 485 // Verify line number table 486 if (has_linenumber_table()) { 487 CompressedLineNumberReadStream stream(compressed_linenumber_table()); 488 while (stream.read_pair()) { 489 guarantee(stream.bci() >= 0 && stream.bci() <= code_size(), "invalid bci in line number table"); 490 } 491 compressed_table_end += stream.position(); 492 } 493 guarantee(compressed_table_end <= m_end, "invalid method layout"); 494 // Verify checked exceptions, exception table and local variable tables 495 if (has_method_parameters()) { 496 u2* addr = method_parameters_length_addr(); 497 guarantee(*addr > 0 && (address) addr >= compressed_table_end && (address) addr < m_end, "invalid method layout"); 498 } 499 if (has_checked_exceptions()) { 500 u2* addr = checked_exceptions_length_addr(); 501 guarantee(*addr > 0 && (address) addr >= compressed_table_end && (address) addr < m_end, "invalid method layout"); 502 } 503 if (has_exception_table()) { 504 u2* addr = exception_table_length_addr(); 505 guarantee(*addr > 0 && (address) addr >= compressed_table_end && (address) addr < m_end, "invalid method layout"); 506 } 507 if (has_localvariable_table()) { 508 u2* addr = localvariable_table_length_addr(); 509 guarantee(*addr > 0 && (address) addr >= compressed_table_end && (address) addr < m_end, "invalid method layout"); 510 } 511 // Check compressed_table_end relative to uncompressed_table_start 512 u2* uncompressed_table_start; 513 if (has_localvariable_table()) { 514 uncompressed_table_start = (u2*) localvariable_table_start(); 515 } else if (has_exception_table()) { 516 uncompressed_table_start = (u2*) exception_table_start(); 517 } else if (has_checked_exceptions()) { 518 uncompressed_table_start = (u2*) checked_exceptions_start(); 519 } else if (has_method_parameters()) { 520 uncompressed_table_start = (u2*) method_parameters_start(); 521 } else { 522 uncompressed_table_start = (u2*) m_end; 523 } 524 int gap = int((intptr_t) uncompressed_table_start - (intptr_t) compressed_table_end); 525 int max_gap = align_metadata_size(1)*BytesPerWord; 526 guarantee(gap >= 0 && gap < max_gap, "invalid method layout"); 527 }