| 1 | /* |
| 2 | * Copyright (c) 1999, 2019, 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_CI_CIENV_HPP |
| 26 | #define SHARE_CI_CIENV_HPP |
| 27 | |
| 28 | #include "ci/ciClassList.hpp" |
| 29 | #include "ci/ciObjectFactory.hpp" |
| 30 | #include "classfile/systemDictionary.hpp" |
| 31 | #include "code/debugInfoRec.hpp" |
| 32 | #include "code/dependencies.hpp" |
| 33 | #include "code/exceptionHandlerTable.hpp" |
| 34 | #include "compiler/oopMap.hpp" |
| 35 | #include "oops/methodData.hpp" |
| 36 | #include "runtime/thread.hpp" |
| 37 | |
| 38 | class CompileTask; |
| 39 | |
| 40 | // ciEnv |
| 41 | // |
| 42 | // This class is the top level broker for requests from the compiler |
| 43 | // to the VM. |
| 44 | class ciEnv : StackObj { |
| 45 | CI_PACKAGE_ACCESS_TO |
| 46 | |
| 47 | friend class CompileBroker; |
| 48 | friend class Dependencies; // for get_object, during logging |
| 49 | friend class PrepareExtraDataClosure; |
| 50 | |
| 51 | private: |
| 52 | Arena* _arena; // Alias for _ciEnv_arena except in init_shared_objects() |
| 53 | Arena _ciEnv_arena; |
| 54 | int _system_dictionary_modification_counter; |
| 55 | ciObjectFactory* _factory; |
| 56 | OopRecorder* _oop_recorder; |
| 57 | DebugInformationRecorder* _debug_info; |
| 58 | Dependencies* _dependencies; |
| 59 | const char* _failure_reason; |
| 60 | bool _inc_decompile_count_on_failure; |
| 61 | int _compilable; |
| 62 | bool _break_at_compile; |
| 63 | int _num_inlined_bytecodes; |
| 64 | CompileTask* _task; // faster access to CompilerThread::task |
| 65 | CompileLog* _log; // faster access to CompilerThread::log |
| 66 | void* _compiler_data; // compiler-specific stuff, if any |
| 67 | |
| 68 | char* _name_buffer; |
| 69 | int _name_buffer_len; |
| 70 | |
| 71 | // Cache Jvmti state |
| 72 | bool _jvmti_can_hotswap_or_post_breakpoint; |
| 73 | bool _jvmti_can_access_local_variables; |
| 74 | bool _jvmti_can_post_on_exceptions; |
| 75 | bool _jvmti_can_pop_frame; |
| 76 | |
| 77 | // Cache DTrace flags |
| 78 | bool _dtrace_extended_probes; |
| 79 | bool _dtrace_monitor_probes; |
| 80 | bool _dtrace_method_probes; |
| 81 | bool _dtrace_alloc_probes; |
| 82 | |
| 83 | // Distinguished instances of certain ciObjects.. |
| 84 | static ciObject* _null_object_instance; |
| 85 | |
| 86 | #define WK_KLASS_DECL(name, ignore_s) static ciInstanceKlass* _##name; |
| 87 | WK_KLASSES_DO(WK_KLASS_DECL) |
| 88 | #undef WK_KLASS_DECL |
| 89 | |
| 90 | static ciSymbol* _unloaded_cisymbol; |
| 91 | static ciInstanceKlass* _unloaded_ciinstance_klass; |
| 92 | static ciObjArrayKlass* _unloaded_ciobjarrayklass; |
| 93 | |
| 94 | static jobject _ArrayIndexOutOfBoundsException_handle; |
| 95 | static jobject _ArrayStoreException_handle; |
| 96 | static jobject _ClassCastException_handle; |
| 97 | |
| 98 | ciInstance* _NullPointerException_instance; |
| 99 | ciInstance* _ArithmeticException_instance; |
| 100 | ciInstance* _ArrayIndexOutOfBoundsException_instance; |
| 101 | ciInstance* _ArrayStoreException_instance; |
| 102 | ciInstance* _ClassCastException_instance; |
| 103 | |
| 104 | ciInstance* _the_null_string; // The Java string "null" |
| 105 | ciInstance* _the_min_jint_string; // The Java string "-2147483648" |
| 106 | |
| 107 | // Look up a klass by name from a particular class loader (the accessor's). |
| 108 | // If require_local, result must be defined in that class loader, or NULL. |
| 109 | // If !require_local, a result from remote class loader may be reported, |
| 110 | // if sufficient class loader constraints exist such that initiating |
| 111 | // a class loading request from the given loader is bound to return |
| 112 | // the class defined in the remote loader (or throw an error). |
| 113 | // |
| 114 | // Return an unloaded klass if !require_local and no class at all is found. |
| 115 | // |
| 116 | // The CI treats a klass as loaded if it is consistently defined in |
| 117 | // another loader, even if it hasn't yet been loaded in all loaders |
| 118 | // that could potentially see it via delegation. |
| 119 | ciKlass* get_klass_by_name(ciKlass* accessing_klass, |
| 120 | ciSymbol* klass_name, |
| 121 | bool require_local); |
| 122 | |
| 123 | // Constant pool access. |
| 124 | ciKlass* get_klass_by_index(const constantPoolHandle& cpool, |
| 125 | int klass_index, |
| 126 | bool& is_accessible, |
| 127 | ciInstanceKlass* loading_klass); |
| 128 | ciConstant get_constant_by_index(const constantPoolHandle& cpool, |
| 129 | int pool_index, int cache_index, |
| 130 | ciInstanceKlass* accessor); |
| 131 | ciField* get_field_by_index(ciInstanceKlass* loading_klass, |
| 132 | int field_index); |
| 133 | ciMethod* get_method_by_index(const constantPoolHandle& cpool, |
| 134 | int method_index, Bytecodes::Code bc, |
| 135 | ciInstanceKlass* loading_klass); |
| 136 | |
| 137 | // Implementation methods for loading and constant pool access. |
| 138 | ciKlass* get_klass_by_name_impl(ciKlass* accessing_klass, |
| 139 | const constantPoolHandle& cpool, |
| 140 | ciSymbol* klass_name, |
| 141 | bool require_local); |
| 142 | ciKlass* get_klass_by_index_impl(const constantPoolHandle& cpool, |
| 143 | int klass_index, |
| 144 | bool& is_accessible, |
| 145 | ciInstanceKlass* loading_klass); |
| 146 | ciConstant get_constant_by_index_impl(const constantPoolHandle& cpool, |
| 147 | int pool_index, int cache_index, |
| 148 | ciInstanceKlass* loading_klass); |
| 149 | ciField* get_field_by_index_impl(ciInstanceKlass* loading_klass, |
| 150 | int field_index); |
| 151 | ciMethod* get_method_by_index_impl(const constantPoolHandle& cpool, |
| 152 | int method_index, Bytecodes::Code bc, |
| 153 | ciInstanceKlass* loading_klass); |
| 154 | |
| 155 | // Helper methods |
| 156 | bool check_klass_accessibility(ciKlass* accessing_klass, |
| 157 | Klass* resolved_klass); |
| 158 | Method* lookup_method(ciInstanceKlass* accessor, |
| 159 | ciKlass* holder, |
| 160 | Symbol* name, |
| 161 | Symbol* sig, |
| 162 | Bytecodes::Code bc, |
| 163 | constantTag tag); |
| 164 | |
| 165 | // Get a ciObject from the object factory. Ensures uniqueness |
| 166 | // of ciObjects. |
| 167 | ciObject* get_object(oop o) { |
| 168 | if (o == NULL) { |
| 169 | return _null_object_instance; |
| 170 | } else { |
| 171 | return _factory->get(o); |
| 172 | } |
| 173 | } |
| 174 | |
| 175 | ciSymbol* get_symbol(Symbol* o) { |
| 176 | if (o == NULL) { |
| 177 | ShouldNotReachHere(); |
| 178 | return NULL; |
| 179 | } else { |
| 180 | return _factory->get_symbol(o); |
| 181 | } |
| 182 | } |
| 183 | |
| 184 | ciMetadata* get_metadata(Metadata* o) { |
| 185 | if (o == NULL) { |
| 186 | return NULL; |
| 187 | } else { |
| 188 | return _factory->get_metadata(o); |
| 189 | } |
| 190 | } |
| 191 | |
| 192 | ciMetadata* cached_metadata(Metadata* o) { |
| 193 | return _factory->cached_metadata(o); |
| 194 | } |
| 195 | |
| 196 | ciInstance* get_instance(oop o) { |
| 197 | if (o == NULL) return NULL; |
| 198 | return get_object(o)->as_instance(); |
| 199 | } |
| 200 | ciObjArrayKlass* get_obj_array_klass(Klass* o) { |
| 201 | if (o == NULL) return NULL; |
| 202 | return get_metadata(o)->as_obj_array_klass(); |
| 203 | } |
| 204 | ciTypeArrayKlass* get_type_array_klass(Klass* o) { |
| 205 | if (o == NULL) return NULL; |
| 206 | return get_metadata(o)->as_type_array_klass(); |
| 207 | } |
| 208 | ciKlass* get_klass(Klass* o) { |
| 209 | if (o == NULL) return NULL; |
| 210 | return get_metadata(o)->as_klass(); |
| 211 | } |
| 212 | ciInstanceKlass* get_instance_klass(Klass* o) { |
| 213 | if (o == NULL) return NULL; |
| 214 | return get_metadata(o)->as_instance_klass(); |
| 215 | } |
| 216 | ciMethod* get_method(Method* o) { |
| 217 | if (o == NULL) return NULL; |
| 218 | return get_metadata(o)->as_method(); |
| 219 | } |
| 220 | ciMethodData* get_method_data(MethodData* o) { |
| 221 | if (o == NULL) return NULL; |
| 222 | return get_metadata(o)->as_method_data(); |
| 223 | } |
| 224 | |
| 225 | ciMethod* get_method_from_handle(Method* method); |
| 226 | |
| 227 | ciInstance* get_or_create_exception(jobject& handle, Symbol* name); |
| 228 | |
| 229 | // Get a ciMethod representing either an unfound method or |
| 230 | // a method with an unloaded holder. Ensures uniqueness of |
| 231 | // the result. |
| 232 | ciMethod* get_unloaded_method(ciKlass* holder, |
| 233 | ciSymbol* name, |
| 234 | ciSymbol* signature, |
| 235 | ciInstanceKlass* accessor) { |
| 236 | ciInstanceKlass* declared_holder = get_instance_klass_for_declared_method_holder(holder); |
| 237 | return _factory->get_unloaded_method(declared_holder, name, signature, accessor); |
| 238 | } |
| 239 | |
| 240 | // Get a ciKlass representing an unloaded klass. |
| 241 | // Ensures uniqueness of the result. |
| 242 | ciKlass* get_unloaded_klass(ciKlass* accessing_klass, |
| 243 | ciSymbol* name) { |
| 244 | return _factory->get_unloaded_klass(accessing_klass, name, true); |
| 245 | } |
| 246 | |
| 247 | // Get a ciKlass representing an unloaded klass mirror. |
| 248 | // Result is not necessarily unique, but will be unloaded. |
| 249 | ciInstance* get_unloaded_klass_mirror(ciKlass* type) { |
| 250 | return _factory->get_unloaded_klass_mirror(type); |
| 251 | } |
| 252 | |
| 253 | // Get a ciInstance representing an unresolved method handle constant. |
| 254 | ciInstance* get_unloaded_method_handle_constant(ciKlass* holder, |
| 255 | ciSymbol* name, |
| 256 | ciSymbol* signature, |
| 257 | int ref_kind) { |
| 258 | return _factory->get_unloaded_method_handle_constant(holder, name, signature, ref_kind); |
| 259 | } |
| 260 | |
| 261 | // Get a ciInstance representing an unresolved method type constant. |
| 262 | ciInstance* get_unloaded_method_type_constant(ciSymbol* signature) { |
| 263 | return _factory->get_unloaded_method_type_constant(signature); |
| 264 | } |
| 265 | |
| 266 | // See if we already have an unloaded klass for the given name |
| 267 | // or return NULL if not. |
| 268 | ciKlass *check_get_unloaded_klass(ciKlass* accessing_klass, ciSymbol* name) { |
| 269 | return _factory->get_unloaded_klass(accessing_klass, name, false); |
| 270 | } |
| 271 | |
| 272 | // Get a ciReturnAddress corresponding to the given bci. |
| 273 | // Ensures uniqueness of the result. |
| 274 | ciReturnAddress* get_return_address(int bci) { |
| 275 | return _factory->get_return_address(bci); |
| 276 | } |
| 277 | |
| 278 | // Get a ciMethodData representing the methodData for a method |
| 279 | // with none. |
| 280 | ciMethodData* get_empty_methodData() { |
| 281 | return _factory->get_empty_methodData(); |
| 282 | } |
| 283 | |
| 284 | // General utility : get a buffer of some required length. |
| 285 | // Used in symbol creation. |
| 286 | char* name_buffer(int req_len); |
| 287 | |
| 288 | // Is this thread currently in the VM state? |
| 289 | static bool is_in_vm(); |
| 290 | |
| 291 | // Helper routine for determining the validity of a compilation with |
| 292 | // respect to method dependencies (e.g. concurrent class loading). |
| 293 | void validate_compile_task_dependencies(ciMethod* target); |
| 294 | |
| 295 | // Call internally when Compile_lock is already held. |
| 296 | bool system_dictionary_modification_counter_changed_locked(); |
| 297 | public: |
| 298 | enum { |
| 299 | MethodCompilable, |
| 300 | MethodCompilable_not_at_tier, |
| 301 | MethodCompilable_never |
| 302 | }; |
| 303 | |
| 304 | ciEnv(CompileTask* task, int system_dictionary_modification_counter); |
| 305 | // Used only during initialization of the ci |
| 306 | ciEnv(Arena* arena); |
| 307 | ~ciEnv(); |
| 308 | |
| 309 | OopRecorder* oop_recorder() { return _oop_recorder; } |
| 310 | void set_oop_recorder(OopRecorder* r) { _oop_recorder = r; } |
| 311 | |
| 312 | DebugInformationRecorder* debug_info() { return _debug_info; } |
| 313 | void set_debug_info(DebugInformationRecorder* i) { _debug_info = i; } |
| 314 | |
| 315 | Dependencies* dependencies() { return _dependencies; } |
| 316 | void set_dependencies(Dependencies* d) { _dependencies = d; } |
| 317 | |
| 318 | // This is true if the compilation is not going to produce code. |
| 319 | // (It is reasonable to retry failed compilations.) |
| 320 | bool failing() { return _failure_reason != NULL; } |
| 321 | |
| 322 | // Reason this compilation is failing, such as "too many basic blocks". |
| 323 | const char* failure_reason() { return _failure_reason; } |
| 324 | |
| 325 | // Return state of appropriate compilability |
| 326 | int compilable() { return _compilable; } |
| 327 | |
| 328 | const char* retry_message() const { |
| 329 | switch (_compilable) { |
| 330 | case ciEnv::MethodCompilable_not_at_tier: |
| 331 | return "retry at different tier" ; |
| 332 | case ciEnv::MethodCompilable_never: |
| 333 | return "not retryable" ; |
| 334 | case ciEnv::MethodCompilable: |
| 335 | return NULL; |
| 336 | default: |
| 337 | ShouldNotReachHere(); |
| 338 | return NULL; |
| 339 | } |
| 340 | } |
| 341 | |
| 342 | bool break_at_compile() { return _break_at_compile; } |
| 343 | void set_break_at_compile(bool z) { _break_at_compile = z; } |
| 344 | |
| 345 | // Cache Jvmti state |
| 346 | void cache_jvmti_state(); |
| 347 | bool jvmti_state_changed() const; |
| 348 | bool should_retain_local_variables() const { |
| 349 | return _jvmti_can_access_local_variables || _jvmti_can_pop_frame; |
| 350 | } |
| 351 | bool jvmti_can_hotswap_or_post_breakpoint() const { return _jvmti_can_hotswap_or_post_breakpoint; } |
| 352 | bool jvmti_can_post_on_exceptions() const { return _jvmti_can_post_on_exceptions; } |
| 353 | |
| 354 | // Cache DTrace flags |
| 355 | void cache_dtrace_flags(); |
| 356 | bool dtrace_extended_probes() const { return _dtrace_extended_probes; } |
| 357 | bool dtrace_monitor_probes() const { return _dtrace_monitor_probes; } |
| 358 | bool dtrace_method_probes() const { return _dtrace_method_probes; } |
| 359 | bool dtrace_alloc_probes() const { return _dtrace_alloc_probes; } |
| 360 | |
| 361 | // The compiler task which has created this env. |
| 362 | // May be useful to find out compile_id, comp_level, etc. |
| 363 | CompileTask* task() { return _task; } |
| 364 | |
| 365 | // Handy forwards to the task: |
| 366 | int comp_level(); // task()->comp_level() |
| 367 | uint compile_id(); // task()->compile_id() |
| 368 | |
| 369 | // Register the result of a compilation. |
| 370 | void register_method(ciMethod* target, |
| 371 | int entry_bci, |
| 372 | CodeOffsets* offsets, |
| 373 | int orig_pc_offset, |
| 374 | CodeBuffer* code_buffer, |
| 375 | int frame_words, |
| 376 | OopMapSet* oop_map_set, |
| 377 | ExceptionHandlerTable* handler_table, |
| 378 | ImplicitExceptionTable* inc_table, |
| 379 | AbstractCompiler* compiler, |
| 380 | bool has_unsafe_access, |
| 381 | bool has_wide_vectors, |
| 382 | RTMState rtm_state = NoRTM); |
| 383 | |
| 384 | |
| 385 | // Access to certain well known ciObjects. |
| 386 | #define WK_KLASS_FUNC(name, ignore_s) \ |
| 387 | ciInstanceKlass* name() { \ |
| 388 | return _##name;\ |
| 389 | } |
| 390 | WK_KLASSES_DO(WK_KLASS_FUNC) |
| 391 | #undef WK_KLASS_FUNC |
| 392 | |
| 393 | ciInstance* NullPointerException_instance() { |
| 394 | assert(_NullPointerException_instance != NULL, "initialization problem" ); |
| 395 | return _NullPointerException_instance; |
| 396 | } |
| 397 | ciInstance* ArithmeticException_instance() { |
| 398 | assert(_ArithmeticException_instance != NULL, "initialization problem" ); |
| 399 | return _ArithmeticException_instance; |
| 400 | } |
| 401 | |
| 402 | // Lazy constructors: |
| 403 | ciInstance* ArrayIndexOutOfBoundsException_instance(); |
| 404 | ciInstance* ArrayStoreException_instance(); |
| 405 | ciInstance* ClassCastException_instance(); |
| 406 | |
| 407 | ciInstance* the_null_string(); |
| 408 | ciInstance* the_min_jint_string(); |
| 409 | |
| 410 | static ciSymbol* unloaded_cisymbol() { |
| 411 | return _unloaded_cisymbol; |
| 412 | } |
| 413 | static ciObjArrayKlass* unloaded_ciobjarrayklass() { |
| 414 | return _unloaded_ciobjarrayklass; |
| 415 | } |
| 416 | static ciInstanceKlass* unloaded_ciinstance_klass() { |
| 417 | return _unloaded_ciinstance_klass; |
| 418 | } |
| 419 | ciInstance* unloaded_ciinstance(); |
| 420 | |
| 421 | ciKlass* find_system_klass(ciSymbol* klass_name); |
| 422 | // Note: To find a class from its name string, use ciSymbol::make, |
| 423 | // but consider adding to vmSymbols.hpp instead. |
| 424 | |
| 425 | // converts the ciKlass* representing the holder of a method into a |
| 426 | // ciInstanceKlass*. This is needed since the holder of a method in |
| 427 | // the bytecodes could be an array type. Basically this converts |
| 428 | // array types into java/lang/Object and other types stay as they are. |
| 429 | static ciInstanceKlass* get_instance_klass_for_declared_method_holder(ciKlass* klass); |
| 430 | |
| 431 | // Return the machine-level offset of o, which must be an element of a. |
| 432 | // This may be used to form constant-loading expressions in lieu of simpler encodings. |
| 433 | int array_element_offset_in_bytes(ciArray* a, ciObject* o); |
| 434 | |
| 435 | // Access to the compile-lifetime allocation arena. |
| 436 | Arena* arena() { return _arena; } |
| 437 | |
| 438 | // What is the current compilation environment? |
| 439 | static ciEnv* current() { return CompilerThread::current()->env(); } |
| 440 | |
| 441 | // Overload with current thread argument |
| 442 | static ciEnv* current(CompilerThread *thread) { return thread->env(); } |
| 443 | |
| 444 | // Per-compiler data. (Used by C2 to publish the Compile* pointer.) |
| 445 | void* compiler_data() { return _compiler_data; } |
| 446 | void set_compiler_data(void* x) { _compiler_data = x; } |
| 447 | |
| 448 | // Notice that a method has been inlined in the current compile; |
| 449 | // used only for statistics. |
| 450 | void notice_inlined_method(ciMethod* method); |
| 451 | |
| 452 | // Total number of bytecodes in inlined methods in this compile |
| 453 | int num_inlined_bytecodes() const; |
| 454 | |
| 455 | // Output stream for logging compilation info. |
| 456 | CompileLog* log() { return _log; } |
| 457 | void set_log(CompileLog* log) { _log = log; } |
| 458 | |
| 459 | // Check for changes to the system dictionary during compilation |
| 460 | bool system_dictionary_modification_counter_changed(); |
| 461 | |
| 462 | void record_failure(const char* reason); // Record failure and report later |
| 463 | void report_failure(const char* reason); // Report failure immediately |
| 464 | void record_method_not_compilable(const char* reason, bool all_tiers = true); |
| 465 | void record_out_of_memory_failure(); |
| 466 | |
| 467 | // RedefineClasses support |
| 468 | void metadata_do(MetadataClosure* f) { _factory->metadata_do(f); } |
| 469 | |
| 470 | // Dump the compilation replay data for the ciEnv to the stream. |
| 471 | void dump_replay_data(int compile_id); |
| 472 | void dump_inline_data(int compile_id); |
| 473 | void dump_replay_data(outputStream* out); |
| 474 | void dump_replay_data_unsafe(outputStream* out); |
| 475 | void dump_compile_data(outputStream* out); |
| 476 | }; |
| 477 | |
| 478 | #endif // SHARE_CI_CIENV_HPP |
| 479 | |