1 /* 2 * Copyright (c) 1997, 2023, 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_CLASSFILEPARSER_HPP 26 #define SHARE_CLASSFILE_CLASSFILEPARSER_HPP 27 28 #include "memory/referenceType.hpp" 29 #include "oops/annotations.hpp" 30 #include "oops/constantPool.hpp" 31 #include "oops/fieldInfo.hpp" 32 #include "oops/instanceKlass.hpp" 33 #include "oops/typeArrayOop.hpp" 34 #include "utilities/accessFlags.hpp" 35 36 class Annotations; 37 template <typename T> 38 class Array; 39 class ClassFileStream; 40 class ClassLoaderData; 41 class ClassLoadInfo; 42 class ClassInstanceInfo; 43 class CompressedLineNumberWriteStream; 44 class ConstMethod; 45 class FieldInfo; 46 template <typename T> 47 class GrowableArray; 48 class InstanceKlass; 49 class RecordComponent; 50 class Symbol; 51 class FieldLayoutBuilder; 52 53 // Utility to collect and compact oop maps during layout 54 class OopMapBlocksBuilder : public ResourceObj { 55 public: 56 OopMapBlock* _nonstatic_oop_maps; 57 unsigned int _nonstatic_oop_map_count; 58 unsigned int _max_nonstatic_oop_maps; 59 60 OopMapBlocksBuilder(unsigned int max_blocks); 61 OopMapBlock* last_oop_map() const; 62 void initialize_inherited_blocks(OopMapBlock* blocks, unsigned int nof_blocks); 63 void add(int offset, int count); 64 void copy(OopMapBlock* dst); 65 void compact(); 66 void print_on(outputStream* st) const; 67 void print_value_on(outputStream* st) const; 68 }; 69 70 // Values needed for oopmap and InstanceKlass creation 71 class FieldLayoutInfo : public ResourceObj { 72 public: 73 OopMapBlocksBuilder* oop_map_blocks; 74 int _instance_size; 75 int _nonstatic_field_size; 76 int _static_field_size; 77 bool _has_nonstatic_fields; 78 bool _is_naturally_atomic; 79 bool _has_inline_fields; 80 }; 81 82 // Parser for for .class files 83 // 84 // The bytes describing the class file structure is read from a Stream object 85 86 class ClassFileParser { 87 friend class FieldLayoutBuilder; 88 friend class FieldLayout; 89 90 class ClassAnnotationCollector; 91 class FieldAllocationCount; 92 class FieldAnnotationCollector; 93 94 public: 95 // The ClassFileParser has an associated "publicity" level 96 // It is used to control which subsystems (if any) 97 // will observe the parsing (logging, events, tracing). 98 // Default level is "BROADCAST", which is equivalent to 99 // a "public" parsing attempt. 100 // 101 // "INTERNAL" level should be entirely private to the 102 // caller - this allows for internal reuse of ClassFileParser 103 // 104 enum Publicity { 105 INTERNAL, 106 BROADCAST 107 }; 108 109 enum { LegalClass, LegalField, LegalMethod }; // used to verify unqualified names 110 111 private: 112 // Potentially unaligned pointer to various 16-bit entries in the class file 113 typedef void unsafe_u2; 114 115 const ClassFileStream* _stream; // Actual input stream 116 Symbol* _class_name; 117 mutable ClassLoaderData* _loader_data; 118 const bool _is_hidden; 119 const bool _can_access_vm_annotations; 120 int _orig_cp_size; 121 122 // Metadata created before the instance klass is created. Must be deallocated 123 // if not transferred to the InstanceKlass upon successful class loading 124 // in which case these pointers have been set to null. 125 const InstanceKlass* _super_klass; 126 ConstantPool* _cp; 127 Array<u1>* _fieldinfo_stream; 128 Array<FieldStatus>* _fields_status; 129 Array<Method*>* _methods; 130 Array<u2>* _inner_classes; 131 Array<u2>* _nest_members; 132 u2 _nest_host; 133 Array<u2>* _permitted_subclasses; 134 Array<u2>* _preload_classes; 135 Array<RecordComponent*>* _record_components; 136 Array<InstanceKlass*>* _local_interfaces; 137 GrowableArray<u2>* _local_interface_indexes; 138 Array<InstanceKlass*>* _transitive_interfaces; 139 Annotations* _combined_annotations; 140 AnnotationArray* _class_annotations; 141 AnnotationArray* _class_type_annotations; 142 Array<AnnotationArray*>* _fields_annotations; 143 Array<AnnotationArray*>* _fields_type_annotations; 144 InstanceKlass* _klass; // InstanceKlass* once created. 145 InstanceKlass* _klass_to_deallocate; // an InstanceKlass* to be destroyed 146 147 ClassAnnotationCollector* _parsed_annotations; 148 FieldAllocationCount* _fac; 149 FieldLayoutInfo* _field_info; 150 Array<InlineKlass*>* _inline_type_field_klasses; 151 GrowableArray<FieldInfo>* _temp_field_info; 152 const intArray* _method_ordering; 153 GrowableArray<Method*>* _all_mirandas; 154 155 enum { fixed_buffer_size = 128 }; 156 u_char _linenumbertable_buffer[fixed_buffer_size]; 157 158 // Size of Java vtable (in words) 159 int _vtable_size; 160 int _itable_size; 161 162 int _num_miranda_methods; 163 164 int _alignment; 165 int _first_field_offset; 166 int _exact_size_in_bytes; 167 168 Handle _protection_domain; 169 AccessFlags _access_flags; 170 171 // for tracing and notifications 172 Publicity _pub_level; 173 174 // Used to keep track of whether a constant pool item 19 or 20 is found. These 175 // correspond to CONSTANT_Module and CONSTANT_Package tags and are not allowed 176 // in regular class files. For class file version >= 53, a CFE cannot be thrown 177 // immediately when these are seen because a NCDFE must be thrown if the class's 178 // access_flags have ACC_MODULE set. But, the access_flags haven't been looked 179 // at yet. So, the bad constant pool item is cached here. A value of zero 180 // means that no constant pool item 19 or 20 was found. 181 short _bad_constant_seen; 182 183 // class attributes parsed before the instance klass is created: 184 bool _synthetic_flag; 185 int _sde_length; 186 const char* _sde_buffer; 187 u2 _sourcefile_index; 188 u2 _generic_signature_index; 189 190 u2 _major_version; 191 u2 _minor_version; 192 u2 _this_class_index; 193 u2 _super_class_index; 194 u2 _itfs_len; 195 u2 _java_fields_count; 196 197 bool _need_verify; 198 bool _relax_verify; 199 200 bool _has_nonstatic_concrete_methods; 201 bool _declares_nonstatic_concrete_methods; 202 bool _has_localvariable_table; 203 bool _has_final_method; 204 bool _has_contended_fields; 205 206 bool _has_inline_type_fields; 207 bool _has_nonstatic_fields; 208 bool _is_empty_inline_type; 209 bool _is_naturally_atomic; 210 bool _is_declared_atomic; 211 bool _carries_value_modifier; // Has ACC_VALUE mddifier or one of its super types has 212 bool _carries_identity_modifier; // Has ACC_IDENTITY modifier or one of its super types has 213 214 // precomputed flags 215 bool _has_finalizer; 216 bool _has_empty_finalizer; 217 bool _has_vanilla_constructor; 218 int _max_bootstrap_specifier_index; // detects BSS values 219 220 void parse_stream(const ClassFileStream* const stream, TRAPS); 221 222 void mangle_hidden_class_name(InstanceKlass* const ik); 223 224 void post_process_parsed_stream(const ClassFileStream* const stream, 225 ConstantPool* cp, 226 TRAPS); 227 228 void fill_instance_klass(InstanceKlass* ik, bool cf_changed_in_CFLH, 229 const ClassInstanceInfo& cl_inst_info, TRAPS); 230 231 void set_klass(InstanceKlass* instance); 232 233 void set_class_bad_constant_seen(short bad_constant); 234 short class_bad_constant_seen() { return _bad_constant_seen; } 235 void set_class_synthetic_flag(bool x) { _synthetic_flag = x; } 236 void set_class_sourcefile_index(u2 x) { _sourcefile_index = x; } 237 void set_class_generic_signature_index(u2 x) { _generic_signature_index = x; } 238 void set_class_sde_buffer(const char* x, int len) { _sde_buffer = x; _sde_length = len; } 239 240 void create_combined_annotations(TRAPS); 241 void apply_parsed_class_attributes(InstanceKlass* k); // update k 242 void apply_parsed_class_metadata(InstanceKlass* k, int fields_count); 243 void clear_class_metadata(); 244 245 // Constant pool parsing 246 void parse_constant_pool_entries(const ClassFileStream* const stream, 247 ConstantPool* cp, 248 const int length, 249 TRAPS); 250 251 void parse_constant_pool(const ClassFileStream* const cfs, 252 ConstantPool* const cp, 253 const int length, 254 TRAPS); 255 256 // Interface parsing 257 void parse_interfaces(const ClassFileStream* const stream, 258 const int itfs_len, 259 ConstantPool* const cp, 260 bool* has_nonstatic_concrete_methods, 261 bool* is_declared_atomic, 262 TRAPS); 263 264 const InstanceKlass* parse_super_class(ConstantPool* const cp, 265 const int super_class_index, 266 const bool need_verify, 267 TRAPS); 268 269 // Field parsing 270 void parse_field_attributes(const ClassFileStream* const cfs, 271 u2 attributes_count, 272 bool is_static, 273 u2 signature_index, 274 u2* const constantvalue_index_addr, 275 bool* const is_synthetic_addr, 276 u2* const generic_signature_index_addr, 277 FieldAnnotationCollector* parsed_annotations, 278 TRAPS); 279 280 void parse_fields(const ClassFileStream* const cfs, 281 AccessFlags class_access_flags, 282 FieldAllocationCount* const fac, 283 ConstantPool* cp, 284 const int cp_size, 285 u2* const java_fields_count_ptr, 286 TRAPS); 287 288 // Method parsing 289 Method* parse_method(const ClassFileStream* const cfs, 290 bool is_interface, 291 bool is_value_class, 292 bool is_abstract_class, 293 const ConstantPool* cp, 294 bool* const has_localvariable_table, 295 TRAPS); 296 297 void parse_methods(const ClassFileStream* const cfs, 298 bool is_interface, 299 bool is_value_class, 300 bool is_abstract_class, 301 bool* const has_localvariable_table, 302 bool* const has_final_method, 303 bool* const declares_nonstatic_concrete_methods, 304 TRAPS); 305 306 const unsafe_u2* parse_exception_table(const ClassFileStream* const stream, 307 u4 code_length, 308 u4 exception_table_length, 309 TRAPS); 310 311 void parse_linenumber_table(u4 code_attribute_length, 312 u4 code_length, 313 CompressedLineNumberWriteStream**const write_stream, 314 TRAPS); 315 316 const unsafe_u2* parse_localvariable_table(const ClassFileStream* const cfs, 317 u4 code_length, 318 u2 max_locals, 319 u4 code_attribute_length, 320 u2* const localvariable_table_length, 321 bool isLVTT, 322 TRAPS); 323 324 const unsafe_u2* parse_checked_exceptions(const ClassFileStream* const cfs, 325 u2* const checked_exceptions_length, 326 u4 method_attribute_length, 327 TRAPS); 328 329 // Classfile attribute parsing 330 u2 parse_generic_signature_attribute(const ClassFileStream* const cfs, TRAPS); 331 void parse_classfile_sourcefile_attribute(const ClassFileStream* const cfs, TRAPS); 332 void parse_classfile_source_debug_extension_attribute(const ClassFileStream* const cfs, 333 int length, 334 TRAPS); 335 336 // Check for circularity in InnerClasses attribute. 337 bool check_inner_classes_circularity(const ConstantPool* cp, int length, TRAPS); 338 339 u2 parse_classfile_inner_classes_attribute(const ClassFileStream* const cfs, 340 const ConstantPool* cp, 341 const u1* const inner_classes_attribute_start, 342 bool parsed_enclosingmethod_attribute, 343 u2 enclosing_method_class_index, 344 u2 enclosing_method_method_index, 345 TRAPS); 346 347 u2 parse_classfile_nest_members_attribute(const ClassFileStream* const cfs, 348 const u1* const nest_members_attribute_start, 349 TRAPS); 350 351 u2 parse_classfile_permitted_subclasses_attribute(const ClassFileStream* const cfs, 352 const u1* const permitted_subclasses_attribute_start, 353 TRAPS); 354 355 u2 parse_classfile_preload_attribute(const ClassFileStream* const cfs, 356 const u1* const preload_attribute_start, 357 TRAPS); 358 359 u2 parse_classfile_record_attribute(const ClassFileStream* const cfs, 360 const ConstantPool* cp, 361 const u1* const record_attribute_start, 362 TRAPS); 363 364 void parse_classfile_attributes(const ClassFileStream* const cfs, 365 ConstantPool* cp, 366 ClassAnnotationCollector* parsed_annotations, 367 TRAPS); 368 369 void parse_classfile_synthetic_attribute(); 370 void parse_classfile_signature_attribute(const ClassFileStream* const cfs, TRAPS); 371 void parse_classfile_bootstrap_methods_attribute(const ClassFileStream* const cfs, 372 ConstantPool* cp, 373 u4 attribute_length, 374 TRAPS); 375 376 // Annotations handling 377 AnnotationArray* assemble_annotations(const u1* const runtime_visible_annotations, 378 int runtime_visible_annotations_length, 379 const u1* const runtime_invisible_annotations, 380 int runtime_invisible_annotations_length, 381 TRAPS); 382 383 void set_precomputed_flags(InstanceKlass* k); 384 385 // Format checker methods 386 void classfile_parse_error(const char* msg, TRAPS) const; 387 void classfile_parse_error(const char* msg, int index, TRAPS) const; 388 void classfile_parse_error(const char* msg, const char *name, TRAPS) const; 389 void classfile_parse_error(const char* msg, 390 int index, 391 const char *name, 392 TRAPS) const; 393 void classfile_parse_error(const char* msg, 394 const char* name, 395 const char* signature, 396 TRAPS) const; 397 398 void classfile_icce_error(const char* msg, 399 const Klass* k, 400 TRAPS) const; 401 402 void classfile_ucve_error(const char* msg, 403 const Symbol* class_name, 404 u2 major, 405 u2 minor, 406 TRAPS) const; 407 408 inline void guarantee_property(bool b, const char* msg, TRAPS) const { 409 if (!b) { classfile_parse_error(msg, THREAD); return; } 410 } 411 412 void report_assert_property_failure(const char* msg, TRAPS) const PRODUCT_RETURN; 413 void report_assert_property_failure(const char* msg, int index, TRAPS) const PRODUCT_RETURN; 414 415 inline void assert_property(bool b, const char* msg, TRAPS) const { 416 #ifdef ASSERT 417 if (!b) { 418 report_assert_property_failure(msg, THREAD); 419 } 420 #endif 421 } 422 423 inline void assert_property(bool b, const char* msg, int index, TRAPS) const { 424 #ifdef ASSERT 425 if (!b) { 426 report_assert_property_failure(msg, index, THREAD); 427 } 428 #endif 429 } 430 431 inline void check_property(bool property, 432 const char* msg, 433 int index, 434 TRAPS) const { 435 if (_need_verify) { 436 guarantee_property(property, msg, index, CHECK); 437 } else { 438 assert_property(property, msg, index, CHECK); 439 } 440 } 441 442 inline void check_property(bool property, const char* msg, TRAPS) const { 443 if (_need_verify) { 444 guarantee_property(property, msg, CHECK); 445 } else { 446 assert_property(property, msg, CHECK); 447 } 448 } 449 450 inline void guarantee_property(bool b, 451 const char* msg, 452 int index, 453 TRAPS) const { 454 if (!b) { classfile_parse_error(msg, index, THREAD); return; } 455 } 456 457 inline void guarantee_property(bool b, 458 const char* msg, 459 const char *name, 460 TRAPS) const { 461 if (!b) { classfile_parse_error(msg, name, THREAD); return; } 462 } 463 464 inline void guarantee_property(bool b, 465 const char* msg, 466 int index, 467 const char *name, 468 TRAPS) const { 469 if (!b) { classfile_parse_error(msg, index, name, THREAD); return; } 470 } 471 472 void throwIllegalSignature(const char* type, 473 const Symbol* name, 474 const Symbol* sig, 475 TRAPS) const; 476 477 void throwInlineTypeLimitation(THREAD_AND_LOCATION_DECL, 478 const char* msg, 479 const Symbol* name = nullptr, 480 const Symbol* sig = nullptr) const; 481 482 void verify_constantvalue(const ConstantPool* const cp, 483 int constantvalue_index, 484 int signature_index, 485 TRAPS) const; 486 487 void verify_legal_utf8(const unsigned char* buffer, int length, TRAPS) const; 488 void verify_legal_class_name(const Symbol* name, TRAPS) const; 489 void verify_legal_field_name(const Symbol* name, TRAPS) const; 490 void verify_legal_method_name(const Symbol* name, TRAPS) const; 491 492 void verify_legal_field_signature(const Symbol* fieldname, 493 const Symbol* signature, 494 TRAPS) const; 495 int verify_legal_method_signature(const Symbol* methodname, 496 const Symbol* signature, 497 TRAPS) const; 498 void verify_legal_name_with_signature(const Symbol* name, 499 const Symbol* signature, 500 TRAPS) const; 501 502 void verify_class_version(u2 major, u2 minor, Symbol* class_name, TRAPS); 503 504 void verify_legal_class_modifiers(jint flags, const char* name, bool is_Object, TRAPS) const; 505 void verify_legal_field_modifiers(jint flags, 506 AccessFlags class_access_flags, 507 TRAPS) const; 508 void verify_legal_method_modifiers(jint flags, 509 AccessFlags class_access_flags, 510 const Symbol* name, 511 TRAPS) const; 512 513 void check_super_class_access(const InstanceKlass* this_klass, 514 TRAPS); 515 516 void check_super_interface_access(const InstanceKlass* this_klass, 517 TRAPS); 518 519 const char* skip_over_field_signature(const char* signature, 520 bool void_ok, 521 unsigned int length, 522 TRAPS) const; 523 524 // Wrapper for constantTag.is_klass_[or_]reference. 525 // In older versions of the VM, Klass*s cannot sneak into early phases of 526 // constant pool construction, but in later versions they can. 527 // %%% Let's phase out the old is_klass_reference. 528 bool valid_klass_reference_at(int index) const { 529 return _cp->is_within_bounds(index) && 530 _cp->tag_at(index).is_klass_or_reference(); 531 } 532 533 // Checks that the cpool index is in range and is a utf8 534 bool valid_symbol_at(int cpool_index) const { 535 return _cp->is_within_bounds(cpool_index) && 536 _cp->tag_at(cpool_index).is_utf8(); 537 } 538 539 void copy_localvariable_table(const ConstMethod* cm, 540 int lvt_cnt, 541 u2* const localvariable_table_length, 542 const unsafe_u2** const localvariable_table_start, 543 int lvtt_cnt, 544 u2* const localvariable_type_table_length, 545 const unsafe_u2** const localvariable_type_table_start, 546 TRAPS); 547 548 void copy_method_annotations(ConstMethod* cm, 549 const u1* runtime_visible_annotations, 550 int runtime_visible_annotations_length, 551 const u1* runtime_invisible_annotations, 552 int runtime_invisible_annotations_length, 553 const u1* runtime_visible_parameter_annotations, 554 int runtime_visible_parameter_annotations_length, 555 const u1* runtime_invisible_parameter_annotations, 556 int runtime_invisible_parameter_annotations_length, 557 const u1* runtime_visible_type_annotations, 558 int runtime_visible_type_annotations_length, 559 const u1* runtime_invisible_type_annotations, 560 int runtime_invisible_type_annotations_length, 561 const u1* annotation_default, 562 int annotation_default_length, 563 TRAPS); 564 565 void update_class_name(Symbol* new_name); 566 567 // Check if the class file supports inline types 568 bool supports_inline_types() const; 569 570 public: 571 ClassFileParser(ClassFileStream* stream, 572 Symbol* name, 573 ClassLoaderData* loader_data, 574 const ClassLoadInfo* cl_info, 575 Publicity pub_level, 576 TRAPS); 577 578 ~ClassFileParser(); 579 580 InstanceKlass* create_instance_klass(bool cf_changed_in_CFLH, const ClassInstanceInfo& cl_inst_info, TRAPS); 581 582 const ClassFileStream* clone_stream() const; 583 584 void set_klass_to_deallocate(InstanceKlass* klass); 585 586 int static_field_size() const; 587 int total_oop_map_count() const; 588 jint layout_size() const; 589 590 int vtable_size() const { return _vtable_size; } 591 int itable_size() const { return _itable_size; } 592 593 u2 this_class_index() const { return _this_class_index; } 594 595 bool is_hidden() const { return _is_hidden; } 596 bool is_interface() const { return _access_flags.is_interface(); } 597 bool is_inline_type() const { return _access_flags.is_value_class() && !_access_flags.is_interface() && !_access_flags.is_abstract(); } 598 bool is_value_class() const { return _access_flags.is_value_class(); } 599 bool is_abstract_class() const { return _access_flags.is_abstract(); } 600 bool is_identity_class() const { return _access_flags.is_identity_class(); } 601 bool is_value_capable_class() const; 602 bool has_inline_fields() const { return _has_inline_type_fields; } 603 bool carries_identity_modifier() const { return _carries_identity_modifier; } 604 void set_carries_identity_modifier() { _carries_identity_modifier = true; } 605 bool carries_value_modifier() const { return _carries_value_modifier; } 606 void set_carries_value_modifier() { _carries_value_modifier = true; } 607 608 u2 java_fields_count() const { return _java_fields_count; } 609 610 ClassLoaderData* loader_data() const { return _loader_data; } 611 const Symbol* class_name() const { return _class_name; } 612 const InstanceKlass* super_klass() const { return _super_klass; } 613 614 ReferenceType super_reference_type() const; 615 bool is_instance_ref_klass() const; 616 bool is_java_lang_ref_Reference_subclass() const; 617 618 AccessFlags access_flags() const { return _access_flags; } 619 620 bool is_internal() const { return INTERNAL == _pub_level; } 621 622 static bool verify_unqualified_name(const char* name, unsigned int length, int type); 623 624 #ifdef ASSERT 625 static bool is_internal_format(Symbol* class_name); 626 #endif 627 628 }; 629 630 #endif // SHARE_CLASSFILE_CLASSFILEPARSER_HPP