hotspot/src/share/vm/ci/ciMethod.cpp
author iveresov
Thu, 02 Dec 2010 17:21:12 -0800
changeset 7432 f06f1253c317
parent 7397 5b173b4ca846
child 8076 96d498ec7ae1
permissions -rw-r--r--
7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer Summary: C1 with profiling doesn't check whether the MDO has been really allocated, which can silently fail if the perm gen is full. The solution is to check if the allocation failed and bailout out of inlining or compilation. Reviewed-by: kvn, never
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4892
diff changeset
     2
 * Copyright (c) 1999, 2010, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 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/ciMethodKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    33
#include "ci/ciStreams.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    34
#include "ci/ciSymbol.hpp"
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"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    54
#include "oops/methodOop.hpp"
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"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 6754
diff changeset
    58
#include "oops/methodOop.hpp"
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
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
// This class represents a methodOop in the HotSpot virtual
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.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
ciMethod::ciMethod(methodHandle h_m) : ciObject(h_m) {
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();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  _handler_count      = h_m()->exception_table()->length() / 4;
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
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  if (instanceKlass::cast(h_m()->method_holder())->is_linked()) {
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.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
  _name = env->get_object(h_m()->name())->as_symbol();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
  _holder = env->get_object(h_m()->method_holder())->as_instance_klass();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
  ciSymbol* sig_symbol = env->get_object(h_m()->signature())->as_symbol();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  _signature = new (env->arena()) ciSignature(_holder, sig_symbol);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  _method_data = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  // Take a snapshot of these values, so they will be commensurate with the MDO.
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   131
  if (ProfileInterpreter || TieredCompilation) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
    int invcnt = h_m()->interpreter_invocation_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
    // if the value overflowed report it as max int
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
    _interpreter_invocation_count = invcnt < 0 ? max_jint : invcnt ;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
    _interpreter_throwout_count   = h_m()->interpreter_throwout_count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
    _interpreter_invocation_count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
    _interpreter_throwout_count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  if (_interpreter_invocation_count == 0)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
    _interpreter_invocation_count = 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
// ciMethod::ciMethod
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
// Unloaded method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
ciMethod::ciMethod(ciInstanceKlass* holder,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
                   ciSymbol* name,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
                   ciSymbol* signature) : ciObject(ciMethodKlass::make()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  // These fields are always filled in.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  _name = name;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
  _holder = holder;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
  _signature = new (CURRENT_ENV->arena()) ciSignature(_holder, signature);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
  _intrinsic_id = vmIntrinsics::_none;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  _liveness = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  _can_be_statically_bound = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  _method_blocks = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  _method_data = NULL;
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   161
#if defined(COMPILER2) || defined(SHARK)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  _flow = NULL;
5928
f6e69b46e9e3 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 5702
diff changeset
   163
  _bcea = NULL;
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   164
#endif // COMPILER2 || SHARK
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
// ciMethod::load_code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
// Load the bytecodes and exception handler table for this method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
void ciMethod::load_code() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  assert(is_loaded(), "only loaded methods have code");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
489c9b5090e2 Initial load
duke
parents:
diff changeset
   176
  methodOop me = get_methodOop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
  Arena* arena = CURRENT_THREAD_ENV->arena();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
  // Load the bytecodes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
  _code = (address)arena->Amalloc(code_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  memcpy(_code, me->code_base(), code_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
  // 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
   184
  if (me->number_of_breakpoints() > 0) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
    BreakpointInfo* bp = instanceKlass::cast(me->method_holder())->breakpoints();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
    for (; bp != NULL; bp = bp->next()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
      if (bp->match(me)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
        code_at_put(bp->bci(), bp->orig_bytecode());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
  // And load the exception table.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  typeArrayOop exc_table = me->exception_table();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
  // Allocate one extra spot in our list of exceptions.  This
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
  // last entry will be used to represent the possibility that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  // an exception escapes the method.  See ciExceptionHandlerStream
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  // for details.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  _exception_handlers =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
    (ciExceptionHandler**)arena->Amalloc(sizeof(ciExceptionHandler*)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
                                         * (_handler_count + 1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
  if (_handler_count > 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   204
    for (int i=0; i<_handler_count; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
      int base = i*4;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   206
      _exception_handlers[i] = new (arena) ciExceptionHandler(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
                                holder(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   208
            /* start    */      exc_table->int_at(base),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   209
            /* limit    */      exc_table->int_at(base+1),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
            /* goto pc  */      exc_table->int_at(base+2),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   211
            /* cp index */      exc_table->int_at(base+3));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   212
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   213
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   214
489c9b5090e2 Initial load
duke
parents:
diff changeset
   215
  // Put an entry at the end of our list to represent the possibility
489c9b5090e2 Initial load
duke
parents:
diff changeset
   216
  // of exceptional exit.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
  _exception_handlers[_handler_count] =
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
    new (arena) ciExceptionHandler(holder(), 0, code_size(), -1, 0);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   219
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
  if (CIPrintMethodCodes) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
    print_codes();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
// ciMethod::has_linenumber_table
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
// length unknown until decompression
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
bool    ciMethod::has_linenumber_table() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
  return get_methodOop()->has_linenumber_table();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
}
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
// ciMethod::compressed_linenumber_table
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
u_char* ciMethod::compressed_linenumber_table() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
  return get_methodOop()->compressed_linenumber_table();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
// ciMethod::line_number_from_bci
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
int ciMethod::line_number_from_bci(int bci) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  return get_methodOop()->line_number_from_bci(bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
// ciMethod::vtable_index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
// Get the position of this method's entry in the vtable, if any.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
int ciMethod::vtable_index() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  assert(holder()->is_linked(), "must be linked");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  return get_methodOop()->vtable_index();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   267
#ifdef SHARK
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   268
// ------------------------------------------------------------------
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   269
// ciMethod::itable_index
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   270
//
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   271
// Get the position of this method's entry in the itable, if any.
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   272
int ciMethod::itable_index() {
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   273
  check_is_loaded();
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   274
  assert(holder()->is_linked(), "must be linked");
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   275
  VM_ENTRY_MARK;
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   276
  return klassItable::compute_itable_index(get_methodOop());
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   277
}
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   278
#endif // SHARK
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   279
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   280
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
// ciMethod::native_entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
// Get the address of this method's native code, if any.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
address ciMethod::native_entry() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  assert(flags().is_native(), "must be native method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
  methodOop method = get_methodOop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
  address entry = method->native_function();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
  assert(entry != NULL, "must be valid entry point");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  return entry;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
// ciMethod::interpreter_entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
// Get the entry point for running this method in the interpreter.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
address ciMethod::interpreter_entry() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
  methodHandle mh(THREAD, get_methodOop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  return Interpreter::entry_for_method(mh);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
}
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
// ciMethod::uses_balanced_monitors
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
// Does this method use monitors in a strict stack-disciplined manner?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
bool ciMethod::has_balanced_monitors() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  if (_balanced_monitors) return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  // Analyze the method to see if monitors are used properly.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  methodHandle method(THREAD, get_methodOop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  assert(method->has_monitor_bytecodes(), "should have checked this");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  // Check to see if a previous compilation computed the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
  // monitor-matching analysis.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  if (method->guaranteed_monitor_matching()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
    _balanced_monitors = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
    return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
    EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
    ResourceMark rm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
    GeneratePairingInfo gpi(method);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
    gpi.compute_map(CATCH);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
    if (!gpi.monitor_safe()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
    method->set_guaranteed_monitor_matching();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
    _balanced_monitors = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
// ciMethod::get_flow_analysis
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
ciTypeFlow* ciMethod::get_flow_analysis() {
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   346
#if defined(COMPILER2) || defined(SHARK)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
  if (_flow == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   348
    ciEnv* env = CURRENT_ENV;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
    _flow = new (env->arena()) ciTypeFlow(env, this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
    _flow->do_flow();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  return _flow;
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   353
#else // COMPILER2 || SHARK
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   355
  return NULL;
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   356
#endif // COMPILER2 || SHARK
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   357
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   358
489c9b5090e2 Initial load
duke
parents:
diff changeset
   359
489c9b5090e2 Initial load
duke
parents:
diff changeset
   360
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   361
// ciMethod::get_osr_flow_analysis
489c9b5090e2 Initial load
duke
parents:
diff changeset
   362
ciTypeFlow* ciMethod::get_osr_flow_analysis(int osr_bci) {
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   363
#if defined(COMPILER2) || defined(SHARK)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   364
  // OSR entry points are always place after a call bytecode of some sort
489c9b5090e2 Initial load
duke
parents:
diff changeset
   365
  assert(osr_bci >= 0, "must supply valid OSR entry point");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   366
  ciEnv* env = CURRENT_ENV;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   367
  ciTypeFlow* flow = new (env->arena()) ciTypeFlow(env, this, osr_bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   368
  flow->do_flow();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   369
  return flow;
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   370
#else // COMPILER2 || SHARK
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   371
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   372
  return NULL;
6187
4fa7845f7c14 6976186: integrate Shark HotSpot changes
twisti
parents: 6064
diff changeset
   373
#endif // COMPILER2 || SHARK
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   374
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   375
489c9b5090e2 Initial load
duke
parents:
diff changeset
   376
// ------------------------------------------------------------------
3910
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   377
// ciMethod::raw_liveness_at_bci
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   378
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   379
// 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
   380
MethodLivenessResult ciMethod::raw_liveness_at_bci(int bci) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   381
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   382
  if (_liveness == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   383
    // Create the liveness analyzer.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   384
    Arena* arena = CURRENT_ENV->arena();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   385
    _liveness = new (arena) MethodLiveness(arena, this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   386
    _liveness->compute_liveness();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   387
  }
3910
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   388
  return _liveness->get_liveness_at(bci);
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   389
}
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   390
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   391
// ------------------------------------------------------------------
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   392
// ciMethod::liveness_at_bci
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   393
//
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   394
// 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
   395
// 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
   396
// information.
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   397
MethodLivenessResult ciMethod::liveness_at_bci(int bci) {
67050ceda719 6854812: 6.0_14-b08 crashes with a SIGSEGV
never
parents: 2867
diff changeset
   398
  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
   399
  if (CURRENT_ENV->jvmti_can_access_local_variables() || DeoptimizeALot || CompileTheWorld) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   400
    // Keep all locals live for the user's edification and amusement.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   401
    result.at_put_range(0, result.size(), true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   402
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   403
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   405
489c9b5090e2 Initial load
duke
parents:
diff changeset
   406
// ciMethod::live_local_oops_at_bci
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
// find all the live oops in the locals array for a particular bci
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
// Compute what the interpreter believes by using the interpreter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
// oopmap generator. This is used as a double check during osr to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
// guard against conservative result from MethodLiveness making us
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
// think a dead oop is live.  MethodLiveness is conservative in the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
// sense that it may consider locals to be live which cannot be live,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
// like in the case where a local could contain an oop or  a primitive
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
// along different paths.  In that case the local must be dead when
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
// those paths merge. Since the interpreter's viewpoint is used when
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
// gc'ing an interpreter frame we need to use its viewpoint  during
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
// OSR when loading the locals.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
BitMap ciMethod::live_local_oops_at_bci(int bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
  InterpreterOopMap mask;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
  OopMapCache::compute_one_oop_map(get_methodOop(), bci, &mask);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
  int mask_size = max_locals();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
  BitMap result(mask_size);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
  result.clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
  int i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
  for (i = 0; i < mask_size ; i++ ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
    if (mask.is_oop(i)) result.set_bit(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
#ifdef COMPILER1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
// ciMethod::bci_block_start
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
// Marks all bcis where a new basic block starts
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
const BitMap ciMethod::bci_block_start() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  if (_liveness == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
    // Create the liveness analyzer.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
    Arena* arena = CURRENT_ENV->arena();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
    _liveness = new (arena) MethodLiveness(arena, this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
    _liveness->compute_liveness();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   447
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
  return _liveness->get_bci_block_start();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
#endif // COMPILER1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
// ciMethod::call_profile_at_bci
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
// Get the ciCallProfile for the invocation of this method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
// Also reports receiver types for non-call type checks (if TypeProfileCasts).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   459
ciCallProfile ciMethod::call_profile_at_bci(int bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
  ciCallProfile result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
  if (method_data() != NULL && method_data()->is_mature()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
    ciProfileData* data = method_data()->bci_to_data(bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
    if (data != NULL && data->is_CounterData()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
      // Every profiled call site has a counter.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
      int count = data->as_CounterData()->count();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
      if (!data->is_ReceiverTypeData()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
        result._receiver_count[0] = 0;  // that's a definite zero
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
      } else { // ReceiverTypeData is a subclass of CounterData
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
        ciReceiverTypeData* call = (ciReceiverTypeData*)data->as_ReceiverTypeData();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
        // In addition, virtual call sites have receiver type information
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
        int receivers_count_total = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
        int morphism = 0;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   475
        // Precompute morphism for the possible fixup
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   476
        for (uint i = 0; i < call->row_limit(); i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
          ciKlass* receiver = call->receiver(i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
          if (receiver == NULL)  continue;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   479
          morphism++;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   480
        }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   481
        int epsilon = 0;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   482
        if (TieredCompilation && ProfileInterpreter) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   483
          // Interpreter and C1 treat final and special invokes differently.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   484
          // C1 will record a type, whereas the interpreter will just
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   485
          // increment the count. Detect this case.
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   486
          if (morphism == 1 && count > 0) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   487
            epsilon = count;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   488
            count = 0;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   489
          }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   490
        }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   491
        for (uint i = 0; i < call->row_limit(); i++) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   492
          ciKlass* receiver = call->receiver(i);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   493
          if (receiver == NULL)  continue;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   494
          int rcount = call->receiver_count(i) + epsilon;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
          if (rcount == 0) rcount = 1; // Should be valid value
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
          receivers_count_total += rcount;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
          // Add the receiver to result data.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
          result.add_receiver(receiver, rcount);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
          // If we extend profiling to record methods,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
          // we will set result._method also.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
        // Determine call site's morphism.
4754
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   503
        // 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
   504
        // 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
   505
        // 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
   506
        if (morphism > 0 && morphism == result._limit) {
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   507
           // The morphism <= MorphismLimit.
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   508
           if ((morphism <  ciCallProfile::MorphismLimit) ||
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   509
               (morphism == ciCallProfile::MorphismLimit && count == 0)) {
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   510
#ifdef ASSERT
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   511
             if (count > 0) {
4892
e977b527544a 6923002: assert(false,"this call site should not be polymorphic")
kvn
parents: 4754
diff changeset
   512
               this->print_short_name(tty);
e977b527544a 6923002: assert(false,"this call site should not be polymorphic")
kvn
parents: 4754
diff changeset
   513
               tty->print_cr(" @ bci:%d", bci);
4754
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   514
               this->print_codes();
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   515
               assert(false, "this call site should not be polymorphic");
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   516
             }
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   517
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
             result._morphism = morphism;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
           }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
        // Make the count consistent if this is a call profile. If count is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
        // zero or less, presume that this is a typecheck profile and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
        // do nothing.  Otherwise, increase count to be the sum of all
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
        // receiver's counts.
4754
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   525
        if (count >= 0) {
8aef16f24e16 6614597: Performance variability in jvm2008 xml.validation
kvn
parents: 4581
diff changeset
   526
          count += receivers_count_total;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
      result._count = count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
  return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
// Add new receiver and sort data by receiver's profile count.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
void ciCallProfile::add_receiver(ciKlass* receiver, int receiver_count) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
  // Add new receiver and sort data by receiver's counts when we have space
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  // for it otherwise replace the less called receiver (less called receiver
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
  // is placed to the last array element which is not used).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
  // First array's element contains most called receiver.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
  int i = _limit;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
  for (; i > 0 && receiver_count > _receiver_count[i-1]; i--) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
    _receiver[i] = _receiver[i-1];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
    _receiver_count[i] = _receiver_count[i-1];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
  _receiver[i] = receiver;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
  _receiver_count[i] = receiver_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
  if (_limit < MorphismLimit) _limit++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
// ciMethod::find_monomorphic_target
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
// Given a certain calling environment, find the monomorphic target
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
// for the call.  Return NULL if the call is not monomorphic in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
// its calling environment, or if there are only abstract methods.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
// The returned method is never abstract.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
// Note: If caller uses a non-null result, it must inform dependencies
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
// via assert_unique_concrete_method or assert_leaf_type.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
ciMethod* ciMethod::find_monomorphic_target(ciInstanceKlass* caller,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
                                            ciInstanceKlass* callee_holder,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
                                            ciInstanceKlass* actual_recv) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
  if (actual_recv->is_interface()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
    // %%% We cannot trust interface types, yet.  See bug 6312651.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
  ciMethod* root_m = resolve_invoke(caller, actual_recv);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
  if (root_m == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
    // Something went wrong looking up the actual receiver method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
  assert(!root_m->is_abstract(), "resolve_invoke promise");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
  // Make certain quick checks even if UseCHA is false.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
  // Is it private or final?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
  if (root_m->can_be_statically_bound()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
    return root_m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
  if (actual_recv->is_leaf_type() && actual_recv == root_m->holder()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
    // Easy case.  There is no other place to put a method, so don't bother
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
    // to go through the VM_ENTRY_MARK and all the rest.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
    return root_m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
  // Array methods (clone, hashCode, etc.) are always statically bound.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
  // If we were to see an array type here, we'd return root_m.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
  // However, this method processes only ciInstanceKlasses.  (See 4962591.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
  // The inline_native_clone intrinsic narrows Object to T[] properly,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
  // so there is no need to do the same job here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
  if (!UseCHA)  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
  methodHandle target;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
    MutexLocker locker(Compile_lock);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
    klassOop context = actual_recv->get_klassOop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
    target = Dependencies::find_unique_concrete_method(context,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
                                                       root_m->get_methodOop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
    // %%% Should upgrade this ciMethod API to look for 1 or 2 concrete methods.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
  if (TraceDependencies && target() != NULL && target() != root_m->get_methodOop()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
    tty->print("found a non-root unique target method");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
    tty->print_cr("  context = %s", instanceKlass::cast(actual_recv->get_klassOop())->external_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
    tty->print("  method  = ");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
    target->print_short_name(tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
    tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
#endif //PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
  if (target() == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
  if (target() == root_m->get_methodOop()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
    return root_m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
  if (!root_m->is_public() &&
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
      !root_m->is_protected()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
    // If we are going to reason about inheritance, it's easiest
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
    // if the method in question is public, protected, or private.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
    // If the answer is not root_m, it is conservatively correct
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
    // to return NULL, even if the CHA encountered irrelevant
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
    // methods in other packages.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
    // %%% TO DO: Work out logic for package-private methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
    // with the same name but different vtable indexes.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
    return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
  return CURRENT_THREAD_ENV->get_object(target())->as_method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
// ciMethod::resolve_invoke
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
// Given a known receiver klass, find the target for the call.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
// Return NULL if the call has no target or the target is abstract.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
ciMethod* ciMethod::resolve_invoke(ciKlass* caller, ciKlass* exact_receiver) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
   check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
   VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
   KlassHandle caller_klass (THREAD, caller->get_klassOop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
   KlassHandle h_recv       (THREAD, exact_receiver->get_klassOop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
   KlassHandle h_resolved   (THREAD, holder()->get_klassOop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
   symbolHandle h_name      (THREAD, name()->get_symbolOop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
   symbolHandle h_signature (THREAD, signature()->get_symbolOop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
   methodHandle m;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
   // Only do exact lookup if receiver klass has been linked.  Otherwise,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
   // the vtable has not been setup, and the LinkResolver will fail.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
   if (h_recv->oop_is_javaArray()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
        ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
       instanceKlass::cast(h_recv())->is_linked() && !exact_receiver->is_interface()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
     if (holder()->is_interface()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   662
       m = LinkResolver::resolve_interface_call_or_null(h_recv, h_resolved, h_name, h_signature, caller_klass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
     } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
       m = LinkResolver::resolve_virtual_call_or_null(h_recv, h_resolved, h_name, h_signature, caller_klass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
   if (m.is_null()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
     // Return NULL only if there was a problem with lookup (uninitialized class, etc.)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
     return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
   ciMethod* result = this;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
   if (m() != get_methodOop()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
     result = CURRENT_THREAD_ENV->get_object(m())->as_method();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
   // Don't return abstract methods because they aren't
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
   // optimizable or interesting.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
   if (result->is_abstract()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
     return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
   } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
     return result;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
// ciMethod::resolve_vtable_index
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
// Given a known receiver klass, find the vtable index for the call.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
// Return methodOopDesc::invalid_vtable_index if the vtable_index is unknown.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
int ciMethod::resolve_vtable_index(ciKlass* caller, ciKlass* receiver) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
   check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
   int vtable_index = methodOopDesc::invalid_vtable_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
   // Only do lookup if receiver klass has been linked.  Otherwise,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
   // the vtable has not been setup, and the LinkResolver will fail.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
   if (!receiver->is_interface()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
       && (!receiver->is_instance_klass() ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
           receiver->as_instance_klass()->is_linked())) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
     VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
     KlassHandle caller_klass (THREAD, caller->get_klassOop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
     KlassHandle h_recv       (THREAD, receiver->get_klassOop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
     symbolHandle h_name      (THREAD, name()->get_symbolOop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
     symbolHandle h_signature (THREAD, signature()->get_symbolOop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
     vtable_index = LinkResolver::resolve_virtual_vtable_index(h_recv, h_recv, h_name, h_signature, caller_klass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
     if (vtable_index == methodOopDesc::nonvirtual_vtable_index) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
       // A statically bound method.  Return "no such index".
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
       vtable_index = methodOopDesc::invalid_vtable_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
     }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
   }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
   return vtable_index;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
// ciMethod::interpreter_call_site_count
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
int ciMethod::interpreter_call_site_count(int bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
  if (method_data() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
    ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
    ciProfileData* data = method_data()->bci_to_data(bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
    if (data != NULL && data->is_CounterData()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
      return scale_count(data->as_CounterData()->count());
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 -1;  // unknown
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
// Adjust a CounterData count to be commensurate with
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
// interpreter_invocation_count.  If the MDO exists for
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
// only 25% of the time the method exists, then the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
// counts in the MDO should be scaled by 4X, so that
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
// they can be usefully and stably compared against the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
// invocation counts in methods.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
int ciMethod::scale_count(int count, float prof_factor) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
  if (count > 0 && method_data() != NULL) {
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   740
    int counter_life;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
    int method_life = interpreter_invocation_count();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   742
    if (TieredCompilation) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   743
      // In tiered the MDO's life is measured directly, so just use the snapshotted counters
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   744
      counter_life = MAX2(method_data()->invocation_count(), method_data()->backedge_count());
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   745
    } else {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   746
      int current_mileage = method_data()->current_mileage();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   747
      int creation_mileage = method_data()->creation_mileage();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   748
      counter_life = current_mileage - creation_mileage;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   749
    }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   750
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
    // counter_life due to backedge_counter could be > method_life
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
    if (counter_life > method_life)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
      counter_life = method_life;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
    if (0 < counter_life && counter_life <= method_life) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
      count = (int)((double)count * prof_factor * method_life / counter_life + 0.5);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
      count = (count > 0) ? count : 1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
  return count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
// ------------------------------------------------------------------
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 670
diff changeset
   763
// invokedynamic support
5687
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 4892
diff changeset
   764
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 4892
diff changeset
   765
// ------------------------------------------------------------------
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 4892
diff changeset
   766
// ciMethod::is_method_handle_invoke
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 670
diff changeset
   767
//
6064
71e316283a85 6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents: 5928
diff changeset
   768
// Return true if the method is an instance of one of the two
71e316283a85 6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents: 5928
diff changeset
   769
// signature-polymorphic MethodHandle methods, invokeExact or invokeGeneric.
4566
b363f6ef4068 6829187: compiler optimizations required for JSR 292
twisti
parents: 3910
diff changeset
   770
bool ciMethod::is_method_handle_invoke() const {
6744
dd08c62a68c7 6986944: JSR 292 assert(caller_nm->is_method_handle_return(caller_frame.pc())) failed: must be MH call site
twisti
parents: 6453
diff changeset
   771
  if (!is_loaded()) {
dd08c62a68c7 6986944: JSR 292 assert(caller_nm->is_method_handle_return(caller_frame.pc())) failed: must be MH call site
twisti
parents: 6453
diff changeset
   772
    bool flag = (holder()->name() == ciSymbol::java_dyn_MethodHandle() &&
dd08c62a68c7 6986944: JSR 292 assert(caller_nm->is_method_handle_return(caller_frame.pc())) failed: must be MH call site
twisti
parents: 6453
diff changeset
   773
                 methodOopDesc::is_method_handle_invoke_name(name()->sid()));
dd08c62a68c7 6986944: JSR 292 assert(caller_nm->is_method_handle_return(caller_frame.pc())) failed: must be MH call site
twisti
parents: 6453
diff changeset
   774
    return flag;
dd08c62a68c7 6986944: JSR 292 assert(caller_nm->is_method_handle_return(caller_frame.pc())) failed: must be MH call site
twisti
parents: 6453
diff changeset
   775
  }
6064
71e316283a85 6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents: 5928
diff changeset
   776
  VM_ENTRY_MARK;
71e316283a85 6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents: 5928
diff changeset
   777
  return get_methodOop()->is_method_handle_invoke();
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 670
diff changeset
   778
}
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 670
diff changeset
   779
5687
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 4892
diff changeset
   780
// ------------------------------------------------------------------
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 4892
diff changeset
   781
// ciMethod::is_method_handle_adapter
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 4892
diff changeset
   782
//
b862d1f189bd 6930772: JSR 292 needs to support SPARC C1
twisti
parents: 4892
diff changeset
   783
// Return true if the method is a generated MethodHandle adapter.
6064
71e316283a85 6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents: 5928
diff changeset
   784
// These are built by MethodHandleCompiler.
4581
e89fbd1bcb3d 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 4566
diff changeset
   785
bool ciMethod::is_method_handle_adapter() const {
6064
71e316283a85 6969574: invokedynamic call sites deoptimize instead of executing
jrose
parents: 5928
diff changeset
   786
  if (!is_loaded())  return false;
4581
e89fbd1bcb3d 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 4566
diff changeset
   787
  VM_ENTRY_MARK;
e89fbd1bcb3d 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 4566
diff changeset
   788
  return get_methodOop()->is_method_handle_adapter();
e89fbd1bcb3d 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 4566
diff changeset
   789
}
e89fbd1bcb3d 6914206: change way of permission checking for generated MethodHandle adapters
twisti
parents: 4566
diff changeset
   790
2534
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 670
diff changeset
   791
ciInstance* ciMethod::method_handle_type() {
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 670
diff changeset
   792
  check_is_loaded();
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 670
diff changeset
   793
  VM_ENTRY_MARK;
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 670
diff changeset
   794
  oop mtype = get_methodOop()->method_handle_type();
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 670
diff changeset
   795
  return CURRENT_THREAD_ENV->get_object(mtype)->as_instance();
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 670
diff changeset
   796
}
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 670
diff changeset
   797
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 670
diff changeset
   798
08dac9ce0cd7 6655638: dynamic languages need method handles
jrose
parents: 670
diff changeset
   799
// ------------------------------------------------------------------
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   800
// ciMethod::ensure_method_data
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
// Generate new methodDataOop objects at compile time.
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   803
// 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
   804
bool ciMethod::ensure_method_data(methodHandle h_m) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
  EXCEPTION_CONTEXT;
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   806
  if (is_native() || is_abstract() || h_m()->is_accessor()) return true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
  if (h_m()->method_data() == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
    methodOopDesc::build_interpreter_method_data(h_m, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
    if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
      CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
  if (h_m()->method_data() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
    _method_data = CURRENT_ENV->get_object(h_m()->method_data())->as_method_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
    _method_data->load_data();
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   816
    return true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
    _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
   819
    return false;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
// public, retroactive version
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   824
bool ciMethod::ensure_method_data() {
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   825
  bool result = true;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
  if (_method_data == NULL || _method_data->is_empty()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
    GUARDED_VM_ENTRY({
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   828
      result = ensure_method_data(get_methodOop());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
    });
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
  }
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   831
  return result;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
// ciMethod::method_data
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
ciMethodData* ciMethod::method_data() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
  if (_method_data != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
    return _method_data;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   842
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   843
  ciEnv* env = CURRENT_ENV;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   844
  Thread* my_thread = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
  methodHandle h_m(my_thread, get_methodOop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
  if (h_m()->method_data() != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
    _method_data = CURRENT_ENV->get_object(h_m()->method_data())->as_method_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
    _method_data->load_data();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
    _method_data = CURRENT_ENV->get_empty_methodData();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
  return _method_data;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
7432
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   857
// ------------------------------------------------------------------
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   858
// ciMethod::method_data_or_null
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   859
// 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
   860
// NULL otherwise.
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   861
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
   862
  ciMethodData *md = method_data();
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   863
  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
   864
  return md;
f06f1253c317 7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer
iveresov
parents: 7397
diff changeset
   865
}
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   866
489c9b5090e2 Initial load
duke
parents:
diff changeset
   867
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   868
// ciMethod::will_link
489c9b5090e2 Initial load
duke
parents:
diff changeset
   869
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
// Will this method link in a specific calling context?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
bool ciMethod::will_link(ciKlass* accessing_klass,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
                         ciKlass* declared_method_holder,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
                         Bytecodes::Code bc) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   874
  if (!is_loaded()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   875
    // Method lookup failed.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   876
    return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   877
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   878
489c9b5090e2 Initial load
duke
parents:
diff changeset
   879
  // The link checks have been front-loaded into the get_method
489c9b5090e2 Initial load
duke
parents:
diff changeset
   880
  // call.  This method (ciMethod::will_link()) will be removed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   881
  // in the future.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   882
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
  return true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
// ciMethod::should_exclude
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
// Should this method be excluded from compilation?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
bool ciMethod::should_exclude() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
  methodHandle mh(THREAD, get_methodOop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
  bool ignore;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
  return CompilerOracle::should_exclude(mh, ignore);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
// ciMethod::should_inline
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
// Should this method be inlined during compilation?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
bool ciMethod::should_inline() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
  methodHandle mh(THREAD, get_methodOop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
  return CompilerOracle::should_inline(mh);
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_not_inline
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
// Should this method be disallowed from inlining during compilation?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
bool ciMethod::should_not_inline() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
  methodHandle mh(THREAD, get_methodOop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
  return CompilerOracle::should_not_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_print_assembly
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
// Should the compiler print the generated code for this method?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
bool ciMethod::should_print_assembly() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
  methodHandle mh(THREAD, get_methodOop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
  return CompilerOracle::should_print(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::break_at_execute
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
// Should the compiler insert a breakpoint into the generated code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
// method?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
bool ciMethod::break_at_execute() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
  methodHandle mh(THREAD, get_methodOop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
  return CompilerOracle::should_break_at(mh);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
// ciMethod::has_option
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
bool ciMethod::has_option(const char* option) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
  methodHandle mh(THREAD, get_methodOop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   950
  return CompilerOracle::has_option_string(mh, option);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   954
// ciMethod::can_be_compiled
489c9b5090e2 Initial load
duke
parents:
diff changeset
   955
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   956
// Have previous compilations of this method succeeded?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   957
bool ciMethod::can_be_compiled() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   958
  check_is_loaded();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   959
  ciEnv* env = CURRENT_ENV;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   960
  if (is_c1_compile(env->comp_level())) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   961
    return _is_c1_compilable;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   962
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   963
  return _is_c2_compilable;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   967
// ciMethod::set_not_compilable
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
// Tell the VM that this method cannot be compiled at all.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
void ciMethod::set_not_compilable() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
  VM_ENTRY_MARK;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   973
  ciEnv* env = CURRENT_ENV;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   974
  if (is_c1_compile(env->comp_level())) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   975
    _is_c1_compilable = false;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   976
  } else {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   977
    _is_c2_compilable = false;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   978
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   979
  get_methodOop()->set_not_compilable(env->comp_level());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
// ciMethod::can_be_osr_compiled
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
// Have previous compilations of this method succeeded?
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
// Implementation note: the VM does not currently keep track
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
// of failed OSR compilations per bci.  The entry_bci parameter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
// is currently unused.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
bool ciMethod::can_be_osr_compiled(int entry_bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
  VM_ENTRY_MARK;
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   993
  ciEnv* env = CURRENT_ENV;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   994
  return !get_methodOop()->is_not_osr_compilable(env->comp_level());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
489c9b5090e2 Initial load
duke
parents:
diff changeset
   997
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   998
// ciMethod::has_compiled_code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   999
bool ciMethod::has_compiled_code() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1000
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1001
  return get_methodOop()->code() != NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1002
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1003
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1004
int ciMethod::comp_level() {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1005
  check_is_loaded();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1006
  VM_ENTRY_MARK;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1007
  nmethod* nm = get_methodOop()->code();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1008
  if (nm != NULL) return nm->comp_level();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1009
  return 0;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1010
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1011
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
// ciMethod::instructions_size
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6187
diff changeset
  1014
//
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6187
diff changeset
  1015
// This is a rough metric for "fat" methods, compared before inlining
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6187
diff changeset
  1016
// with InlineSmallCode.  The CodeBlob::code_size accessor includes
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6187
diff changeset
  1017
// junk like exception handler, stubs, and constant table, which are
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6187
diff changeset
  1018
// not highly relevant to an inlined method.  So we use the more
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6187
diff changeset
  1019
// specific accessor nmethod::insts_size.
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1020
int ciMethod::instructions_size(int comp_level) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
  GUARDED_VM_ENTRY(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
    nmethod* code = get_methodOop()->code();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1023
    if (code != NULL && (comp_level == CompLevel_any || comp_level == code->comp_level())) {
6754
ab3f0dd8fe9f 6989368: Regression in scimark2.MonteCarlo in jdk7_b112 on Linux
iveresov
parents: 6744
diff changeset
  1024
      return code->insts_end() - code->verified_entry_point();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
    }
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
  1026
    return 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
  )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
// ciMethod::log_nmethod_identity
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1032
void ciMethod::log_nmethod_identity(xmlStream* log) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1033
  GUARDED_VM_ENTRY(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1034
    nmethod* code = get_methodOop()->code();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1035
    if (code != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1036
      code->log_identity(log);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1037
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
  )
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
// ciMethod::is_not_reached
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
bool ciMethod::is_not_reached(int bci) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
  return Interpreter::is_not_reached(
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
               methodHandle(THREAD, get_methodOop()), bci);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
// ciMethod::was_never_executed
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
bool ciMethod::was_executed_more_than(int times) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
  return get_methodOop()->was_executed_more_than(times);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
// ciMethod::has_unloaded_classes_in_signature
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
bool ciMethod::has_unloaded_classes_in_signature() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
    EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
    methodHandle m(THREAD, get_methodOop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
    bool has_unloaded = methodOopDesc::has_unloaded_classes_in_signature(m, (JavaThread *)THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
    if( HAS_PENDING_EXCEPTION ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
      CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
      return true;     // Declare that we may have unloaded classes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
    return has_unloaded;
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
// ciMethod::is_klass_loaded
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
bool ciMethod::is_klass_loaded(int refinfo_index, bool must_be_resolved) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
  return get_methodOop()->is_klass_loaded(refinfo_index, must_be_resolved);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
// ciMethod::check_call
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
bool ciMethod::check_call(int refinfo_index, bool is_static) const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
  VM_ENTRY_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
    EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
    HandleMark hm(THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
    constantPoolHandle pool (THREAD, get_methodOop()->constants());
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
    methodHandle spec_method;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
    KlassHandle  spec_klass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
    LinkResolver::resolve_method(spec_method, spec_klass, pool, refinfo_index, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
    if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
      CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
      return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
      return (spec_method->is_static() == is_static);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
  return false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
// ciMethod::print_codes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
// Print the bytecodes for this method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
void ciMethod::print_codes_on(outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
  GUARDED_VM_ENTRY(get_methodOop()->print_codes_on(st);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
#define FETCH_FLAG_FROM_VM(flag_accessor) { \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
  check_is_loaded(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1113
  VM_ENTRY_MARK; \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1114
  return get_methodOop()->flag_accessor(); \
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1115
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1116
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1117
bool ciMethod::is_empty_method() const {         FETCH_FLAG_FROM_VM(is_empty_method); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1118
bool ciMethod::is_vanilla_constructor() const {  FETCH_FLAG_FROM_VM(is_vanilla_constructor); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1119
bool ciMethod::has_loops      () const {         FETCH_FLAG_FROM_VM(has_loops); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1120
bool ciMethod::has_jsrs       () const {         FETCH_FLAG_FROM_VM(has_jsrs);  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1121
bool ciMethod::is_accessor    () const {         FETCH_FLAG_FROM_VM(is_accessor); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1122
bool ciMethod::is_initializer () const {         FETCH_FLAG_FROM_VM(is_initializer); }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1123
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1124
BCEscapeAnalyzer  *ciMethod::get_bcea() {
5928
f6e69b46e9e3 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 5702
diff changeset
  1125
#ifdef COMPILER2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1126
  if (_bcea == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1127
    _bcea = new (CURRENT_ENV->arena()) BCEscapeAnalyzer(this, NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1128
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1129
  return _bcea;
5928
f6e69b46e9e3 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 5702
diff changeset
  1130
#else // COMPILER2
f6e69b46e9e3 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 5702
diff changeset
  1131
  ShouldNotReachHere();
f6e69b46e9e3 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 5702
diff changeset
  1132
  return NULL;
f6e69b46e9e3 6968368: SIGSEGV in the BCEscapeAnalyzer::copy_dependencies
kvn
parents: 5702
diff changeset
  1133
#endif // COMPILER2
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1134
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1135
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1136
ciMethodBlocks  *ciMethod::get_method_blocks() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1137
  Arena *arena = CURRENT_ENV->arena();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1138
  if (_method_blocks == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1139
    _method_blocks = new (arena) ciMethodBlocks(arena, this);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1140
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1141
  return _method_blocks;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1142
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1143
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1144
#undef FETCH_FLAG_FROM_VM
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1145
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1146
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1147
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1148
// ciMethod::print_codes
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1149
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1150
// Print a range of the bytecodes for this method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
void ciMethod::print_codes_on(int from, int to, outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
  GUARDED_VM_ENTRY(get_methodOop()->print_codes_on(from, to, st);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1157
// ciMethod::print_name
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
// Print the name of this method, including signature and some flags.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
void ciMethod::print_name(outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
  GUARDED_VM_ENTRY(get_methodOop()->print_name(st);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1165
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
// ciMethod::print_short_name
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
// Print the name of this method, without signature.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
void ciMethod::print_short_name(outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
  check_is_loaded();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
  GUARDED_VM_ENTRY(get_methodOop()->print_short_name(st);)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
// ------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
// ciMethod::print_impl
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1177
// Implementation of the print method.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1178
void ciMethod::print_impl(outputStream* st) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1179
  ciObject::print_impl(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1180
  st->print(" name=");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
  name()->print_symbol_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1182
  st->print(" holder=");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1183
  holder()->print_name_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1184
  st->print(" signature=");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
  signature()->as_symbol()->print_symbol_on(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
  if (is_loaded()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
    st->print(" loaded=true flags=");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
    flags().print_member_flags(st);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
    st->print(" loaded=false");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
}