hotspot/src/share/vm/ci/ciMethod.hpp
author coleenp
Mon, 14 Jan 2013 11:01:39 -0500
changeset 15194 a35093d73168
parent 14621 fd9265ab0f67
child 15479 e3c00ec80145
permissions -rw-r--r--
8006005: Fix constant pool index validation and alignment trap for method parameter reflection Summary: This patch addresses an alignment trap due to the storage format of method parameters data in constMethod. It also adds code to validate constant pool indexes for method parameters data. Reviewed-by: jrose, dholmes Contributed-by: eric.mccorkle@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
     2
 * Copyright (c) 1999, 2012, 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
//
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
    45
// This class represents a Method* in the HotSpot virtual
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
// machine.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
    47
class ciMethod : public ciMetadata {
1
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;
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
    54
  friend class ciReplay;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
 private:
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
  // General method information.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    58
  ciFlags          _flags;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  ciSymbol*        _name;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
  ciInstanceKlass* _holder;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
  ciSignature*     _signature;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
  ciMethodData*    _method_data;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
  ciMethodBlocks*   _method_blocks;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  // Code attributes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  int _code_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  int _max_stack;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  int _max_locals;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  vmIntrinsics::ID _intrinsic_id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
  int _handler_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
  int _interpreter_invocation_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  int _interpreter_throwout_count;
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
    73
  int _instructions_size;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  bool _uses_monitors;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  bool _balanced_monitors;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
    77
  bool _is_c1_compilable;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
    78
  bool _is_c2_compilable;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  bool _can_be_statically_bound;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  // Lazy fields, filled in on demand
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  address              _code;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  ciExceptionHandler** _exception_handlers;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
  // Optional liveness analyzer.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
  MethodLiveness* _liveness;
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 5928
diff changeset
    87
#if defined(COMPILER2) || defined(SHARK)
5928
f6e69b46e9e3 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 5547
diff changeset
    88
  ciTypeFlow*         _flow;
f6e69b46e9e3 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 5547
diff changeset
    89
  BCEscapeAnalyzer*   _bcea;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
  ciMethod(methodHandle h_m);
10734
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10506
diff changeset
    93
  ciMethod(ciInstanceKlass* holder, ciSymbol* name, ciSymbol* signature, ciInstanceKlass* accessor);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
    95
  Method* get_Method() const {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
    96
    Method* m = (Method*)_metadata;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
    assert(m != NULL, "illegal use of unloaded method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
    return m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
  oop loader() const                             { return _holder->loader(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
  const char* type_string()                      { return "ciMethod"; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  void print_impl(outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  void load_code();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  void check_is_loaded() const                   { assert(is_loaded(), "not loaded"); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   111
  bool ensure_method_data(methodHandle h_m);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
  void code_at_put(int bci, Bytecodes::Code code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
    Bytecodes::check(code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
    assert(0 <= bci && bci < code_size(), "valid bci");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
    address bcp = _code + bci;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
    *bcp = code;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
 public:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
  // Basic method information.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  ciFlags flags() const                          { check_is_loaded(); return _flags; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  ciSymbol* name() const                         { return _name; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  ciInstanceKlass* holder() const                { return _holder; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  ciMethodData* method_data();
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   126
  ciMethodData* method_data_or_null();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  // Signature information.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  ciSignature* signature() const                 { return _signature; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  ciType*      return_type() const               { return _signature->return_type(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  int          arg_size_no_receiver() const      { return _signature->size(); }
9329
79c74b9e2afe 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 9323
diff changeset
   132
  // Can only be used on loaded ciMethods
79c74b9e2afe 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 9323
diff changeset
   133
  int          arg_size() const                  {
79c74b9e2afe 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 9323
diff changeset
   134
    check_is_loaded();
79c74b9e2afe 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 9323
diff changeset
   135
    return _signature->size() + (_flags.is_static() ? 0 : 1);
79c74b9e2afe 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 9323
diff changeset
   136
  }
79c74b9e2afe 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 9323
diff changeset
   137
  // Report the number of elements on stack when invoking this method.
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13291
diff changeset
   138
  // This is different than the regular arg_size because invokedynamic
9329
79c74b9e2afe 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 9323
diff changeset
   139
  // has an implicit receiver.
79c74b9e2afe 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 9323
diff changeset
   140
  int invoke_arg_size(Bytecodes::Code code) const {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13291
diff changeset
   141
    if (is_loaded()) {
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13291
diff changeset
   142
      return arg_size();
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13291
diff changeset
   143
    } else {
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13291
diff changeset
   144
      int arg_size = _signature->size();
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13291
diff changeset
   145
      // Add a receiver argument, maybe:
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13291
diff changeset
   146
      if (code != Bytecodes::_invokestatic &&
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13291
diff changeset
   147
          code != Bytecodes::_invokedynamic) {
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13291
diff changeset
   148
        arg_size++;
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13291
diff changeset
   149
      }
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13291
diff changeset
   150
      return arg_size;
9329
79c74b9e2afe 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 9323
diff changeset
   151
    }
79c74b9e2afe 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 9323
diff changeset
   152
  }
79c74b9e2afe 7030715: JSR 292 JRuby test/test_super_call_site_caching.rb asserts with +DoEscapeAnalysis
never
parents: 9323
diff changeset
   153
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  // Method code and related information.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  address code()                                 { if (_code == NULL) load_code(); return _code; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  int code_size() const                          { check_is_loaded(); return _code_size; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  int max_stack() const                          { check_is_loaded(); return _max_stack; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  int max_locals() const                         { check_is_loaded(); return _max_locals; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  vmIntrinsics::ID intrinsic_id() const          { check_is_loaded(); return _intrinsic_id; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  bool has_exception_handlers() const            { check_is_loaded(); return _handler_count > 0; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  int exception_table_length() const             { check_is_loaded(); return _handler_count; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
  int interpreter_invocation_count() const       { check_is_loaded(); return _interpreter_invocation_count; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  int interpreter_throwout_count() const         { check_is_loaded(); return _interpreter_throwout_count; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
10506
575ad9bccff5 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 10014
diff changeset
   166
  // Code size for inlining decisions.
575ad9bccff5 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 10014
diff changeset
   167
  int code_size_for_inlining();
575ad9bccff5 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 10014
diff changeset
   168
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   169
  bool force_inline() { return get_Method()->force_inline(); }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   170
  bool dont_inline()  { return get_Method()->dont_inline();  }
13291
9de3b1387cb8 6711908: JVM needs direct access to some annotations
jrose
parents: 11193
diff changeset
   171
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
   172
  int comp_level();
10014
a5c2141ee857 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 9329
diff changeset
   173
  int highest_osr_comp_level();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6187
diff changeset
   174
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  Bytecodes::Code java_code_at_bci(int bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
    address bcp = code() + bci;
7913
dd096a83bdbb 4926272: methodOopDesc::method_from_bcp is unsafe
never
parents: 7432
diff changeset
   177
    return Bytecodes::java_code_at(NULL, bcp);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  BCEscapeAnalyzer  *get_bcea();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  ciMethodBlocks    *get_method_blocks();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  bool    has_linenumber_table() const;          // length unknown until decompression
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  u_char* compressed_linenumber_table() const;   // not preserved by gc
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  int line_number_from_bci(int bci) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  // Runtime information.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  int           vtable_index();
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 5928
diff changeset
   189
#ifdef SHARK
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 5928
diff changeset
   190
  int           itable_index();
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 5928
diff changeset
   191
#endif // SHARK
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  address       native_entry();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  address       interpreter_entry();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  // Analysis and profiling.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  // Usage note: liveness_at_bci and init_vars should be wrapped in ResourceMarks.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  bool          uses_monitors() const            { return _uses_monitors; } // this one should go away, it has a misleading name
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  bool          has_monitor_bytecodes() const    { return _uses_monitors; }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  bool          has_balanced_monitors();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
3910
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2534
diff changeset
   202
  // 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
   203
  // 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
   204
  // 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
   205
  // 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
   206
  // 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
   207
  MethodLivenessResult raw_liveness_at_bci(int bci);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
  MethodLivenessResult liveness_at_bci(int bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  // Get the interpreters viewpoint on oop liveness.  MethodLiveness is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  // conservative in the sense that it may consider locals to be live which
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  // cannot be live, like in the case where a local could contain an oop or
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  // a primitive along different paths.  In that case the local must be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  // dead when those paths merge. Since the interpreter's viewpoint is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  // used when gc'ing an interpreter frame we need to use its viewpoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  // during OSR when loading the locals.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
  BitMap  live_local_oops_at_bci(int bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
#ifdef COMPILER1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
  const BitMap  bci_block_start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
  ciTypeFlow*   get_flow_analysis();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  ciTypeFlow*   get_osr_flow_analysis(int osr_bci);  // alternate entry point
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  ciCallProfile call_profile_at_bci(int bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
  int           interpreter_call_site_count(int bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
14621
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 14478
diff changeset
   229
  ciField*      get_field_at_bci( int bci, bool &will_link);
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 14478
diff changeset
   230
  ciMethod*     get_method_at_bci(int bci, bool &will_link, ciSignature* *declared_signature);
fd9265ab0f67 7172640: C2: instrinsic implementations in LibraryCallKit should use argument() instead of pop()
twisti
parents: 14478
diff changeset
   231
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  // Given a certain calling environment, find the monomorphic target
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  // for the call.  Return NULL if the call is not monomorphic in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
  // its calling environment.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  ciMethod* find_monomorphic_target(ciInstanceKlass* caller,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
                                    ciInstanceKlass* callee_holder,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
                                    ciInstanceKlass* actual_receiver);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
  // Given a known receiver klass, find the target for the call.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  // Return NULL if the call has no target or is abstract.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  ciMethod* resolve_invoke(ciKlass* caller, ciKlass* exact_receiver);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  // Find the proper vtable index to invoke this method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  int resolve_vtable_index(ciKlass* caller, ciKlass* receiver);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  // Compilation directives
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  bool should_exclude();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  bool should_inline();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  bool should_not_inline();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  bool should_print_assembly();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  bool break_at_execute();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  bool has_option(const char *option);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  bool can_be_compiled();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  bool can_be_osr_compiled(int entry_bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  void set_not_compilable();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  bool has_compiled_code();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  void log_nmethod_identity(xmlStream* log);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  bool is_not_reached(int bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  bool was_executed_more_than(int times);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  bool has_unloaded_classes_in_signature();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  bool is_klass_loaded(int refinfo_index, bool must_be_resolved) const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  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
   263
  bool ensure_method_data();  // make sure it exists in the VM also
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   264
  int instructions_size();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  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
   266
e89fbd1bcb3d 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 4567
diff changeset
   267
  // JSR 292 support
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13291
diff changeset
   268
  bool is_method_handle_intrinsic()  const;
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13291
diff changeset
   269
  bool is_compiled_lambda_form() const;
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13291
diff changeset
   270
  bool has_member_arg() const;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
  // What kind of ciObject is this?
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13391
diff changeset
   273
  bool is_method() const                         { return true; }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  // Java access flags
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
  bool is_public      () const                   { return flags().is_public(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
  bool is_private     () const                   { return flags().is_private(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  bool is_protected   () const                   { return flags().is_protected(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
  bool is_static      () const                   { return flags().is_static(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  bool is_final       () const                   { return flags().is_final(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  bool is_synchronized() const                   { return flags().is_synchronized(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  bool is_native      () const                   { return flags().is_native(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  bool is_interface   () const                   { return flags().is_interface(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  bool is_abstract    () const                   { return flags().is_abstract(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  bool is_strict      () const                   { return flags().is_strict(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  // Other flags
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  bool is_empty_method() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  bool is_vanilla_constructor() const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  bool is_final_method() const                   { return is_final() || holder()->is_final(); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  bool has_loops      () const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  bool has_jsrs       () const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  bool is_accessor    () const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  bool is_initializer () const;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  bool can_be_statically_bound() const           { return _can_be_statically_bound; }
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 13728
diff changeset
   296
  void dump_replay_data(outputStream* st);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  // Print the bytecodes of this method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  void print_codes_on(outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  void print_codes() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
    print_codes_on(tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  void print_codes_on(int from, int to, outputStream* st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  // Print the name of this method in various incarnations.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
  void print_name(outputStream* st = tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
  void print_short_name(outputStream* st = tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
};
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
   309
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6453
diff changeset
   310
#endif // SHARE_VM_CI_CIMETHOD_HPP