| 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_CIMETHOD_HPP |
| 26 | #define SHARE_CI_CIMETHOD_HPP |
| 27 | |
| 28 | #include "ci/ciFlags.hpp" |
| 29 | #include "ci/ciInstanceKlass.hpp" |
| 30 | #include "ci/ciObject.hpp" |
| 31 | #include "ci/ciSignature.hpp" |
| 32 | #include "compiler/methodLiveness.hpp" |
| 33 | #include "prims/methodHandles.hpp" |
| 34 | #include "utilities/bitMap.hpp" |
| 35 | |
| 36 | class ciMethodBlocks; |
| 37 | class MethodLiveness; |
| 38 | class Arena; |
| 39 | class BCEscapeAnalyzer; |
| 40 | class InlineTree; |
| 41 | |
| 42 | // Whether profiling found an oop to be always, never or sometimes |
| 43 | // null |
| 44 | enum ProfilePtrKind { |
| 45 | ProfileAlwaysNull, |
| 46 | ProfileNeverNull, |
| 47 | ProfileMaybeNull |
| 48 | }; |
| 49 | |
| 50 | // ciMethod |
| 51 | // |
| 52 | // This class represents a Method* in the HotSpot virtual |
| 53 | // machine. |
| 54 | class ciMethod : public ciMetadata { |
| 55 | friend class CompileBroker; |
| 56 | CI_PACKAGE_ACCESS |
| 57 | friend class ciEnv; |
| 58 | friend class ciExceptionHandlerStream; |
| 59 | friend class ciBytecodeStream; |
| 60 | friend class ciMethodHandle; |
| 61 | friend class ciReplay; |
| 62 | friend class InlineTree; |
| 63 | |
| 64 | private: |
| 65 | // General method information. |
| 66 | ciFlags _flags; |
| 67 | ciSymbol* _name; |
| 68 | ciInstanceKlass* _holder; |
| 69 | ciSignature* _signature; |
| 70 | ciMethodData* _method_data; |
| 71 | ciMethodBlocks* _method_blocks; |
| 72 | |
| 73 | // Code attributes. |
| 74 | int _code_size; |
| 75 | int _max_stack; |
| 76 | int _max_locals; |
| 77 | vmIntrinsics::ID _intrinsic_id; |
| 78 | int _handler_count; |
| 79 | int _nmethod_age; |
| 80 | int _interpreter_invocation_count; |
| 81 | int _interpreter_throwout_count; |
| 82 | int _instructions_size; |
| 83 | int _size_of_parameters; |
| 84 | |
| 85 | bool _uses_monitors; |
| 86 | bool _balanced_monitors; |
| 87 | bool _is_c1_compilable; |
| 88 | bool _is_c2_compilable; |
| 89 | bool _can_be_parsed; |
| 90 | bool _can_be_statically_bound; |
| 91 | bool _has_reserved_stack_access; |
| 92 | bool _is_overpass; |
| 93 | |
| 94 | // Lazy fields, filled in on demand |
| 95 | address _code; |
| 96 | ciExceptionHandler** _exception_handlers; |
| 97 | |
| 98 | // Optional liveness analyzer. |
| 99 | MethodLiveness* _liveness; |
| 100 | #if defined(COMPILER2) |
| 101 | ciTypeFlow* _flow; |
| 102 | BCEscapeAnalyzer* _bcea; |
| 103 | #endif |
| 104 | |
| 105 | ciMethod(const methodHandle& h_m, ciInstanceKlass* holder); |
| 106 | ciMethod(ciInstanceKlass* holder, ciSymbol* name, ciSymbol* signature, ciInstanceKlass* accessor); |
| 107 | |
| 108 | oop loader() const { return _holder->loader(); } |
| 109 | |
| 110 | const char* type_string() { return "ciMethod" ; } |
| 111 | |
| 112 | void print_impl(outputStream* st); |
| 113 | |
| 114 | void load_code(); |
| 115 | |
| 116 | bool ensure_method_data(const methodHandle& h_m); |
| 117 | |
| 118 | void code_at_put(int bci, Bytecodes::Code code) { |
| 119 | Bytecodes::check(code); |
| 120 | assert(0 <= bci && bci < code_size(), "valid bci" ); |
| 121 | address bcp = _code + bci; |
| 122 | *bcp = code; |
| 123 | } |
| 124 | |
| 125 | // Check bytecode and profile data collected are compatible |
| 126 | void assert_virtual_call_type_ok(int bci); |
| 127 | void assert_call_type_ok(int bci); |
| 128 | |
| 129 | // Check and update the profile counter in case of overflow |
| 130 | static int check_overflow(int c, Bytecodes::Code code); |
| 131 | |
| 132 | public: |
| 133 | void check_is_loaded() const { assert(is_loaded(), "not loaded" ); } |
| 134 | |
| 135 | // Basic method information. |
| 136 | ciFlags flags() const { check_is_loaded(); return _flags; } |
| 137 | ciSymbol* name() const { return _name; } |
| 138 | ciInstanceKlass* holder() const { return _holder; } |
| 139 | ciMethodData* method_data(); |
| 140 | ciMethodData* method_data_or_null(); |
| 141 | |
| 142 | // Signature information. |
| 143 | ciSignature* signature() const { return _signature; } |
| 144 | ciType* return_type() const { return _signature->return_type(); } |
| 145 | int arg_size_no_receiver() const { return _signature->size(); } |
| 146 | // Can only be used on loaded ciMethods |
| 147 | int arg_size() const { |
| 148 | check_is_loaded(); |
| 149 | return _signature->size() + (_flags.is_static() ? 0 : 1); |
| 150 | } |
| 151 | // Report the number of elements on stack when invoking the current method. |
| 152 | // If the method is loaded, arg_size() gives precise information about the |
| 153 | // number of stack elements (using the method's signature and its flags). |
| 154 | // However, if the method is not loaded, the number of stack elements must |
| 155 | // be determined differently, as the method's flags are not yet available. |
| 156 | // The invoke_arg_size() method assumes in that case that all bytecodes except |
| 157 | // invokestatic and invokedynamic have a receiver that is also pushed onto the |
| 158 | // stack by the caller of the current method. |
| 159 | int invoke_arg_size(Bytecodes::Code code) const { |
| 160 | if (is_loaded()) { |
| 161 | return arg_size(); |
| 162 | } else { |
| 163 | int arg_size = _signature->size(); |
| 164 | if (code != Bytecodes::_invokestatic && |
| 165 | code != Bytecodes::_invokedynamic) { |
| 166 | arg_size++; |
| 167 | } |
| 168 | return arg_size; |
| 169 | } |
| 170 | } |
| 171 | |
| 172 | Method* get_Method() const { |
| 173 | Method* m = (Method*)_metadata; |
| 174 | assert(m != NULL, "illegal use of unloaded method" ); |
| 175 | return m; |
| 176 | } |
| 177 | |
| 178 | // Method code and related information. |
| 179 | address code() { if (_code == NULL) load_code(); return _code; } |
| 180 | int code_size() const { check_is_loaded(); return _code_size; } |
| 181 | int max_stack() const { check_is_loaded(); return _max_stack; } |
| 182 | int max_locals() const { check_is_loaded(); return _max_locals; } |
| 183 | vmIntrinsics::ID intrinsic_id() const { check_is_loaded(); return _intrinsic_id; } |
| 184 | bool has_exception_handlers() const { check_is_loaded(); return _handler_count > 0; } |
| 185 | int exception_table_length() const { check_is_loaded(); return _handler_count; } |
| 186 | int interpreter_invocation_count() const { check_is_loaded(); return _interpreter_invocation_count; } |
| 187 | int interpreter_throwout_count() const { check_is_loaded(); return _interpreter_throwout_count; } |
| 188 | int size_of_parameters() const { check_is_loaded(); return _size_of_parameters; } |
| 189 | int nmethod_age() const { check_is_loaded(); return _nmethod_age; } |
| 190 | |
| 191 | // Should the method be compiled with an age counter? |
| 192 | bool profile_aging() const; |
| 193 | |
| 194 | // Code size for inlining decisions. |
| 195 | int code_size_for_inlining(); |
| 196 | |
| 197 | bool caller_sensitive() const { return get_Method()->caller_sensitive(); } |
| 198 | bool force_inline() const { return get_Method()->force_inline(); } |
| 199 | bool dont_inline() const { return get_Method()->dont_inline(); } |
| 200 | bool intrinsic_candidate() const { return get_Method()->intrinsic_candidate(); } |
| 201 | bool is_static_initializer() const { return get_Method()->is_static_initializer(); } |
| 202 | |
| 203 | int comp_level(); |
| 204 | int highest_osr_comp_level(); |
| 205 | |
| 206 | Bytecodes::Code java_code_at_bci(int bci) { |
| 207 | address bcp = code() + bci; |
| 208 | return Bytecodes::java_code_at(NULL, bcp); |
| 209 | } |
| 210 | Bytecodes::Code raw_code_at_bci(int bci) { |
| 211 | address bcp = code() + bci; |
| 212 | return Bytecodes::code_at(NULL, bcp); |
| 213 | } |
| 214 | BCEscapeAnalyzer *get_bcea(); |
| 215 | ciMethodBlocks *get_method_blocks(); |
| 216 | |
| 217 | bool has_linenumber_table() const; // length unknown until decompression |
| 218 | u_char* compressed_linenumber_table() const; // not preserved by gc |
| 219 | |
| 220 | int line_number_from_bci(int bci) const; |
| 221 | |
| 222 | // Runtime information. |
| 223 | int vtable_index(); |
| 224 | address native_entry(); |
| 225 | address interpreter_entry(); |
| 226 | |
| 227 | // Analysis and profiling. |
| 228 | // |
| 229 | // Usage note: liveness_at_bci and init_vars should be wrapped in ResourceMarks. |
| 230 | bool has_monitor_bytecodes() const { return _uses_monitors; } |
| 231 | bool has_balanced_monitors(); |
| 232 | |
| 233 | // Returns a bitmap indicating which locals are required to be |
| 234 | // maintained as live for deopt. raw_liveness_at_bci is always the |
| 235 | // direct output of the liveness computation while liveness_at_bci |
| 236 | // may mark all locals as live to improve support for debugging Java |
| 237 | // code by maintaining the state of as many locals as possible. |
| 238 | MethodLivenessResult raw_liveness_at_bci(int bci); |
| 239 | MethodLivenessResult liveness_at_bci(int bci); |
| 240 | |
| 241 | // Get the interpreters viewpoint on oop liveness. MethodLiveness is |
| 242 | // conservative in the sense that it may consider locals to be live which |
| 243 | // cannot be live, like in the case where a local could contain an oop or |
| 244 | // a primitive along different paths. In that case the local must be |
| 245 | // dead when those paths merge. Since the interpreter's viewpoint is |
| 246 | // used when gc'ing an interpreter frame we need to use its viewpoint |
| 247 | // during OSR when loading the locals. |
| 248 | |
| 249 | ResourceBitMap live_local_oops_at_bci(int bci); |
| 250 | |
| 251 | bool needs_clinit_barrier() const; |
| 252 | |
| 253 | #ifdef COMPILER1 |
| 254 | const BitMap& bci_block_start(); |
| 255 | #endif |
| 256 | |
| 257 | ciTypeFlow* get_flow_analysis(); |
| 258 | ciTypeFlow* get_osr_flow_analysis(int osr_bci); // alternate entry point |
| 259 | ciCallProfile call_profile_at_bci(int bci); |
| 260 | int interpreter_call_site_count(int bci); |
| 261 | |
| 262 | // Does type profiling provide any useful information at this point? |
| 263 | bool argument_profiled_type(int bci, int i, ciKlass*& type, ProfilePtrKind& ptr_kind); |
| 264 | bool parameter_profiled_type(int i, ciKlass*& type, ProfilePtrKind& ptr_kind); |
| 265 | bool return_profiled_type(int bci, ciKlass*& type, ProfilePtrKind& ptr_kind); |
| 266 | |
| 267 | ciField* get_field_at_bci( int bci, bool &will_link); |
| 268 | ciMethod* get_method_at_bci(int bci, bool &will_link, ciSignature* *declared_signature); |
| 269 | ciMethod* get_method_at_bci(int bci) { |
| 270 | bool ignored_will_link; |
| 271 | ciSignature* ignored_declared_signature; |
| 272 | return get_method_at_bci(bci, ignored_will_link, &ignored_declared_signature); |
| 273 | } |
| 274 | |
| 275 | ciKlass* get_declared_method_holder_at_bci(int bci); |
| 276 | |
| 277 | ciSignature* get_declared_signature_at_bci(int bci) { |
| 278 | bool ignored_will_link; |
| 279 | ciSignature* declared_signature; |
| 280 | get_method_at_bci(bci, ignored_will_link, &declared_signature); |
| 281 | assert(declared_signature != NULL, "cannot be null" ); |
| 282 | return declared_signature; |
| 283 | } |
| 284 | |
| 285 | // Given a certain calling environment, find the monomorphic target |
| 286 | // for the call. Return NULL if the call is not monomorphic in |
| 287 | // its calling environment. |
| 288 | ciMethod* find_monomorphic_target(ciInstanceKlass* caller, |
| 289 | ciInstanceKlass* callee_holder, |
| 290 | ciInstanceKlass* actual_receiver, |
| 291 | bool check_access = true); |
| 292 | |
| 293 | // Given a known receiver klass, find the target for the call. |
| 294 | // Return NULL if the call has no target or is abstract. |
| 295 | ciMethod* resolve_invoke(ciKlass* caller, ciKlass* exact_receiver, bool check_access = true); |
| 296 | |
| 297 | // Find the proper vtable index to invoke this method. |
| 298 | int resolve_vtable_index(ciKlass* caller, ciKlass* receiver); |
| 299 | |
| 300 | bool has_option(const char *option); |
| 301 | bool has_option_value(const char* option, double& value); |
| 302 | bool can_be_compiled(); |
| 303 | bool can_be_parsed() const { return _can_be_parsed; } |
| 304 | bool can_be_osr_compiled(int entry_bci); |
| 305 | void set_not_compilable(const char* reason = NULL); |
| 306 | bool has_compiled_code(); |
| 307 | void log_nmethod_identity(xmlStream* log); |
| 308 | bool is_not_reached(int bci); |
| 309 | bool was_executed_more_than(int times); |
| 310 | bool has_unloaded_classes_in_signature(); |
| 311 | bool is_klass_loaded(int refinfo_index, bool must_be_resolved) const; |
| 312 | bool check_call(int refinfo_index, bool is_static) const; |
| 313 | bool ensure_method_data(); // make sure it exists in the VM also |
| 314 | MethodCounters* ensure_method_counters(); |
| 315 | int instructions_size(); |
| 316 | int scale_count(int count, float prof_factor = 1.); // make MDO count commensurate with IIC |
| 317 | |
| 318 | // Stack walking support |
| 319 | bool is_ignored_by_security_stack_walk() const; |
| 320 | |
| 321 | // JSR 292 support |
| 322 | bool is_method_handle_intrinsic() const; |
| 323 | bool is_compiled_lambda_form() const; |
| 324 | bool has_member_arg() const; |
| 325 | |
| 326 | // What kind of ciObject is this? |
| 327 | bool is_method() const { return true; } |
| 328 | |
| 329 | // Java access flags |
| 330 | bool is_public () const { return flags().is_public(); } |
| 331 | bool is_private () const { return flags().is_private(); } |
| 332 | bool is_protected () const { return flags().is_protected(); } |
| 333 | bool is_static () const { return flags().is_static(); } |
| 334 | bool is_final () const { return flags().is_final(); } |
| 335 | bool is_synchronized() const { return flags().is_synchronized(); } |
| 336 | bool is_native () const { return flags().is_native(); } |
| 337 | bool is_interface () const { return flags().is_interface(); } |
| 338 | bool is_abstract () const { return flags().is_abstract(); } |
| 339 | bool is_strict () const { return flags().is_strict(); } |
| 340 | |
| 341 | // Other flags |
| 342 | bool is_empty_method() const; |
| 343 | bool is_vanilla_constructor() const; |
| 344 | bool is_final_method() const { return is_final() || holder()->is_final(); } |
| 345 | bool is_default_method() const { return !is_abstract() && !is_private() && |
| 346 | holder()->is_interface(); } |
| 347 | bool is_overpass () const { check_is_loaded(); return _is_overpass; } |
| 348 | bool has_loops () const; |
| 349 | bool has_jsrs () const; |
| 350 | bool is_getter () const; |
| 351 | bool is_setter () const; |
| 352 | bool is_accessor () const; |
| 353 | bool is_initializer () const; |
| 354 | bool can_be_statically_bound() const { return _can_be_statically_bound; } |
| 355 | bool has_reserved_stack_access() const { return _has_reserved_stack_access; } |
| 356 | bool is_boxing_method() const; |
| 357 | bool is_unboxing_method() const; |
| 358 | bool is_object_initializer() const; |
| 359 | |
| 360 | bool can_be_statically_bound(ciInstanceKlass* context) const; |
| 361 | |
| 362 | // Replay data methods |
| 363 | void dump_name_as_ascii(outputStream* st); |
| 364 | void dump_replay_data(outputStream* st); |
| 365 | |
| 366 | // Print the bytecodes of this method. |
| 367 | void print_codes_on(outputStream* st); |
| 368 | void print_codes() { |
| 369 | print_codes_on(tty); |
| 370 | } |
| 371 | void print_codes_on(int from, int to, outputStream* st); |
| 372 | |
| 373 | // Print the name of this method in various incarnations. |
| 374 | void print_name(outputStream* st = tty); |
| 375 | void print_short_name(outputStream* st = tty); |
| 376 | |
| 377 | static bool is_consistent_info(ciMethod* declared_method, ciMethod* resolved_method); |
| 378 | }; |
| 379 | |
| 380 | #endif // SHARE_CI_CIMETHOD_HPP |
| 381 | |