hotspot/src/share/vm/ci/ciMethod.cpp
author minqi
Mon, 12 Nov 2012 14:03:53 -0800
changeset 14477 95e66ea71f71
parent 14391 df0a1573d5bd
child 14478 1c4a20806af7
permissions -rw-r--r--
6830717: replay of compilations would help with debugging Summary: When java process crashed in compiler thread, repeat the compilation process will help finding root cause. This is done with using SA dump application class data and replay data from core dump, then use debug version of jvm to recompile the problematic java method. Reviewed-by: kvn, twisti, sspitsyn Contributed-by: yumin.qi@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
13282
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 10734
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: 4892
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4892
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: 4892
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: 6754
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    26
#include "ci/ciCallProfile.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    27
#include "ci/ciExceptionHandler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    28
#include "ci/ciInstanceKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    29
#include "ci/ciMethod.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    30
#include "ci/ciMethodBlocks.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    31
#include "ci/ciMethodData.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    32
#include "ci/ciStreams.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    33
#include "ci/ciSymbol.hpp"
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
    34
#include "ci/ciReplay.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    35
#include "ci/ciUtilities.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    36
#include "classfile/systemDictionary.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    37
#include "compiler/abstractCompiler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    38
#include "compiler/compilerOracle.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    39
#include "compiler/methodLiveness.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    40
#include "interpreter/interpreter.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    41
#include "interpreter/linkResolver.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    42
#include "interpreter/oopMapCache.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    43
#include "memory/allocation.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    44
#include "memory/resourceArea.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    45
#include "oops/generateOopMap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    46
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    47
#include "prims/nativeLookup.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    48
#include "runtime/deoptimization.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    49
#include "utilities/bitMap.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    50
#include "utilities/xmlstream.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    51
#ifdef COMPILER2
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    52
#include "ci/bcEscapeAnalyzer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    53
#include "ci/ciTypeFlow.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
    54
#include "oops/method.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    55
#endif
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    56
#ifdef SHARK
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    57
#include "ci/ciTypeFlow.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
    58
#include "oops/method.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    59
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
// ciMethod
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
//
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
    63
// This class represents a Method* in the HotSpot virtual
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
// machine.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
// ciMethod::ciMethod
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
// Loaded method.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
    71
ciMethod::ciMethod(methodHandle h_m) : ciMetadata(h_m()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
  assert(h_m() != NULL, "no null method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  // These fields are always filled in in loaded methods.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  _flags = ciFlags(h_m()->access_flags());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
  // Easy to compute, so fill them in now.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  _max_stack          = h_m()->max_stack();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
  _max_locals         = h_m()->max_locals();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  _code_size          = h_m()->code_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
  _intrinsic_id       = h_m()->intrinsic_id();
13282
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 10734
diff changeset
    82
  _handler_count      = h_m()->exception_table_length();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  _uses_monitors      = h_m()->access_flags().has_monitor_bytecodes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
  _balanced_monitors  = !_uses_monitors || h_m()->access_flags().is_monitor_matching();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
    85
  _is_c1_compilable   = !h_m()->is_not_c1_compilable();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
    86
  _is_c2_compilable   = !h_m()->is_not_c2_compilable();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
  // Lazy fields, filled in on demand.  Require allocation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  _code               = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  _exception_handlers = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  _liveness           = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  _method_blocks = NULL;
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
    92
#if defined(COMPILER2) || defined(SHARK)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
  _flow               = NULL;
5928
f6e69b46e9e3 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 5702
diff changeset
    94
  _bcea               = NULL;
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
    95
#endif // COMPILER2 || SHARK
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
2867
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 2534
diff changeset
    97
  ciEnv *env = CURRENT_ENV;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
    98
  if (env->jvmti_can_hotswap_or_post_breakpoint() && can_be_compiled()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
    // 6328518 check hotswap conditions under the right lock.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
    MutexLocker locker(Compile_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
    if (Dependencies::check_evol_method(h_m()) != NULL) {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   102
      _is_c1_compilable = false;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   103
      _is_c2_compilable = false;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
    CHECK_UNHANDLED_OOPS_ONLY(Thread::current()->clear_unhandled_oops());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13728
diff changeset
   109
  if (h_m()->method_holder()->is_linked()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
    _can_be_statically_bound = h_m()->can_be_statically_bound();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
    // Have to use a conservative value in this case.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
    _can_be_statically_bound = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  // Adjust the definition of this condition to be more useful:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  // %%% take these conditions into account in vtable generation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
  if (!_can_be_statically_bound && h_m()->is_private())
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
    _can_be_statically_bound = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
  if (_can_be_statically_bound && h_m()->is_abstract())
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
    _can_be_statically_bound = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
  // generating _signature may allow GC and therefore move m.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
  // These fields are always filled in.
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7432
diff changeset
   125
  _name = env->get_symbol(h_m()->name());
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   126
  _holder = env->get_instance_klass(h_m()->method_holder());
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7432
diff changeset
   127
  ciSymbol* sig_symbol = env->get_symbol(h_m()->signature());
10008
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 8676
diff changeset
   128
  constantPoolHandle cpool = h_m()->constants();
d84de97ad847 7056328: JSR 292 invocation sometimes fails in adapters for types not on boot class path
jrose
parents: 8676
diff changeset
   129
  _signature = new (env->arena()) ciSignature(_holder, cpool, sig_symbol);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  _method_data = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  // Take a snapshot of these values, so they will be commensurate with the MDO.
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   132
  if (ProfileInterpreter || TieredCompilation) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
    int invcnt = h_m()->interpreter_invocation_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
    // if the value overflowed report it as max int
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
    _interpreter_invocation_count = invcnt < 0 ? max_jint : invcnt ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
    _interpreter_throwout_count   = h_m()->interpreter_throwout_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
    _interpreter_invocation_count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
    _interpreter_throwout_count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  if (_interpreter_invocation_count == 0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
    _interpreter_invocation_count = 1;
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   143
  _instructions_size = -1;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   144
#ifdef ASSERT
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   145
  if (ReplayCompiles) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   146
    ciReplay::initialize(this);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   147
  }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   148
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
// ciMethod::ciMethod
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
// Unloaded method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
ciMethod::ciMethod(ciInstanceKlass* holder,
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
   157
                   ciSymbol*        name,
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10506
diff changeset
   158
                   ciSymbol*        signature,
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10506
diff changeset
   159
                   ciInstanceKlass* accessor) :
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   160
  ciMetadata((Metadata*)NULL),
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
   161
  _name(                   name),
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10506
diff changeset
   162
  _holder(                 holder),
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10506
diff changeset
   163
  _intrinsic_id(           vmIntrinsics::_none),
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10506
diff changeset
   164
  _liveness(               NULL),
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10506
diff changeset
   165
  _can_be_statically_bound(false),
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10506
diff changeset
   166
  _method_blocks(          NULL),
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10506
diff changeset
   167
  _method_data(            NULL)
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   168
#if defined(COMPILER2) || defined(SHARK)
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
   169
  ,
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10506
diff changeset
   170
  _flow(                   NULL),
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   171
  _bcea(                   NULL),
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
   172
  _instructions_size(-1)
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   173
#endif // COMPILER2 || SHARK
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
   174
{
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10506
diff changeset
   175
  // Usually holder and accessor are the same type but in some cases
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10506
diff changeset
   176
  // the holder has the wrong class loader (e.g. invokedynamic call
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10506
diff changeset
   177
  // sites) so we pass the accessor.
065435337883 7092712: JSR 292: unloaded invokedynamic call sites can lead to a crash with signature types not on BCP
twisti
parents: 10506
diff changeset
   178
  _signature = new (CURRENT_ENV->arena()) ciSignature(accessor, constantPoolHandle(), signature);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
// ciMethod::load_code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
// Load the bytecodes and exception handler table for this method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
void ciMethod::load_code() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  assert(is_loaded(), "only loaded methods have code");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   190
  Method* me = get_Method();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  Arena* arena = CURRENT_THREAD_ENV->arena();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  // Load the bytecodes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  _code = (address)arena->Amalloc(code_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
  memcpy(_code, me->code_base(), code_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  // Revert any breakpoint bytecodes in ci's copy
200
88d83617f912 6498878: client compiler crashes on windows when dealing with breakpoint instructions
kvn
parents: 1
diff changeset
   198
  if (me->number_of_breakpoints() > 0) {
14391
df0a1573d5bd 8000725: NPG: method_holder() and pool_holder() and pool_holder field should be InstanceKlass
coleenp
parents: 13728
diff changeset
   199
    BreakpointInfo* bp = me->method_holder()->breakpoints();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
    for (; bp != NULL; bp = bp->next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
      if (bp->match(me)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
        code_at_put(bp->bci(), bp->orig_bytecode());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
  // And load the exception table.
13282
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 10734
diff changeset
   208
  ExceptionTable exc_table(me);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
  // Allocate one extra spot in our list of exceptions.  This
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
  // last entry will be used to represent the possibility that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
  // an exception escapes the method.  See ciExceptionHandlerStream
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  // for details.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
  _exception_handlers =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
    (ciExceptionHandler**)arena->Amalloc(sizeof(ciExceptionHandler*)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
                                         * (_handler_count + 1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  if (_handler_count > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
    for (int i=0; i<_handler_count; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
      _exception_handlers[i] = new (arena) ciExceptionHandler(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
                                holder(),
13282
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 10734
diff changeset
   221
            /* start    */      exc_table.start_pc(i),
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 10734
diff changeset
   222
            /* limit    */      exc_table.end_pc(i),
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 10734
diff changeset
   223
            /* goto pc  */      exc_table.handler_pc(i),
9872915dd78d 7178145: Change constMethodOop::_exception_table to optionally inlined u2 table.
jiangli
parents: 10734
diff changeset
   224
            /* cp index */      exc_table.catch_type_index(i));
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
  // Put an entry at the end of our list to represent the possibility
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
  // of exceptional exit.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
  _exception_handlers[_handler_count] =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
    new (arena) ciExceptionHandler(holder(), 0, code_size(), -1, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  if (CIPrintMethodCodes) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
    print_codes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
// ciMethod::has_linenumber_table
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
// length unknown until decompression
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
bool    ciMethod::has_linenumber_table() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   246
  return get_Method()->has_linenumber_table();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
// ciMethod::compressed_linenumber_table
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
u_char* ciMethod::compressed_linenumber_table() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   255
  return get_Method()->compressed_linenumber_table();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
// ciMethod::line_number_from_bci
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
int ciMethod::line_number_from_bci(int bci) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   264
  return get_Method()->line_number_from_bci(bci);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
// ciMethod::vtable_index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
// Get the position of this method's entry in the vtable, if any.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   272
int ciMethod::vtable_index() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   273
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
  assert(holder()->is_linked(), "must be linked");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   276
  return get_Method()->vtable_index();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   280
#ifdef SHARK
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   281
// ------------------------------------------------------------------
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   282
// ciMethod::itable_index
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   283
//
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   284
// Get the position of this method's entry in the itable, if any.
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   285
int ciMethod::itable_index() {
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   286
  check_is_loaded();
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   287
  assert(holder()->is_linked(), "must be linked");
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   288
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   289
  return klassItable::compute_itable_index(get_Method());
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   290
}
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   291
#endif // SHARK
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   292
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   293
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
// ciMethod::native_entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
// Get the address of this method's native code, if any.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
address ciMethod::native_entry() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  assert(flags().is_native(), "must be native method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   302
  Method* method = get_Method();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  address entry = method->native_function();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  assert(entry != NULL, "must be valid entry point");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
  return entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
// ciMethod::interpreter_entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
// Get the entry point for running this method in the interpreter.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
address ciMethod::interpreter_entry() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   316
  methodHandle mh(THREAD, get_Method());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  return Interpreter::entry_for_method(mh);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
// ciMethod::uses_balanced_monitors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
// Does this method use monitors in a strict stack-disciplined manner?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
bool ciMethod::has_balanced_monitors() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
  if (_balanced_monitors) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
  // Analyze the method to see if monitors are used properly.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   331
  methodHandle method(THREAD, get_Method());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  assert(method->has_monitor_bytecodes(), "should have checked this");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
  // Check to see if a previous compilation computed the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
  // monitor-matching analysis.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
  if (method->guaranteed_monitor_matching()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
    _balanced_monitors = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
    EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
    ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
    GeneratePairingInfo gpi(method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
    gpi.compute_map(CATCH);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
    if (!gpi.monitor_safe()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
    method->set_guaranteed_monitor_matching();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
    _balanced_monitors = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
489c9b5090e2 Initial load
duke
parents:
diff changeset
   356
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
// ciMethod::get_flow_analysis
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
ciTypeFlow* ciMethod::get_flow_analysis() {
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   359
#if defined(COMPILER2) || defined(SHARK)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
  if (_flow == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
    ciEnv* env = CURRENT_ENV;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
    _flow = new (env->arena()) ciTypeFlow(env, this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
    _flow->do_flow();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  return _flow;
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   366
#else // COMPILER2 || SHARK
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  return NULL;
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   369
#endif // COMPILER2 || SHARK
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   370
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
489c9b5090e2 Initial load
duke
parents:
diff changeset
   373
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
// ciMethod::get_osr_flow_analysis
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
ciTypeFlow* ciMethod::get_osr_flow_analysis(int osr_bci) {
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   376
#if defined(COMPILER2) || defined(SHARK)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   377
  // OSR entry points are always place after a call bytecode of some sort
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
  assert(osr_bci >= 0, "must supply valid OSR entry point");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
  ciEnv* env = CURRENT_ENV;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   380
  ciTypeFlow* flow = new (env->arena()) ciTypeFlow(env, this, osr_bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  flow->do_flow();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  return flow;
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   383
#else // COMPILER2 || SHARK
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
  return NULL;
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   386
#endif // COMPILER2 || SHARK
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
489c9b5090e2 Initial load
duke
parents:
diff changeset
   389
// ------------------------------------------------------------------
3910
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   390
// ciMethod::raw_liveness_at_bci
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   391
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   392
// Which local variables are live at a specific bci?
3910
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   393
MethodLivenessResult ciMethod::raw_liveness_at_bci(int bci) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   394
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   395
  if (_liveness == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   396
    // Create the liveness analyzer.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   397
    Arena* arena = CURRENT_ENV->arena();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   398
    _liveness = new (arena) MethodLiveness(arena, this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   399
    _liveness->compute_liveness();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
  }
3910
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   401
  return _liveness->get_liveness_at(bci);
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   402
}
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   403
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   404
// ------------------------------------------------------------------
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   405
// ciMethod::liveness_at_bci
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   406
//
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   407
// Which local variables are live at a specific bci?  When debugging
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   408
// will return true for all locals in some cases to improve debug
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   409
// information.
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   410
MethodLivenessResult ciMethod::liveness_at_bci(int bci) {
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   411
  MethodLivenessResult result = raw_liveness_at_bci(bci);
2867
69187054225f 6788527: Server vm intermittently fails with assertion "live value must not be garbage" with fastdebug bits
kvn
parents: 2534
diff changeset
   412
  if (CURRENT_ENV->jvmti_can_access_local_variables() || DeoptimizeALot || CompileTheWorld) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
    // Keep all locals live for the user's edification and amusement.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
    result.at_put_range(0, result.size(), true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
// ciMethod::live_local_oops_at_bci
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
// find all the live oops in the locals array for a particular bci
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
// Compute what the interpreter believes by using the interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
// oopmap generator. This is used as a double check during osr to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
// guard against conservative result from MethodLiveness making us
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
// think a dead oop is live.  MethodLiveness is conservative in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
// sense that it may consider locals to be live which cannot be live,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
// like in the case where a local could contain an oop or  a primitive
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
// along different paths.  In that case the local must be dead when
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
// those paths merge. Since the interpreter's viewpoint is used when
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
// gc'ing an interpreter frame we need to use its viewpoint  during
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
// OSR when loading the locals.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
BitMap ciMethod::live_local_oops_at_bci(int bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  InterpreterOopMap mask;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   436
  OopMapCache::compute_one_oop_map(get_Method(), bci, &mask);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
  int mask_size = max_locals();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
  BitMap result(mask_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
  result.clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
  int i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  for (i = 0; i < mask_size ; i++ ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
    if (mask.is_oop(i)) result.set_bit(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
#ifdef COMPILER1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
// ciMethod::bci_block_start
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
// Marks all bcis where a new basic block starts
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
const BitMap ciMethod::bci_block_start() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  if (_liveness == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
    // Create the liveness analyzer.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
    Arena* arena = CURRENT_ENV->arena();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
    _liveness = new (arena) MethodLiveness(arena, this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
    _liveness->compute_liveness();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
  return _liveness->get_bci_block_start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
#endif // COMPILER1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
// ciMethod::call_profile_at_bci
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
// Get the ciCallProfile for the invocation of this method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
// Also reports receiver types for non-call type checks (if TypeProfileCasts).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
ciCallProfile ciMethod::call_profile_at_bci(int bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
  ciCallProfile result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   475
  if (method_data() != NULL && method_data()->is_mature()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
    ciProfileData* data = method_data()->bci_to_data(bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
    if (data != NULL && data->is_CounterData()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
      // Every profiled call site has a counter.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
      int count = data->as_CounterData()->count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
      if (!data->is_ReceiverTypeData()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
        result._receiver_count[0] = 0;  // that's a definite zero
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
      } else { // ReceiverTypeData is a subclass of CounterData
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
        ciReceiverTypeData* call = (ciReceiverTypeData*)data->as_ReceiverTypeData();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
        // In addition, virtual call sites have receiver type information
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
        int receivers_count_total = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
        int morphism = 0;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   488
        // Precompute morphism for the possible fixup
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
        for (uint i = 0; i < call->row_limit(); i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
          ciKlass* receiver = call->receiver(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
          if (receiver == NULL)  continue;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   492
          morphism++;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   493
        }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   494
        int epsilon = 0;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   495
        if (TieredCompilation && ProfileInterpreter) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   496
          // Interpreter and C1 treat final and special invokes differently.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   497
          // C1 will record a type, whereas the interpreter will just
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   498
          // increment the count. Detect this case.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   499
          if (morphism == 1 && count > 0) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   500
            epsilon = count;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   501
            count = 0;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   502
          }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   503
        }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   504
        for (uint i = 0; i < call->row_limit(); i++) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   505
          ciKlass* receiver = call->receiver(i);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   506
          if (receiver == NULL)  continue;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   507
          int rcount = call->receiver_count(i) + epsilon;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
          if (rcount == 0) rcount = 1; // Should be valid value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
          receivers_count_total += rcount;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
          // Add the receiver to result data.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
          result.add_receiver(receiver, rcount);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
          // If we extend profiling to record methods,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
          // we will set result._method also.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
        // Determine call site's morphism.
4754
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   516
        // The call site count is 0 with known morphism (onlt 1 or 2 receivers)
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   517
        // or < 0 in the case of a type check failured for checkcast, aastore, instanceof.
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   518
        // The call site count is > 0 in the case of a polymorphic virtual call.
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   519
        if (morphism > 0 && morphism == result._limit) {
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   520
           // The morphism <= MorphismLimit.
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   521
           if ((morphism <  ciCallProfile::MorphismLimit) ||
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   522
               (morphism == ciCallProfile::MorphismLimit && count == 0)) {
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   523
#ifdef ASSERT
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   524
             if (count > 0) {
4892
e977b527544a 6923002: assert(false,"this call site should not be polymorphic")
kvn
parents: 4754
diff changeset
   525
               this->print_short_name(tty);
e977b527544a 6923002: assert(false,"this call site should not be polymorphic")
kvn
parents: 4754
diff changeset
   526
               tty->print_cr(" @ bci:%d", bci);
4754
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   527
               this->print_codes();
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   528
               assert(false, "this call site should not be polymorphic");
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   529
             }
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   530
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
             result._morphism = morphism;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
           }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
        // Make the count consistent if this is a call profile. If count is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
        // zero or less, presume that this is a typecheck profile and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
        // do nothing.  Otherwise, increase count to be the sum of all
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
        // receiver's counts.
4754
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   538
        if (count >= 0) {
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   539
          count += receivers_count_total;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
      result._count = count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
// Add new receiver and sort data by receiver's profile count.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
void ciCallProfile::add_receiver(ciKlass* receiver, int receiver_count) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  // Add new receiver and sort data by receiver's counts when we have space
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  // for it otherwise replace the less called receiver (less called receiver
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  // is placed to the last array element which is not used).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
  // First array's element contains most called receiver.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
  int i = _limit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
  for (; i > 0 && receiver_count > _receiver_count[i-1]; i--) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
    _receiver[i] = _receiver[i-1];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
    _receiver_count[i] = _receiver_count[i-1];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
  _receiver[i] = receiver;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
  _receiver_count[i] = receiver_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
  if (_limit < MorphismLimit) _limit++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
// ciMethod::find_monomorphic_target
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
// Given a certain calling environment, find the monomorphic target
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
// for the call.  Return NULL if the call is not monomorphic in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
// its calling environment, or if there are only abstract methods.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
// The returned method is never abstract.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
// Note: If caller uses a non-null result, it must inform dependencies
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
// via assert_unique_concrete_method or assert_leaf_type.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
ciMethod* ciMethod::find_monomorphic_target(ciInstanceKlass* caller,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
                                            ciInstanceKlass* callee_holder,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
                                            ciInstanceKlass* actual_recv) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
  if (actual_recv->is_interface()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
    // %%% We cannot trust interface types, yet.  See bug 6312651.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
  ciMethod* root_m = resolve_invoke(caller, actual_recv);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
  if (root_m == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
    // Something went wrong looking up the actual receiver method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
  assert(!root_m->is_abstract(), "resolve_invoke promise");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
  // Make certain quick checks even if UseCHA is false.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
  // Is it private or final?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
  if (root_m->can_be_statically_bound()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
    return root_m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
  if (actual_recv->is_leaf_type() && actual_recv == root_m->holder()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
    // Easy case.  There is no other place to put a method, so don't bother
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
    // to go through the VM_ENTRY_MARK and all the rest.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
    return root_m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
  // Array methods (clone, hashCode, etc.) are always statically bound.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
  // If we were to see an array type here, we'd return root_m.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
  // However, this method processes only ciInstanceKlasses.  (See 4962591.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
  // The inline_native_clone intrinsic narrows Object to T[] properly,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
  // so there is no need to do the same job here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
  if (!UseCHA)  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
  methodHandle target;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
    MutexLocker locker(Compile_lock);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   617
    Klass* context = actual_recv->get_Klass();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
    target = Dependencies::find_unique_concrete_method(context,
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   619
                                                       root_m->get_Method());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
    // %%% Should upgrade this ciMethod API to look for 1 or 2 concrete methods.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
#ifndef PRODUCT
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   624
  if (TraceDependencies && target() != NULL && target() != root_m->get_Method()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
    tty->print("found a non-root unique target method");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   626
    tty->print_cr("  context = %s", InstanceKlass::cast(actual_recv->get_Klass())->external_name());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
    tty->print("  method  = ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
    target->print_short_name(tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
    tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
#endif //PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
  if (target() == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   636
  if (target() == root_m->get_Method()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
    return root_m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
  if (!root_m->is_public() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
      !root_m->is_protected()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
    // If we are going to reason about inheritance, it's easiest
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
    // if the method in question is public, protected, or private.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
    // If the answer is not root_m, it is conservatively correct
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
    // to return NULL, even if the CHA encountered irrelevant
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
    // methods in other packages.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
    // %%% TO DO: Work out logic for package-private methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
    // with the same name but different vtable indexes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   650
  return CURRENT_THREAD_ENV->get_method(target());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
// ciMethod::resolve_invoke
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
// Given a known receiver klass, find the target for the call.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
// Return NULL if the call has no target or the target is abstract.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
ciMethod* ciMethod::resolve_invoke(ciKlass* caller, ciKlass* exact_receiver) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
   check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
   VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   662
   KlassHandle caller_klass (THREAD, caller->get_Klass());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   663
   KlassHandle h_recv       (THREAD, exact_receiver->get_Klass());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   664
   KlassHandle h_resolved   (THREAD, holder()->get_Klass());
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7432
diff changeset
   665
   Symbol* h_name      = name()->get_symbol();
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7432
diff changeset
   666
   Symbol* h_signature = signature()->get_symbol();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
   methodHandle m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
   // Only do exact lookup if receiver klass has been linked.  Otherwise,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
   // the vtable has not been setup, and the LinkResolver will fail.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   671
   if (h_recv->oop_is_array()
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
        ||
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   673
       InstanceKlass::cast(h_recv())->is_linked() && !exact_receiver->is_interface()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
     if (holder()->is_interface()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
       m = LinkResolver::resolve_interface_call_or_null(h_recv, h_resolved, h_name, h_signature, caller_klass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
     } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
       m = LinkResolver::resolve_virtual_call_or_null(h_recv, h_resolved, h_name, h_signature, caller_klass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
   if (m.is_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
     // Return NULL only if there was a problem with lookup (uninitialized class, etc.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
     return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
   ciMethod* result = this;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   687
   if (m() != get_Method()) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   688
     result = CURRENT_THREAD_ENV->get_method(m());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
   // Don't return abstract methods because they aren't
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
   // optimizable or interesting.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
   if (result->is_abstract()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
     return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
   } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
     return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
// ciMethod::resolve_vtable_index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
// Given a known receiver klass, find the vtable index for the call.
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   704
// Return Method::invalid_vtable_index if the vtable_index is unknown.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
int ciMethod::resolve_vtable_index(ciKlass* caller, ciKlass* receiver) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
   check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   708
   int vtable_index = Method::invalid_vtable_index;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
   // Only do lookup if receiver klass has been linked.  Otherwise,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
   // the vtable has not been setup, and the LinkResolver will fail.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
   if (!receiver->is_interface()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
       && (!receiver->is_instance_klass() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
           receiver->as_instance_klass()->is_linked())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
     VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   716
     KlassHandle caller_klass (THREAD, caller->get_Klass());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   717
     KlassHandle h_recv       (THREAD, receiver->get_Klass());
8076
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7432
diff changeset
   718
     Symbol* h_name = name()->get_symbol();
96d498ec7ae1 6990754: Use native memory and reference counting to implement SymbolTable
coleenp
parents: 7432
diff changeset
   719
     Symbol* h_signature = signature()->get_symbol();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
     vtable_index = LinkResolver::resolve_virtual_vtable_index(h_recv, h_recv, h_name, h_signature, caller_klass);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   722
     if (vtable_index == Method::nonvirtual_vtable_index) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
       // A statically bound method.  Return "no such index".
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   724
       vtable_index = Method::invalid_vtable_index;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
   return vtable_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
// ciMethod::interpreter_call_site_count
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
int ciMethod::interpreter_call_site_count(int bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
  if (method_data() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
    ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
    ciProfileData* data = method_data()->bci_to_data(bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
    if (data != NULL && data->is_CounterData()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
      return scale_count(data->as_CounterData()->count());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
  return -1;  // unknown
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
// Adjust a CounterData count to be commensurate with
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
// interpreter_invocation_count.  If the MDO exists for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
// only 25% of the time the method exists, then the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
// counts in the MDO should be scaled by 4X, so that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
// they can be usefully and stably compared against the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
// invocation counts in methods.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
int ciMethod::scale_count(int count, float prof_factor) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
  if (count > 0 && method_data() != NULL) {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   753
    int counter_life;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
    int method_life = interpreter_invocation_count();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   755
    if (TieredCompilation) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   756
      // In tiered the MDO's life is measured directly, so just use the snapshotted counters
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   757
      counter_life = MAX2(method_data()->invocation_count(), method_data()->backedge_count());
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   758
    } else {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   759
      int current_mileage = method_data()->current_mileage();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   760
      int creation_mileage = method_data()->creation_mileage();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   761
      counter_life = current_mileage - creation_mileage;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   762
    }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   763
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
    // counter_life due to backedge_counter could be > method_life
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
    if (counter_life > method_life)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
      counter_life = method_life;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
    if (0 < counter_life && counter_life <= method_life) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
      count = (int)((double)count * prof_factor * method_life / counter_life + 0.5);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
      count = (count > 0) ? count : 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
  return count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
// ------------------------------------------------------------------
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 670
diff changeset
   776
// invokedynamic support
5687
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 4892
diff changeset
   777
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 4892
diff changeset
   778
// ------------------------------------------------------------------
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
   779
// ciMethod::is_method_handle_intrinsic
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 670
diff changeset
   780
//
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
   781
// Return true if the method is an instance of the JVM-generated
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
   782
// signature-polymorphic MethodHandle methods, _invokeBasic, _linkToVirtual, etc.
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
   783
bool ciMethod::is_method_handle_intrinsic() const {
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
   784
  vmIntrinsics::ID iid = _intrinsic_id;  // do not check if loaded
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
   785
  return (MethodHandles::is_signature_polymorphic(iid) &&
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
   786
          MethodHandles::is_signature_polymorphic_intrinsic(iid));
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 670
diff changeset
   787
}
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 670
diff changeset
   788
5687
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 4892
diff changeset
   789
// ------------------------------------------------------------------
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
   790
// ciMethod::is_compiled_lambda_form
5687
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 4892
diff changeset
   791
//
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 4892
diff changeset
   792
// Return true if the method is a generated MethodHandle adapter.
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
   793
// These are built by Java code.
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
   794
bool ciMethod::is_compiled_lambda_form() const {
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
   795
  vmIntrinsics::ID iid = _intrinsic_id;  // do not check if loaded
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
   796
  return iid == vmIntrinsics::_compiledLambdaForm;
4581
e89fbd1bcb3d 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 4566
diff changeset
   797
}
e89fbd1bcb3d 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 4566
diff changeset
   798
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
   799
// ------------------------------------------------------------------
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
   800
// ciMethod::has_member_arg
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
   801
//
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
   802
// Return true if the method is a linker intrinsic like _linkToVirtual.
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
   803
// These are built by the JVM.
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
   804
bool ciMethod::has_member_arg() const {
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
   805
  vmIntrinsics::ID iid = _intrinsic_id;  // do not check if loaded
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
   806
  return (MethodHandles::is_signature_polymorphic(iid) &&
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
   807
          MethodHandles::has_member_arg(iid));
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 670
diff changeset
   808
}
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 670
diff changeset
   809
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 670
diff changeset
   810
// ------------------------------------------------------------------
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   811
// ciMethod::ensure_method_data
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
//
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   813
// Generate new MethodData* objects at compile time.
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   814
// Return true if allocation was successful or no MDO is required.
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   815
bool ciMethod::ensure_method_data(methodHandle h_m) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
  EXCEPTION_CONTEXT;
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   817
  if (is_native() || is_abstract() || h_m()->is_accessor()) return true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
  if (h_m()->method_data() == NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   819
    Method::build_interpreter_method_data(h_m, THREAD);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
    if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
      CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
  if (h_m()->method_data() != NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   825
    _method_data = CURRENT_ENV->get_method_data(h_m()->method_data());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
    _method_data->load_data();
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   827
    return true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
    _method_data = CURRENT_ENV->get_empty_methodData();
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   830
    return false;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
// public, retroactive version
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   835
bool ciMethod::ensure_method_data() {
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   836
  bool result = true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
  if (_method_data == NULL || _method_data->is_empty()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
    GUARDED_VM_ENTRY({
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   839
      result = ensure_method_data(get_Method());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
    });
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
  }
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   842
  return result;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
// ciMethod::method_data
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
ciMethodData* ciMethod::method_data() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
  if (_method_data != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
    return _method_data;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
  ciEnv* env = CURRENT_ENV;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
  Thread* my_thread = JavaThread::current();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   856
  methodHandle h_m(my_thread, get_Method());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
  if (h_m()->method_data() != NULL) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   859
    _method_data = CURRENT_ENV->get_method_data(h_m()->method_data());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
    _method_data->load_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   862
    _method_data = CURRENT_ENV->get_empty_methodData();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   863
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   864
  return _method_data;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   865
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   868
// ------------------------------------------------------------------
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   869
// ciMethod::method_data_or_null
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   870
// Returns a pointer to ciMethodData if MDO exists on the VM side,
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   871
// NULL otherwise.
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   872
ciMethodData* ciMethod::method_data_or_null() {
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   873
  ciMethodData *md = method_data();
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   874
  if (md->is_empty()) return NULL;
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   875
  return md;
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   876
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
// ciMethod::will_link
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
// Will this method link in a specific calling context?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
bool ciMethod::will_link(ciKlass* accessing_klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
                         ciKlass* declared_method_holder,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
                         Bytecodes::Code bc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
  if (!is_loaded()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
    // Method lookup failed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
  // The link checks have been front-loaded into the get_method
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
  // call.  This method (ciMethod::will_link()) will be removed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
  // in the future.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
// ciMethod::should_exclude
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
// Should this method be excluded from compilation?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
bool ciMethod::should_exclude() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   904
  methodHandle mh(THREAD, get_Method());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
  bool ignore;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
  return CompilerOracle::should_exclude(mh, ignore);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
// ciMethod::should_inline
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
// Should this method be inlined during compilation?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
bool ciMethod::should_inline() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   916
  methodHandle mh(THREAD, get_Method());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
  return CompilerOracle::should_inline(mh);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
// ciMethod::should_not_inline
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
// Should this method be disallowed from inlining during compilation?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
bool ciMethod::should_not_inline() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   927
  methodHandle mh(THREAD, get_Method());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
  return CompilerOracle::should_not_inline(mh);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
// ciMethod::should_print_assembly
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
// Should the compiler print the generated code for this method?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
bool ciMethod::should_print_assembly() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   938
  methodHandle mh(THREAD, get_Method());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
  return CompilerOracle::should_print(mh);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
// ciMethod::break_at_execute
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
// Should the compiler insert a breakpoint into the generated code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
// method?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
bool ciMethod::break_at_execute() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   950
  methodHandle mh(THREAD, get_Method());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
  return CompilerOracle::should_break_at(mh);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
489c9b5090e2 Initial load
duke
parents:
diff changeset
   954
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   955
// ciMethod::has_option
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
bool ciMethod::has_option(const char* option) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   958
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   959
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   960
  methodHandle mh(THREAD, get_Method());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
  return CompilerOracle::has_option_string(mh, option);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
// ciMethod::can_be_compiled
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
// Have previous compilations of this method succeeded?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
bool ciMethod::can_be_compiled() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
  check_is_loaded();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   970
  ciEnv* env = CURRENT_ENV;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   971
  if (is_c1_compile(env->comp_level())) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   972
    return _is_c1_compilable;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   973
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   974
  return _is_c2_compilable;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
// ciMethod::set_not_compilable
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
// Tell the VM that this method cannot be compiled at all.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
void ciMethod::set_not_compilable() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
  VM_ENTRY_MARK;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   984
  ciEnv* env = CURRENT_ENV;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   985
  if (is_c1_compile(env->comp_level())) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   986
    _is_c1_compilable = false;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   987
  } else {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   988
    _is_c2_compilable = false;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   989
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
   990
  get_Method()->set_not_compilable(env->comp_level());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
// ciMethod::can_be_osr_compiled
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
// Have previous compilations of this method succeeded?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
// Implementation note: the VM does not currently keep track
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
// of failed OSR compilations per bci.  The entry_bci parameter
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
// is currently unused.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
bool ciMethod::can_be_osr_compiled(int entry_bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
  VM_ENTRY_MARK;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1004
  ciEnv* env = CURRENT_ENV;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
  1005
  return !get_Method()->is_not_osr_compilable(env->comp_level());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
// ciMethod::has_compiled_code
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
bool ciMethod::has_compiled_code() {
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1011
  return instructions_size() > 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1014
int ciMethod::comp_level() {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1015
  check_is_loaded();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1016
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
  1017
  nmethod* nm = get_Method()->code();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1018
  if (nm != NULL) return nm->comp_level();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1019
  return 0;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1020
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1021
10014
a5c2141ee857 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 10008
diff changeset
  1022
int ciMethod::highest_osr_comp_level() {
a5c2141ee857 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 10008
diff changeset
  1023
  check_is_loaded();
a5c2141ee857 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 10008
diff changeset
  1024
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
  1025
  return get_Method()->highest_osr_comp_level();
10014
a5c2141ee857 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 10008
diff changeset
  1026
}
a5c2141ee857 7057120: Tiered: Allow C1 to inline methods with loops
iveresov
parents: 10008
diff changeset
  1027
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
// ------------------------------------------------------------------
10506
575ad9bccff5 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 10014
diff changeset
  1029
// ciMethod::code_size_for_inlining
575ad9bccff5 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 10014
diff changeset
  1030
//
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
  1031
// Code size for inlining decisions.  This method returns a code
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
  1032
// size of 1 for methods which has the ForceInline annotation.
10506
575ad9bccff5 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 10014
diff changeset
  1033
int ciMethod::code_size_for_inlining() {
575ad9bccff5 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 10014
diff changeset
  1034
  check_is_loaded();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
  1035
  if (get_Method()->force_inline()) {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
  1036
    return 1;
10506
575ad9bccff5 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 10014
diff changeset
  1037
  }
575ad9bccff5 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 10014
diff changeset
  1038
  return code_size();
575ad9bccff5 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 10014
diff changeset
  1039
}
575ad9bccff5 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 10014
diff changeset
  1040
575ad9bccff5 7078382: JSR 292: don't count method handle adapters against inlining budgets
twisti
parents: 10014
diff changeset
  1041
// ------------------------------------------------------------------
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
// ciMethod::instructions_size
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6187
diff changeset
  1043
//
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6187
diff changeset
  1044
// This is a rough metric for "fat" methods, compared before inlining
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6187
diff changeset
  1045
// with InlineSmallCode.  The CodeBlob::code_size accessor includes
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6187
diff changeset
  1046
// junk like exception handler, stubs, and constant table, which are
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6187
diff changeset
  1047
// not highly relevant to an inlined method.  So we use the more
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6187
diff changeset
  1048
// specific accessor nmethod::insts_size.
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1049
int ciMethod::instructions_size() {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1050
  if (_instructions_size == -1) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1051
    GUARDED_VM_ENTRY(
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1052
                     nmethod* code = get_Method()->code();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1053
                     if (code != NULL && (code->comp_level() == CompLevel_full_optimization)) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1054
                       _instructions_size = code->insts_end() - code->verified_entry_point();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1055
                     } else {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1056
                       _instructions_size = 0;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1057
                     }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1058
                     );
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1059
  }
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1060
  return _instructions_size;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
// ciMethod::log_nmethod_identity
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
void ciMethod::log_nmethod_identity(xmlStream* log) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
  GUARDED_VM_ENTRY(
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
  1067
    nmethod* code = get_Method()->code();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
    if (code != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
      code->log_identity(log);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
  )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
// ciMethod::is_not_reached
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
bool ciMethod::is_not_reached(int bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
  return Interpreter::is_not_reached(
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
  1080
               methodHandle(THREAD, get_Method()), bci);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
// ciMethod::was_never_executed
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
bool ciMethod::was_executed_more_than(int times) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
  1087
  return get_Method()->was_executed_more_than(times);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
// ciMethod::has_unloaded_classes_in_signature
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
bool ciMethod::has_unloaded_classes_in_signature() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
    EXCEPTION_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
  1096
    methodHandle m(THREAD, get_Method());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
  1097
    bool has_unloaded = Method::has_unloaded_classes_in_signature(m, (JavaThread *)THREAD);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
    if( HAS_PENDING_EXCEPTION ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
      CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
      return true;     // Declare that we may have unloaded classes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
    return has_unloaded;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
// ciMethod::is_klass_loaded
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
bool ciMethod::is_klass_loaded(int refinfo_index, bool must_be_resolved) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
  VM_ENTRY_MARK;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
  1110
  return get_Method()->is_klass_loaded(refinfo_index, must_be_resolved);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
// ciMethod::check_call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
bool ciMethod::check_call(int refinfo_index, bool is_static) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
    EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
    HandleMark hm(THREAD);
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
  1120
    constantPoolHandle pool (THREAD, get_Method()->constants());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
    methodHandle spec_method;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
    KlassHandle  spec_klass;
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
  1123
    Bytecodes::Code code = (is_static ? Bytecodes::_invokestatic : Bytecodes::_invokevirtual);
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
  1124
    LinkResolver::resolve_method_statically(spec_method, spec_klass, code, pool, refinfo_index, THREAD);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1125
    if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
      CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
      return (spec_method->is_static() == is_static);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1130
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1131
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1132
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1133
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1136
// ciMethod::print_codes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
// Print the bytecodes for this method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
void ciMethod::print_codes_on(outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
  check_is_loaded();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
  1141
  GUARDED_VM_ENTRY(get_Method()->print_codes_on(st);)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
#define FETCH_FLAG_FROM_VM(flag_accessor) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
  check_is_loaded(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
  VM_ENTRY_MARK; \
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
  1148
  return get_Method()->flag_accessor(); \
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
bool ciMethod::is_empty_method() const {         FETCH_FLAG_FROM_VM(is_empty_method); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
bool ciMethod::is_vanilla_constructor() const {  FETCH_FLAG_FROM_VM(is_vanilla_constructor); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
bool ciMethod::has_loops      () const {         FETCH_FLAG_FROM_VM(has_loops); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
bool ciMethod::has_jsrs       () const {         FETCH_FLAG_FROM_VM(has_jsrs);  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
bool ciMethod::is_accessor    () const {         FETCH_FLAG_FROM_VM(is_accessor); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
bool ciMethod::is_initializer () const {         FETCH_FLAG_FROM_VM(is_initializer); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1157
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
BCEscapeAnalyzer  *ciMethod::get_bcea() {
5928
f6e69b46e9e3 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 5702
diff changeset
  1159
#ifdef COMPILER2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
  if (_bcea == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
    _bcea = new (CURRENT_ENV->arena()) BCEscapeAnalyzer(this, NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
  return _bcea;
5928
f6e69b46e9e3 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 5702
diff changeset
  1164
#else // COMPILER2
f6e69b46e9e3 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 5702
diff changeset
  1165
  ShouldNotReachHere();
f6e69b46e9e3 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 5702
diff changeset
  1166
  return NULL;
f6e69b46e9e3 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 5702
diff changeset
  1167
#endif // COMPILER2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
ciMethodBlocks  *ciMethod::get_method_blocks() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
  Arena *arena = CURRENT_ENV->arena();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
  if (_method_blocks == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
    _method_blocks = new (arena) ciMethodBlocks(arena, this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
  return _method_blocks;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
#undef FETCH_FLAG_FROM_VM
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
14477
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1180
void ciMethod::dump_replay_data(outputStream* st) {
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1181
  ASSERT_IN_VM;
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1182
  Method* method = get_Method();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1183
  Klass*  holder = method->method_holder();
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1184
  st->print_cr("ciMethod %s %s %s %d %d %d %d %d",
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1185
               holder->name()->as_quoted_ascii(),
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1186
               method->name()->as_quoted_ascii(),
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1187
               method->signature()->as_quoted_ascii(),
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1188
               method->invocation_counter()->raw_counter(),
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1189
               method->backedge_counter()->raw_counter(),
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1190
               interpreter_invocation_count(),
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1191
               interpreter_throwout_count(),
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1192
               _instructions_size);
95e66ea71f71 6830717: replay of compilations would help with debugging
minqi
parents: 14391
diff changeset
  1193
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
// ciMethod::print_codes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
// Print a range of the bytecodes for this method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1199
void ciMethod::print_codes_on(int from, int to, outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
  check_is_loaded();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
  1201
  GUARDED_VM_ENTRY(get_Method()->print_codes_on(from, to, st);)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1202
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
// ciMethod::print_name
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
// Print the name of this method, including signature and some flags.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1208
void ciMethod::print_name(outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1209
  check_is_loaded();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
  1210
  GUARDED_VM_ENTRY(get_Method()->print_name(st);)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1211
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1212
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1213
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1214
// ciMethod::print_short_name
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1215
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1216
// Print the name of this method, without signature.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1217
void ciMethod::print_short_name(outputStream* st) {
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
  1218
  if (is_loaded()) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
  1219
    GUARDED_VM_ENTRY(get_Method()->print_short_name(st););
13391
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
  1220
  } else {
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
  1221
    // Fall back if method is not loaded.
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
  1222
    holder()->print_name_on(st);
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
  1223
    st->print("::");
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
  1224
    name()->print_symbol_on(st);
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
  1225
    if (WizardMode)
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
  1226
      signature()->as_symbol()->print_symbol_on(st);
30245956af37 7023639: JSR 292 method handle invocation needs a fast path for compiled code
twisti
parents: 13282
diff changeset
  1227
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1228
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
// ciMethod::print_impl
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1233
// Implementation of the print method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
void ciMethod::print_impl(outputStream* st) {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 13522
diff changeset
  1235
  ciMetadata::print_impl(st);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
  st->print(" name=");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1237
  name()->print_symbol_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1238
  st->print(" holder=");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1239
  holder()->print_name_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1240
  st->print(" signature=");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
  signature()->as_symbol()->print_symbol_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
  if (is_loaded()) {
13522
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
  1243
    st->print(" loaded=true");
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
  1244
    st->print(" arg_size=%d", arg_size());
5ad4627e792a 7192406: JSR 292: C2 needs exact return type information for invokedynamic and invokehandle call sites
twisti
parents: 13391
diff changeset
  1245
    st->print(" flags=");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1246
    flags().print_member_flags(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1247
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1248
    st->print(" loaded=false");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1249
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1250
}