hotspot/src/share/vm/ci/ciMethod.hpp
author iveresov
Thu, 02 Dec 2010 17:21:12 -0800
changeset 7432 f06f1253c317
parent 7397 5b173b4ca846
child 7913 dd096a83bdbb
permissions -rw-r--r--
7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer Summary: C1 with profiling doesn't check whether the MDO has been really allocated, which can silently fail if the perm gen is full. The solution is to check if the allocation failed and bailout out of inlining or compilation. Reviewed-by: kvn, never
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4581
diff changeset
     2
 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4581
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4581
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4581
diff changeset
    21
 * questions.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    22
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    23
 */
489c9b5090e2 Initial load
duke
parents:
diff changeset
    24
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    25
#ifndef SHARE_VM_CI_CIMETHOD_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    26
#define SHARE_VM_CI_CIMETHOD_HPP
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    27
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    28
#include "ci/ciFlags.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    29
#include "ci/ciInstanceKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    30
#include "ci/ciObject.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    31
#include "ci/ciSignature.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    32
#include "compiler/methodLiveness.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    33
#include "prims/methodHandles.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    34
#include "utilities/bitMap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
    35
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    36
class ciMethodBlocks;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    37
class MethodLiveness;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    38
class BitMap;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    39
class Arena;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    40
class BCEscapeAnalyzer;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
// ciMethod
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
// This class represents a methodOop in the HotSpot virtual
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
// machine.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
class ciMethod : public ciObject {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    48
  friend class CompileBroker;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    49
  CI_PACKAGE_ACCESS
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
  friend class ciEnv;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
  friend class ciExceptionHandlerStream;
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
    52
  friend class ciBytecodeStream;
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
    53
  friend class ciMethodHandle;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    54
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
  // General method information.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  ciFlags          _flags;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  ciSymbol*        _name;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  ciInstanceKlass* _holder;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  ciSignature*     _signature;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  ciMethodData*    _method_data;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  ciMethodBlocks*   _method_blocks;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  // Code attributes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  int _code_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  int _max_stack;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  int _max_locals;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  vmIntrinsics::ID _intrinsic_id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  int _handler_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  int _interpreter_invocation_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  int _interpreter_throwout_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  bool _uses_monitors;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  bool _balanced_monitors;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
    75
  bool _is_c1_compilable;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
    76
  bool _is_c2_compilable;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  bool _can_be_statically_bound;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  // Lazy fields, filled in on demand
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  address              _code;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  ciExceptionHandler** _exception_handlers;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  // Optional liveness analyzer.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  MethodLiveness* _liveness;
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 5928
diff changeset
    85
#if defined(COMPILER2) || defined(SHARK)
5928
f6e69b46e9e3 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 5547
diff changeset
    86
  ciTypeFlow*         _flow;
f6e69b46e9e3 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 5547
diff changeset
    87
  BCEscapeAnalyzer*   _bcea;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  ciMethod(methodHandle h_m);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  ciMethod(ciInstanceKlass* holder, ciSymbol* name, ciSymbol* signature);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  methodOop get_methodOop() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
    methodOop m = (methodOop)get_oop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
    assert(m != NULL, "illegal use of unloaded method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
    return m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  oop loader() const                             { return _holder->loader(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  const char* type_string()                      { return "ciMethod"; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  void print_impl(outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  void load_code();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  void check_is_loaded() const                   { assert(is_loaded(), "not loaded"); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   109
  bool ensure_method_data(methodHandle h_m);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  void code_at_put(int bci, Bytecodes::Code code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
    Bytecodes::check(code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
    assert(0 <= bci && bci < code_size(), "valid bci");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
    address bcp = _code + bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
    *bcp = code;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
  // Basic method information.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  ciFlags flags() const                          { check_is_loaded(); return _flags; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  ciSymbol* name() const                         { return _name; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  ciInstanceKlass* holder() const                { return _holder; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  ciMethodData* method_data();
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   124
  ciMethodData* method_data_or_null();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  // Signature information.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  ciSignature* signature() const                 { return _signature; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  ciType*      return_type() const               { return _signature->return_type(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  int          arg_size_no_receiver() const      { return _signature->size(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  int          arg_size() const                  { return _signature->size() + (_flags.is_static() ? 0 : 1); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  // Method code and related information.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  address code()                                 { if (_code == NULL) load_code(); return _code; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
  int code_size() const                          { check_is_loaded(); return _code_size; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
  int max_stack() const                          { check_is_loaded(); return _max_stack; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  int max_locals() const                         { check_is_loaded(); return _max_locals; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  vmIntrinsics::ID intrinsic_id() const          { check_is_loaded(); return _intrinsic_id; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  bool has_exception_handlers() const            { check_is_loaded(); return _handler_count > 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  int exception_table_length() const             { check_is_loaded(); return _handler_count; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  int interpreter_invocation_count() const       { check_is_loaded(); return _interpreter_invocation_count; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  int interpreter_throwout_count() const         { check_is_loaded(); return _interpreter_throwout_count; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
   143
  int comp_level();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
   144
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  Bytecodes::Code java_code_at_bci(int bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
    address bcp = code() + bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
    return Bytecodes::java_code_at(bcp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
  BCEscapeAnalyzer  *get_bcea();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  ciMethodBlocks    *get_method_blocks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  bool    has_linenumber_table() const;          // length unknown until decompression
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  u_char* compressed_linenumber_table() const;   // not preserved by gc
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  int line_number_from_bci(int bci) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  // Runtime information.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  int           vtable_index();
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 5928
diff changeset
   159
#ifdef SHARK
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 5928
diff changeset
   160
  int           itable_index();
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 5928
diff changeset
   161
#endif // SHARK
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  address       native_entry();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  address       interpreter_entry();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
  // Analysis and profiling.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  // Usage note: liveness_at_bci and init_vars should be wrapped in ResourceMarks.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
  bool          uses_monitors() const            { return _uses_monitors; } // this one should go away, it has a misleading name
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  bool          has_monitor_bytecodes() const    { return _uses_monitors; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
  bool          has_balanced_monitors();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
3910
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2534
diff changeset
   172
  // Returns a bitmap indicating which locals are required to be
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2534
diff changeset
   173
  // maintained as live for deopt.  raw_liveness_at_bci is always the
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2534
diff changeset
   174
  // direct output of the liveness computation while liveness_at_bci
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2534
diff changeset
   175
  // may mark all locals as live to improve support for debugging Java
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2534
diff changeset
   176
  // code by maintaining the state of as many locals as possible.
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2534
diff changeset
   177
  MethodLivenessResult raw_liveness_at_bci(int bci);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  MethodLivenessResult liveness_at_bci(int bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  // Get the interpreters viewpoint on oop liveness.  MethodLiveness is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  // conservative in the sense that it may consider locals to be live which
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  // cannot be live, like in the case where a local could contain an oop or
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  // a primitive along different paths.  In that case the local must be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  // dead when those paths merge. Since the interpreter's viewpoint is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  // used when gc'ing an interpreter frame we need to use its viewpoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
  // during OSR when loading the locals.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  BitMap  live_local_oops_at_bci(int bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
#ifdef COMPILER1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  const BitMap  bci_block_start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  ciTypeFlow*   get_flow_analysis();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  ciTypeFlow*   get_osr_flow_analysis(int osr_bci);  // alternate entry point
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  ciCallProfile call_profile_at_bci(int bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  int           interpreter_call_site_count(int bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  // Given a certain calling environment, find the monomorphic target
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  // for the call.  Return NULL if the call is not monomorphic in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
  // its calling environment.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
  ciMethod* find_monomorphic_target(ciInstanceKlass* caller,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
                                    ciInstanceKlass* callee_holder,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
                                    ciInstanceKlass* actual_receiver);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
  // Given a known receiver klass, find the target for the call.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  // Return NULL if the call has no target or is abstract.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  ciMethod* resolve_invoke(ciKlass* caller, ciKlass* exact_receiver);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  // Find the proper vtable index to invoke this method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  int resolve_vtable_index(ciKlass* caller, ciKlass* receiver);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  // Compilation directives
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  bool will_link(ciKlass* accessing_klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
                 ciKlass* declared_method_holder,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
                 Bytecodes::Code bc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  bool should_exclude();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  bool should_inline();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
  bool should_not_inline();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  bool should_print_assembly();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  bool break_at_execute();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  bool has_option(const char *option);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
  bool can_be_compiled();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  bool can_be_osr_compiled(int entry_bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  void set_not_compilable();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  bool has_compiled_code();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
   227
  int  instructions_size(int comp_level = CompLevel_any);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  void log_nmethod_identity(xmlStream* log);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  bool is_not_reached(int bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  bool was_executed_more_than(int times);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  bool has_unloaded_classes_in_signature();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  bool is_klass_loaded(int refinfo_index, bool must_be_resolved) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  bool check_call(int refinfo_index, bool is_static) const;
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   234
  bool ensure_method_data();  // make sure it exists in the VM also
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  int scale_count(int count, float prof_factor = 1.);  // make MDO count commensurate with IIC
4581
e89fbd1bcb3d 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 4567
diff changeset
   236
e89fbd1bcb3d 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 4567
diff changeset
   237
  // JSR 292 support
e89fbd1bcb3d 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 4567
diff changeset
   238
  bool is_method_handle_invoke()  const;
e89fbd1bcb3d 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 4567
diff changeset
   239
  bool is_method_handle_adapter() const;
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 1
diff changeset
   240
  ciInstance* method_handle_type();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  // What kind of ciObject is this?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  bool is_method()                               { return true; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  // Java access flags
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  bool is_public      () const                   { return flags().is_public(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  bool is_private     () const                   { return flags().is_private(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  bool is_protected   () const                   { return flags().is_protected(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  bool is_static      () const                   { return flags().is_static(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  bool is_final       () const                   { return flags().is_final(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  bool is_synchronized() const                   { return flags().is_synchronized(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  bool is_native      () const                   { return flags().is_native(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  bool is_interface   () const                   { return flags().is_interface(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  bool is_abstract    () const                   { return flags().is_abstract(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  bool is_strict      () const                   { return flags().is_strict(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  // Other flags
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  bool is_empty_method() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  bool is_vanilla_constructor() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  bool is_final_method() const                   { return is_final() || holder()->is_final(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  bool has_loops      () const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  bool has_jsrs       () const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  bool is_accessor    () const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  bool is_initializer () const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  bool can_be_statically_bound() const           { return _can_be_statically_bound; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  // Print the bytecodes of this method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  void print_codes_on(outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
  void print_codes() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
    print_codes_on(tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  void print_codes_on(int from, int to, outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  // Print the name of this method in various incarnations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  void print_name(outputStream* st = tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  void print_short_name(outputStream* st = tty);
4567
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   277
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   278
  methodOop get_method_handle_target() {
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   279
    klassOop receiver_limit_oop = NULL;
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   280
    int flags = 0;
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   281
    return MethodHandles::decode_method(get_oop(), receiver_limit_oop, flags);
7fc02fbe5c7a 6893268: additional dynamic language related optimizations in C2
twisti
parents: 4566
diff changeset
   282
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
   284
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
   285
#endif // SHARE_VM_CI_CIMETHOD_HPP