hotspot/src/share/vm/c1/c1_Runtime1.cpp
author iveresov
Thu, 02 Dec 2010 17:21:12 -0800
changeset 7432 f06f1253c317
parent 7427 d7b79a367474
child 7913 dd096a83bdbb
permissions -rw-r--r--
7003554: (tiered) assert(is_null_object() || handle() != NULL) failed: cannot embed null pointer Summary: C1 with profiling doesn't check whether the MDO has been really allocated, which can silently fail if the perm gen is full. The solution is to check if the allocation failed and bailout out of inlining or compilation. Reviewed-by: kvn, never
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4888
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: 4888
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 4888
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: 4888
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: 7106
diff changeset
    25
#include "precompiled.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    26
#include "asm/codeBuffer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    27
#include "c1/c1_CodeStubs.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    28
#include "c1/c1_Defs.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    29
#include "c1/c1_FrameMap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    30
#include "c1/c1_LIRAssembler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    31
#include "c1/c1_MacroAssembler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    32
#include "c1/c1_Runtime1.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    33
#include "classfile/systemDictionary.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    34
#include "classfile/vmSymbols.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    35
#include "code/codeBlob.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    36
#include "code/compiledIC.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    37
#include "code/pcDesc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    38
#include "code/scopeDesc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    39
#include "code/vtableStubs.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    40
#include "compiler/disassembler.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    41
#include "gc_interface/collectedHeap.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    42
#include "interpreter/bytecode.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    43
#include "interpreter/interpreter.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    44
#include "memory/allocation.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    45
#include "memory/barrierSet.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    46
#include "memory/oopFactory.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    47
#include "memory/resourceArea.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    48
#include "oops/objArrayKlass.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    49
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    50
#include "runtime/biasedLocking.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    51
#include "runtime/compilationPolicy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    52
#include "runtime/interfaceSupport.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    53
#include "runtime/javaCalls.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    54
#include "runtime/sharedRuntime.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    55
#include "runtime/threadCritical.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    56
#include "runtime/vframe.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    57
#include "runtime/vframeArray.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    58
#include "utilities/copy.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 7106
diff changeset
    59
#include "utilities/events.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
// Implementation of StubAssembler
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
StubAssembler::StubAssembler(CodeBuffer* code, const char * name, int stub_id) : C1_MacroAssembler(code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
  _name = name;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
  _must_gc_arguments = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    67
  _frame_size = no_frame_size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    68
  _num_rt_args = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
  _stub_id = stub_id;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
489c9b5090e2 Initial load
duke
parents:
diff changeset
    72
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
void StubAssembler::set_info(const char* name, bool must_gc_arguments) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  _name = name;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  _must_gc_arguments = must_gc_arguments;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
489c9b5090e2 Initial load
duke
parents:
diff changeset
    79
void StubAssembler::set_frame_size(int size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  if (_frame_size == no_frame_size) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    81
    _frame_size = size;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
  assert(_frame_size == size, "can't change the frame size");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
489c9b5090e2 Initial load
duke
parents:
diff changeset
    86
489c9b5090e2 Initial load
duke
parents:
diff changeset
    87
void StubAssembler::set_num_rt_args(int args) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    88
  if (_num_rt_args == 0) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
    _num_rt_args = args;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
  assert(_num_rt_args == args, "can't change the number of args");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
// Implementation of Runtime1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
CodeBlob* Runtime1::_blobs[Runtime1::number_of_ids];
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
const char *Runtime1::_blob_names[] = {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
  RUNTIME1_STUBS(STUB_NAME, LAST_STUB_NAME)
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
};
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
// statistics
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
int Runtime1::_generic_arraycopy_cnt = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
int Runtime1::_primitive_arraycopy_cnt = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
int Runtime1::_oop_arraycopy_cnt = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
int Runtime1::_arraycopy_slowcase_cnt = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
int Runtime1::_new_type_array_slowcase_cnt = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
int Runtime1::_new_object_array_slowcase_cnt = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
int Runtime1::_new_instance_slowcase_cnt = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
int Runtime1::_new_multi_array_slowcase_cnt = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
int Runtime1::_monitorenter_slowcase_cnt = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
int Runtime1::_monitorexit_slowcase_cnt = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
int Runtime1::_patch_code_slowcase_cnt = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
int Runtime1::_throw_range_check_exception_count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
int Runtime1::_throw_index_exception_count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
int Runtime1::_throw_div0_exception_count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
int Runtime1::_throw_null_pointer_exception_count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
int Runtime1::_throw_class_cast_exception_count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
int Runtime1::_throw_incompatible_class_change_error_count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
int Runtime1::_throw_array_store_exception_count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
int Runtime1::_throw_count = 0;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
// Simple helper to see if the caller of a runtime stub which
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
// entered the VM has been deoptimized
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
static bool caller_is_deopted() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
  JavaThread* thread = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
  RegisterMap reg_map(thread, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
  frame runtime_frame = thread->last_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
  frame caller_frame = runtime_frame.sender(&reg_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
  assert(caller_frame.is_compiled_frame(), "must be compiled");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
  return caller_frame.is_deoptimized_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
// Stress deoptimization
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
static void deopt_caller() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
  if ( !caller_is_deopted()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
    JavaThread* thread = JavaThread::current();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
    RegisterMap reg_map(thread, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
    frame runtime_frame = thread->last_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
    frame caller_frame = runtime_frame.sender(&reg_map);
4761
bdb7375a1fee 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 4571
diff changeset
   143
    Deoptimization::deoptimize_frame(thread, caller_frame.id());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
    assert(caller_is_deopted(), "Must be deoptimized");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   149
void Runtime1::generate_blob_for(BufferBlob* buffer_blob, StubID id) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
  assert(0 <= id && id < number_of_ids, "illegal stub id");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
  ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
  // create code buffer for code storage
6418
6671edbd230e 6978355: renaming for 6961697
twisti
parents: 6176
diff changeset
   153
  CodeBuffer code(buffer_blob);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   154
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   155
  Compilation::setup_code_buffer(&code, 0);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
  // create assembler for code generation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
  StubAssembler* sasm = new StubAssembler(&code, name_for(id), id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  // generate code for runtime stub
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
  OopMapSet* oop_maps;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
  oop_maps = generate_code_for(id, sasm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
  assert(oop_maps == NULL || sasm->frame_size() != no_frame_size,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
         "if stub has an oop map it must have a valid frame size");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
  // Make sure that stubs that need oopmaps have them
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
  switch (id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
    // These stubs don't need to have an oopmap
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
    case dtrace_object_alloc_id:
1374
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   170
    case g1_pre_barrier_slow_id:
4c24294029a9 6711316: Open source the Garbage-First garbage collector
ysr
parents: 360
diff changeset
   171
    case g1_post_barrier_slow_id:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
    case slow_subtype_check_id:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   173
    case fpu2long_stub_id:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
    case unwind_exception_id:
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   175
    case counter_overflow_id:
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5883
diff changeset
   176
#if defined(SPARC) || defined(PPC)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   177
    case handle_exception_nofpu_id:  // Unused on sparc
489c9b5090e2 Initial load
duke
parents:
diff changeset
   178
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   179
      break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
    // All other stubs should have oopmaps
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
    default:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
      assert(oop_maps != NULL, "must have an oopmap");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  // align so printing shows nop's instead of random code at the end (SimpleStubs are aligned)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  sasm->align(BytesPerWord);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   189
  // make sure all code is in code buffer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
  sasm->flush();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  // create blob - distinguish a few special cases
489c9b5090e2 Initial load
duke
parents:
diff changeset
   192
  CodeBlob* blob = RuntimeStub::new_runtime_stub(name_for(id),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
                                                 &code,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
                                                 CodeOffsets::frame_never_safe,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
                                                 sasm->frame_size(),
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
                                                 oop_maps,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
                                                 sasm->must_gc_arguments());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
  // install blob
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  assert(blob != NULL, "blob must exist");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  _blobs[id] = blob;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   204
void Runtime1::initialize(BufferBlob* blob) {
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   205
  // platform-dependent initialization
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   206
  initialize_pd();
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   207
  // generate stubs
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   208
  for (int id = 0; id < number_of_ids; id++) generate_blob_for(blob, (StubID)id);
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   209
  // printing
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   210
#ifndef PRODUCT
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   211
  if (PrintSimpleStubs) {
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   212
    ResourceMark rm;
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   213
    for (int id = 0; id < number_of_ids; id++) {
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   214
      _blobs[id]->print();
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   215
      if (_blobs[id]->oop_maps() != NULL) {
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   216
        _blobs[id]->oop_maps()->print();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   217
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   218
    }
5707
6c66849ed24e 6958292: C1: Enable parallel compilation
iveresov
parents: 5547
diff changeset
   219
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   220
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   221
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   222
489c9b5090e2 Initial load
duke
parents:
diff changeset
   223
489c9b5090e2 Initial load
duke
parents:
diff changeset
   224
CodeBlob* Runtime1::blob_for(StubID id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   225
  assert(0 <= id && id < number_of_ids, "illegal stub id");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   226
  return _blobs[id];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   227
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   228
489c9b5090e2 Initial load
duke
parents:
diff changeset
   229
489c9b5090e2 Initial load
duke
parents:
diff changeset
   230
const char* Runtime1::name_for(StubID id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   231
  assert(0 <= id && id < number_of_ids, "illegal stub id");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   232
  return _blob_names[id];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   233
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   234
489c9b5090e2 Initial load
duke
parents:
diff changeset
   235
const char* Runtime1::name_for_address(address entry) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   236
  for (int id = 0; id < number_of_ids; id++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   237
    if (entry == entry_for((StubID)id)) return name_for((StubID)id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   238
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   239
489c9b5090e2 Initial load
duke
parents:
diff changeset
   240
#define FUNCTION_CASE(a, f) \
489c9b5090e2 Initial load
duke
parents:
diff changeset
   241
  if ((intptr_t)a == CAST_FROM_FN_PTR(intptr_t, f))  return #f
489c9b5090e2 Initial load
duke
parents:
diff changeset
   242
489c9b5090e2 Initial load
duke
parents:
diff changeset
   243
  FUNCTION_CASE(entry, os::javaTimeMillis);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   244
  FUNCTION_CASE(entry, os::javaTimeNanos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   245
  FUNCTION_CASE(entry, SharedRuntime::OSR_migration_end);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   246
  FUNCTION_CASE(entry, SharedRuntime::d2f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   247
  FUNCTION_CASE(entry, SharedRuntime::d2i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   248
  FUNCTION_CASE(entry, SharedRuntime::d2l);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   249
  FUNCTION_CASE(entry, SharedRuntime::dcos);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   250
  FUNCTION_CASE(entry, SharedRuntime::dexp);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   251
  FUNCTION_CASE(entry, SharedRuntime::dlog);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   252
  FUNCTION_CASE(entry, SharedRuntime::dlog10);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   253
  FUNCTION_CASE(entry, SharedRuntime::dpow);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   254
  FUNCTION_CASE(entry, SharedRuntime::drem);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   255
  FUNCTION_CASE(entry, SharedRuntime::dsin);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   256
  FUNCTION_CASE(entry, SharedRuntime::dtan);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   257
  FUNCTION_CASE(entry, SharedRuntime::f2i);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   258
  FUNCTION_CASE(entry, SharedRuntime::f2l);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   259
  FUNCTION_CASE(entry, SharedRuntime::frem);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   260
  FUNCTION_CASE(entry, SharedRuntime::l2d);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   261
  FUNCTION_CASE(entry, SharedRuntime::l2f);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   262
  FUNCTION_CASE(entry, SharedRuntime::ldiv);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   263
  FUNCTION_CASE(entry, SharedRuntime::lmul);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   264
  FUNCTION_CASE(entry, SharedRuntime::lrem);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   265
  FUNCTION_CASE(entry, SharedRuntime::lrem);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   266
  FUNCTION_CASE(entry, SharedRuntime::dtrace_method_entry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   267
  FUNCTION_CASE(entry, SharedRuntime::dtrace_method_exit);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   268
  FUNCTION_CASE(entry, trace_block_entry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   269
489c9b5090e2 Initial load
duke
parents:
diff changeset
   270
#undef FUNCTION_CASE
489c9b5090e2 Initial load
duke
parents:
diff changeset
   271
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5883
diff changeset
   272
  // Soft float adds more runtime names.
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5883
diff changeset
   273
  return pd_name_for_address(entry);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   274
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   275
489c9b5090e2 Initial load
duke
parents:
diff changeset
   276
489c9b5090e2 Initial load
duke
parents:
diff changeset
   277
JRT_ENTRY(void, Runtime1::new_instance(JavaThread* thread, klassOopDesc* klass))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   278
  NOT_PRODUCT(_new_instance_slowcase_cnt++;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   279
489c9b5090e2 Initial load
duke
parents:
diff changeset
   280
  assert(oop(klass)->is_klass(), "not a class");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   281
  instanceKlassHandle h(thread, klass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   282
  h->check_valid_for_instantiation(true, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   283
  // make sure klass is initialized
489c9b5090e2 Initial load
duke
parents:
diff changeset
   284
  h->initialize(CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   285
  // allocate instance and return via TLS
489c9b5090e2 Initial load
duke
parents:
diff changeset
   286
  oop obj = h->allocate_instance(CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   287
  thread->set_vm_result(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   288
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   289
489c9b5090e2 Initial load
duke
parents:
diff changeset
   290
489c9b5090e2 Initial load
duke
parents:
diff changeset
   291
JRT_ENTRY(void, Runtime1::new_type_array(JavaThread* thread, klassOopDesc* klass, jint length))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   292
  NOT_PRODUCT(_new_type_array_slowcase_cnt++;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   293
  // Note: no handle for klass needed since they are not used
489c9b5090e2 Initial load
duke
parents:
diff changeset
   294
  //       anymore after new_typeArray() and no GC can happen before.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   295
  //       (This may have to change if this code changes!)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   296
  assert(oop(klass)->is_klass(), "not a class");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   297
  BasicType elt_type = typeArrayKlass::cast(klass)->element_type();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   298
  oop obj = oopFactory::new_typeArray(elt_type, length, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   299
  thread->set_vm_result(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   300
  // This is pretty rare but this runtime patch is stressful to deoptimization
489c9b5090e2 Initial load
duke
parents:
diff changeset
   301
  // if we deoptimize here so force a deopt to stress the path.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   302
  if (DeoptimizeALot) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   303
    deopt_caller();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   304
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   305
489c9b5090e2 Initial load
duke
parents:
diff changeset
   306
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   307
489c9b5090e2 Initial load
duke
parents:
diff changeset
   308
489c9b5090e2 Initial load
duke
parents:
diff changeset
   309
JRT_ENTRY(void, Runtime1::new_object_array(JavaThread* thread, klassOopDesc* array_klass, jint length))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   310
  NOT_PRODUCT(_new_object_array_slowcase_cnt++;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   311
489c9b5090e2 Initial load
duke
parents:
diff changeset
   312
  // Note: no handle for klass needed since they are not used
489c9b5090e2 Initial load
duke
parents:
diff changeset
   313
  //       anymore after new_objArray() and no GC can happen before.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   314
  //       (This may have to change if this code changes!)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   315
  assert(oop(array_klass)->is_klass(), "not a class");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   316
  klassOop elem_klass = objArrayKlass::cast(array_klass)->element_klass();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   317
  objArrayOop obj = oopFactory::new_objArray(elem_klass, length, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   318
  thread->set_vm_result(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   319
  // This is pretty rare but this runtime patch is stressful to deoptimization
489c9b5090e2 Initial load
duke
parents:
diff changeset
   320
  // if we deoptimize here so force a deopt to stress the path.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   321
  if (DeoptimizeALot) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   322
    deopt_caller();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   323
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   324
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   325
489c9b5090e2 Initial load
duke
parents:
diff changeset
   326
489c9b5090e2 Initial load
duke
parents:
diff changeset
   327
JRT_ENTRY(void, Runtime1::new_multi_array(JavaThread* thread, klassOopDesc* klass, int rank, jint* dims))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   328
  NOT_PRODUCT(_new_multi_array_slowcase_cnt++;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   329
489c9b5090e2 Initial load
duke
parents:
diff changeset
   330
  assert(oop(klass)->is_klass(), "not a class");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   331
  assert(rank >= 1, "rank must be nonzero");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   332
  oop obj = arrayKlass::cast(klass)->multi_allocate(rank, dims, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   333
  thread->set_vm_result(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   334
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   335
489c9b5090e2 Initial load
duke
parents:
diff changeset
   336
489c9b5090e2 Initial load
duke
parents:
diff changeset
   337
JRT_ENTRY(void, Runtime1::unimplemented_entry(JavaThread* thread, StubID id))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   338
  tty->print_cr("Runtime1::entry_for(%d) returned unimplemented entry point", id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   339
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   340
489c9b5090e2 Initial load
duke
parents:
diff changeset
   341
489c9b5090e2 Initial load
duke
parents:
diff changeset
   342
JRT_ENTRY(void, Runtime1::throw_array_store_exception(JavaThread* thread))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   343
  THROW(vmSymbolHandles::java_lang_ArrayStoreException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   344
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   345
489c9b5090e2 Initial load
duke
parents:
diff changeset
   346
489c9b5090e2 Initial load
duke
parents:
diff changeset
   347
JRT_ENTRY(void, Runtime1::post_jvmti_exception_throw(JavaThread* thread))
4761
bdb7375a1fee 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 4571
diff changeset
   348
  if (JvmtiExport::can_post_on_exceptions()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   349
    vframeStream vfst(thread, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   350
    address bcp = vfst.method()->bcp_from(vfst.bci());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   351
    JvmtiExport::post_exception_throw(thread, vfst.method(), bcp, thread->exception_oop());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   352
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   353
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   354
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   355
// This is a helper to allow us to safepoint but allow the outer entry
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   356
// to be safepoint free if we need to do an osr
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   357
static nmethod* counter_overflow_helper(JavaThread* THREAD, int branch_bci, methodOopDesc* m) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   358
  nmethod* osr_nm = NULL;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   359
  methodHandle method(THREAD, m);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   360
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   361
  RegisterMap map(THREAD, false);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   362
  frame fr =  THREAD->last_frame().sender(&map);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   363
  nmethod* nm = (nmethod*) fr.cb();
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   364
  assert(nm!= NULL && nm->is_nmethod(), "Sanity check");
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   365
  methodHandle enclosing_method(THREAD, nm->method());
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   366
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   367
  CompLevel level = (CompLevel)nm->comp_level();
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   368
  int bci = InvocationEntryBci;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   369
  if (branch_bci != InvocationEntryBci) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   370
    // Compute desination bci
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   371
    address pc = method()->code_base() + branch_bci;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   372
    Bytecodes::Code branch = Bytecodes::code_at(pc, method());
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   373
    int offset = 0;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   374
    switch (branch) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   375
      case Bytecodes::_if_icmplt: case Bytecodes::_iflt:
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   376
      case Bytecodes::_if_icmpgt: case Bytecodes::_ifgt:
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   377
      case Bytecodes::_if_icmple: case Bytecodes::_ifle:
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   378
      case Bytecodes::_if_icmpge: case Bytecodes::_ifge:
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   379
      case Bytecodes::_if_icmpeq: case Bytecodes::_if_acmpeq: case Bytecodes::_ifeq:
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   380
      case Bytecodes::_if_icmpne: case Bytecodes::_if_acmpne: case Bytecodes::_ifne:
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   381
      case Bytecodes::_ifnull: case Bytecodes::_ifnonnull: case Bytecodes::_goto:
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   382
        offset = (int16_t)Bytes::get_Java_u2(pc + 1);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   383
        break;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   384
      case Bytecodes::_goto_w:
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   385
        offset = Bytes::get_Java_u4(pc + 1);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   386
        break;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   387
      default: ;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   388
    }
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   389
    bci = branch_bci + offset;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   390
  }
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   391
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   392
  osr_nm = CompilationPolicy::policy()->event(enclosing_method, method, branch_bci, bci, level, THREAD);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   393
  return osr_nm;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   394
}
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   395
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   396
JRT_BLOCK_ENTRY(address, Runtime1::counter_overflow(JavaThread* thread, int bci, methodOopDesc* method))
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   397
  nmethod* osr_nm;
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   398
  JRT_BLOCK
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   399
    osr_nm = counter_overflow_helper(thread, bci, method);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   400
    if (osr_nm != NULL) {
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   401
      RegisterMap map(thread, false);
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   402
      frame fr =  thread->last_frame().sender(&map);
7106
867c9d296c6b 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 6453
diff changeset
   403
      Deoptimization::deoptimize_frame(thread, fr.id());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   404
    }
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   405
  JRT_BLOCK_END
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   406
  return NULL;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   407
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   408
489c9b5090e2 Initial load
duke
parents:
diff changeset
   409
extern void vm_exit(int code);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   410
489c9b5090e2 Initial load
duke
parents:
diff changeset
   411
// Enter this method from compiled code handler below. This is where we transition
489c9b5090e2 Initial load
duke
parents:
diff changeset
   412
// to VM mode. This is done as a helper routine so that the method called directly
489c9b5090e2 Initial load
duke
parents:
diff changeset
   413
// from compiled code does not have to transition to VM. This allows the entry
489c9b5090e2 Initial load
duke
parents:
diff changeset
   414
// method to see if the nmethod that we have just looked up a handler for has
489c9b5090e2 Initial load
duke
parents:
diff changeset
   415
// been deoptimized while we were in the vm. This simplifies the assembly code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   416
// cpu directories.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   417
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   418
// We are entering here from exception stub (via the entry method below)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   419
// If there is a compiled exception handler in this method, we will continue there;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   420
// otherwise we will unwind the stack and continue at the caller of top frame method
489c9b5090e2 Initial load
duke
parents:
diff changeset
   421
// Note: we enter in Java using a special JRT wrapper. This wrapper allows us to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   422
// control the area where we can allow a safepoint. After we exit the safepoint area we can
489c9b5090e2 Initial load
duke
parents:
diff changeset
   423
// check to see if the handler we are going to return is now in a nmethod that has
489c9b5090e2 Initial load
duke
parents:
diff changeset
   424
// been deoptimized. If that is the case we return the deopt blob
489c9b5090e2 Initial load
duke
parents:
diff changeset
   425
// unpack_with_exception entry instead. This makes life for the exception blob easier
489c9b5090e2 Initial load
duke
parents:
diff changeset
   426
// because making that same check and diverting is painful from assembly language.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   427
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   428
489c9b5090e2 Initial load
duke
parents:
diff changeset
   429
489c9b5090e2 Initial load
duke
parents:
diff changeset
   430
JRT_ENTRY_NO_ASYNC(static address, exception_handler_for_pc_helper(JavaThread* thread, oopDesc* ex, address pc, nmethod*& nm))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   431
489c9b5090e2 Initial load
duke
parents:
diff changeset
   432
  Handle exception(thread, ex);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   433
  nm = CodeCache::find_nmethod(pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   434
  assert(nm != NULL, "this is not an nmethod");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   435
  // Adjust the pc as needed/
489c9b5090e2 Initial load
duke
parents:
diff changeset
   436
  if (nm->is_deopt_pc(pc)) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   437
    RegisterMap map(thread, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   438
    frame exception_frame = thread->last_frame().sender(&map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   439
    // if the frame isn't deopted then pc must not correspond to the caller of last_frame
489c9b5090e2 Initial load
duke
parents:
diff changeset
   440
    assert(exception_frame.is_deoptimized_frame(), "must be deopted");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   441
    pc = exception_frame.pc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   442
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   443
#ifdef ASSERT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   444
  assert(exception.not_null(), "NULL exceptions should be handled by throw_exception");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   445
  assert(exception->is_oop(), "just checking");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   446
  // Check that exception is a subclass of Throwable, otherwise we have a VerifyError
4571
80b553bddc26 6914300: ciEnv should export all well known classes
never
parents: 2105
diff changeset
   447
  if (!(exception->is_a(SystemDictionary::Throwable_klass()))) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   448
    if (ExitVMOnVerifyError) vm_exit(-1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   449
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   450
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   451
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   452
489c9b5090e2 Initial load
duke
parents:
diff changeset
   453
  // Check the stack guard pages and reenable them if necessary and there is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   454
  // enough space on the stack to do so.  Use fast exceptions only if the guard
489c9b5090e2 Initial load
duke
parents:
diff changeset
   455
  // pages are enabled.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   456
  bool guard_pages_enabled = thread->stack_yellow_zone_enabled();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   457
  if (!guard_pages_enabled) guard_pages_enabled = thread->reguard_stack();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   458
4761
bdb7375a1fee 6902182: 4/4 Starting with jdwp agent should not incur performance penalty
dcubed
parents: 4571
diff changeset
   459
  if (JvmtiExport::can_post_on_exceptions()) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   460
    // To ensure correct notification of exception catches and throws
489c9b5090e2 Initial load
duke
parents:
diff changeset
   461
    // we have to deoptimize here.  If we attempted to notify the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   462
    // catches and throws during this exception lookup it's possible
489c9b5090e2 Initial load
duke
parents:
diff changeset
   463
    // we could deoptimize on the way out of the VM and end back in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   464
    // the interpreter at the throw site.  This would result in double
489c9b5090e2 Initial load
duke
parents:
diff changeset
   465
    // notifications since the interpreter would also notify about
489c9b5090e2 Initial load
duke
parents:
diff changeset
   466
    // these same catches and throws as it unwound the frame.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   467
489c9b5090e2 Initial load
duke
parents:
diff changeset
   468
    RegisterMap reg_map(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   469
    frame stub_frame = thread->last_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   470
    frame caller_frame = stub_frame.sender(&reg_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   471
489c9b5090e2 Initial load
duke
parents:
diff changeset
   472
    // We don't really want to deoptimize the nmethod itself since we
489c9b5090e2 Initial load
duke
parents:
diff changeset
   473
    // can actually continue in the exception handler ourselves but I
489c9b5090e2 Initial load
duke
parents:
diff changeset
   474
    // don't see an easy way to have the desired effect.
7106
867c9d296c6b 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 6453
diff changeset
   475
    Deoptimization::deoptimize_frame(thread, caller_frame.id());
867c9d296c6b 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 6453
diff changeset
   476
    assert(caller_is_deopted(), "Must be deoptimized");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   477
489c9b5090e2 Initial load
duke
parents:
diff changeset
   478
    return SharedRuntime::deopt_blob()->unpack_with_exception_in_tls();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   479
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   480
489c9b5090e2 Initial load
duke
parents:
diff changeset
   481
  // ExceptionCache is used only for exceptions at call and not for implicit exceptions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   482
  if (guard_pages_enabled) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   483
    address fast_continuation = nm->handler_for_exception_and_pc(exception, pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   484
    if (fast_continuation != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   485
      if (fast_continuation == ExceptionCache::unwind_handler()) fast_continuation = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   486
      return fast_continuation;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   487
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   488
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   489
489c9b5090e2 Initial load
duke
parents:
diff changeset
   490
  // If the stack guard pages are enabled, check whether there is a handler in
489c9b5090e2 Initial load
duke
parents:
diff changeset
   491
  // the current method.  Otherwise (guard pages disabled), force an unwind and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   492
  // skip the exception cache update (i.e., just leave continuation==NULL).
489c9b5090e2 Initial load
duke
parents:
diff changeset
   493
  address continuation = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   494
  if (guard_pages_enabled) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   495
489c9b5090e2 Initial load
duke
parents:
diff changeset
   496
    // New exception handling mechanism can support inlined methods
489c9b5090e2 Initial load
duke
parents:
diff changeset
   497
    // with exception handlers since the mappings are from PC to PC
489c9b5090e2 Initial load
duke
parents:
diff changeset
   498
489c9b5090e2 Initial load
duke
parents:
diff changeset
   499
    // debugging support
489c9b5090e2 Initial load
duke
parents:
diff changeset
   500
    // tracing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   501
    if (TraceExceptions) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   502
      ttyLocker ttyl;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   503
      ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   504
      tty->print_cr("Exception <%s> (0x%x) thrown in compiled method <%s> at PC " PTR_FORMAT " for thread 0x%x",
489c9b5090e2 Initial load
duke
parents:
diff changeset
   505
                    exception->print_value_string(), (address)exception(), nm->method()->print_value_string(), pc, thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   506
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   507
    // for AbortVMOnException flag
489c9b5090e2 Initial load
duke
parents:
diff changeset
   508
    NOT_PRODUCT(Exceptions::debug_check_abort(exception));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   509
489c9b5090e2 Initial load
duke
parents:
diff changeset
   510
    // Clear out the exception oop and pc since looking up an
489c9b5090e2 Initial load
duke
parents:
diff changeset
   511
    // exception handler can cause class loading, which might throw an
489c9b5090e2 Initial load
duke
parents:
diff changeset
   512
    // exception and those fields are expected to be clear during
489c9b5090e2 Initial load
duke
parents:
diff changeset
   513
    // normal bytecode execution.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   514
    thread->set_exception_oop(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   515
    thread->set_exception_pc(NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   516
489c9b5090e2 Initial load
duke
parents:
diff changeset
   517
    continuation = SharedRuntime::compute_compiled_exc_handler(nm, pc, exception, false, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   518
    // If an exception was thrown during exception dispatch, the exception oop may have changed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   519
    thread->set_exception_oop(exception());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   520
    thread->set_exception_pc(pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   521
489c9b5090e2 Initial load
duke
parents:
diff changeset
   522
    // the exception cache is used only by non-implicit exceptions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   523
    if (continuation == NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   524
      nm->add_handler_for_exception_and_pc(exception, pc, ExceptionCache::unwind_handler());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   525
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   526
      nm->add_handler_for_exception_and_pc(exception, pc, continuation);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   527
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   528
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   529
489c9b5090e2 Initial load
duke
parents:
diff changeset
   530
  thread->set_vm_result(exception());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   531
489c9b5090e2 Initial load
duke
parents:
diff changeset
   532
  if (TraceExceptions) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   533
    ttyLocker ttyl;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   534
    ResourceMark rm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   535
    tty->print_cr("Thread " PTR_FORMAT " continuing at PC " PTR_FORMAT " for exception thrown at PC " PTR_FORMAT,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   536
                  thread, continuation, pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   537
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   538
489c9b5090e2 Initial load
duke
parents:
diff changeset
   539
  return continuation;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   540
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   541
489c9b5090e2 Initial load
duke
parents:
diff changeset
   542
// Enter this method from compiled code only if there is a Java exception handler
489c9b5090e2 Initial load
duke
parents:
diff changeset
   543
// in the method handling the exception
489c9b5090e2 Initial load
duke
parents:
diff changeset
   544
// We are entering here from exception stub. We don't do a normal VM transition here.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   545
// We do it in a helper. This is so we can check to see if the nmethod we have just
489c9b5090e2 Initial load
duke
parents:
diff changeset
   546
// searched for an exception handler has been deoptimized in the meantime.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   547
address  Runtime1::exception_handler_for_pc(JavaThread* thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   548
  oop exception = thread->exception_oop();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   549
  address pc = thread->exception_pc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   550
  // Still in Java mode
489c9b5090e2 Initial load
duke
parents:
diff changeset
   551
  debug_only(ResetNoHandleMark rnhm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   552
  nmethod* nm = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   553
  address continuation = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   554
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   555
    // Enter VM mode by calling the helper
489c9b5090e2 Initial load
duke
parents:
diff changeset
   556
489c9b5090e2 Initial load
duke
parents:
diff changeset
   557
    ResetNoHandleMark rnhm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   558
    continuation = exception_handler_for_pc_helper(thread, exception, pc, nm);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   559
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   560
  // Back in JAVA, use no oops DON'T safepoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
   561
489c9b5090e2 Initial load
duke
parents:
diff changeset
   562
  // Now check to see if the nmethod we were called from is now deoptimized.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   563
  // If so we must return to the deopt blob and deoptimize the nmethod
489c9b5090e2 Initial load
duke
parents:
diff changeset
   564
489c9b5090e2 Initial load
duke
parents:
diff changeset
   565
  if (nm != NULL && caller_is_deopted()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   566
    continuation = SharedRuntime::deopt_blob()->unpack_with_exception_in_tls();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   567
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   568
489c9b5090e2 Initial load
duke
parents:
diff changeset
   569
  return continuation;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   570
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   571
489c9b5090e2 Initial load
duke
parents:
diff changeset
   572
489c9b5090e2 Initial load
duke
parents:
diff changeset
   573
JRT_ENTRY(void, Runtime1::throw_range_check_exception(JavaThread* thread, int index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   574
  NOT_PRODUCT(_throw_range_check_exception_count++;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   575
  Events::log("throw_range_check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   576
  char message[jintAsStringSize];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   577
  sprintf(message, "%d", index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   578
  SharedRuntime::throw_and_post_jvmti_exception(thread, vmSymbols::java_lang_ArrayIndexOutOfBoundsException(), message);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   579
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   580
489c9b5090e2 Initial load
duke
parents:
diff changeset
   581
489c9b5090e2 Initial load
duke
parents:
diff changeset
   582
JRT_ENTRY(void, Runtime1::throw_index_exception(JavaThread* thread, int index))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   583
  NOT_PRODUCT(_throw_index_exception_count++;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   584
  Events::log("throw_index");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   585
  char message[16];
489c9b5090e2 Initial load
duke
parents:
diff changeset
   586
  sprintf(message, "%d", index);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   587
  SharedRuntime::throw_and_post_jvmti_exception(thread, vmSymbols::java_lang_IndexOutOfBoundsException(), message);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   588
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   589
489c9b5090e2 Initial load
duke
parents:
diff changeset
   590
489c9b5090e2 Initial load
duke
parents:
diff changeset
   591
JRT_ENTRY(void, Runtime1::throw_div0_exception(JavaThread* thread))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   592
  NOT_PRODUCT(_throw_div0_exception_count++;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   593
  SharedRuntime::throw_and_post_jvmti_exception(thread, vmSymbols::java_lang_ArithmeticException(), "/ by zero");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   594
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   595
489c9b5090e2 Initial load
duke
parents:
diff changeset
   596
489c9b5090e2 Initial load
duke
parents:
diff changeset
   597
JRT_ENTRY(void, Runtime1::throw_null_pointer_exception(JavaThread* thread))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   598
  NOT_PRODUCT(_throw_null_pointer_exception_count++;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   599
  SharedRuntime::throw_and_post_jvmti_exception(thread, vmSymbols::java_lang_NullPointerException());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   600
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   601
489c9b5090e2 Initial load
duke
parents:
diff changeset
   602
489c9b5090e2 Initial load
duke
parents:
diff changeset
   603
JRT_ENTRY(void, Runtime1::throw_class_cast_exception(JavaThread* thread, oopDesc* object))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   604
  NOT_PRODUCT(_throw_class_cast_exception_count++;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   605
  ResourceMark rm(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   606
  char* message = SharedRuntime::generate_class_cast_message(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   607
    thread, Klass::cast(object->klass())->external_name());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   608
  SharedRuntime::throw_and_post_jvmti_exception(
489c9b5090e2 Initial load
duke
parents:
diff changeset
   609
    thread, vmSymbols::java_lang_ClassCastException(), message);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   610
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   611
489c9b5090e2 Initial load
duke
parents:
diff changeset
   612
489c9b5090e2 Initial load
duke
parents:
diff changeset
   613
JRT_ENTRY(void, Runtime1::throw_incompatible_class_change_error(JavaThread* thread))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   614
  NOT_PRODUCT(_throw_incompatible_class_change_error_count++;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   615
  ResourceMark rm(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   616
  SharedRuntime::throw_and_post_jvmti_exception(thread, vmSymbols::java_lang_IncompatibleClassChangeError());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   617
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   618
489c9b5090e2 Initial load
duke
parents:
diff changeset
   619
489c9b5090e2 Initial load
duke
parents:
diff changeset
   620
JRT_ENTRY_NO_ASYNC(void, Runtime1::monitorenter(JavaThread* thread, oopDesc* obj, BasicObjectLock* lock))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   621
  NOT_PRODUCT(_monitorenter_slowcase_cnt++;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   622
  if (PrintBiasedLockingStatistics) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   623
    Atomic::inc(BiasedLocking::slow_path_entry_count_addr());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   624
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   625
  Handle h_obj(thread, obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   626
  assert(h_obj()->is_oop(), "must be NULL or an object");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   627
  if (UseBiasedLocking) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   628
    // Retry fast entry if bias is revoked to avoid unnecessary inflation
489c9b5090e2 Initial load
duke
parents:
diff changeset
   629
    ObjectSynchronizer::fast_enter(h_obj, lock->lock(), true, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   630
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   631
    if (UseFastLocking) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   632
      // When using fast locking, the compiled code has already tried the fast case
489c9b5090e2 Initial load
duke
parents:
diff changeset
   633
      assert(obj == lock->obj(), "must match");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   634
      ObjectSynchronizer::slow_enter(h_obj, lock->lock(), THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   635
    } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   636
      lock->set_obj(obj);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   637
      ObjectSynchronizer::fast_enter(h_obj, lock->lock(), false, THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   638
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   639
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   640
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   641
489c9b5090e2 Initial load
duke
parents:
diff changeset
   642
489c9b5090e2 Initial load
duke
parents:
diff changeset
   643
JRT_LEAF(void, Runtime1::monitorexit(JavaThread* thread, BasicObjectLock* lock))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   644
  NOT_PRODUCT(_monitorexit_slowcase_cnt++;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   645
  assert(thread == JavaThread::current(), "threads must correspond");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   646
  assert(thread->last_Java_sp(), "last_Java_sp must be set");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   647
  // monitorexit is non-blocking (leaf routine) => no exceptions can be thrown
489c9b5090e2 Initial load
duke
parents:
diff changeset
   648
  EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   649
489c9b5090e2 Initial load
duke
parents:
diff changeset
   650
  oop obj = lock->obj();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   651
  assert(obj->is_oop(), "must be NULL or an object");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   652
  if (UseFastLocking) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   653
    // When using fast locking, the compiled code has already tried the fast case
489c9b5090e2 Initial load
duke
parents:
diff changeset
   654
    ObjectSynchronizer::slow_exit(obj, lock->lock(), THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   655
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   656
    ObjectSynchronizer::fast_exit(obj, lock->lock(), THREAD);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   657
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   658
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
   659
489c9b5090e2 Initial load
duke
parents:
diff changeset
   660
489c9b5090e2 Initial load
duke
parents:
diff changeset
   661
static klassOop resolve_field_return_klass(methodHandle caller, int bci, TRAPS) {
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5707
diff changeset
   662
  Bytecode_field* field_access = Bytecode_field_at(caller, bci);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   663
  // This can be static or non-static field access
489c9b5090e2 Initial load
duke
parents:
diff changeset
   664
  Bytecodes::Code code       = field_access->code();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   665
489c9b5090e2 Initial load
duke
parents:
diff changeset
   666
  // We must load class, initialize class and resolvethe field
489c9b5090e2 Initial load
duke
parents:
diff changeset
   667
  FieldAccessInfo result; // initialize class if needed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   668
  constantPoolHandle constants(THREAD, caller->constants());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   669
  LinkResolver::resolve_field(result, constants, field_access->index(), Bytecodes::java_code(code), false, CHECK_NULL);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   670
  return result.klass()();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   671
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   672
489c9b5090e2 Initial load
duke
parents:
diff changeset
   673
489c9b5090e2 Initial load
duke
parents:
diff changeset
   674
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   675
// This routine patches sites where a class wasn't loaded or
489c9b5090e2 Initial load
duke
parents:
diff changeset
   676
// initialized at the time the code was generated.  It handles
489c9b5090e2 Initial load
duke
parents:
diff changeset
   677
// references to classes, fields and forcing of initialization.  Most
489c9b5090e2 Initial load
duke
parents:
diff changeset
   678
// of the cases are straightforward and involving simply forcing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   679
// resolution of a class, rewriting the instruction stream with the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   680
// needed constant and replacing the call in this function with the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   681
// patched code.  The case for static field is more complicated since
489c9b5090e2 Initial load
duke
parents:
diff changeset
   682
// the thread which is in the process of initializing a class can
489c9b5090e2 Initial load
duke
parents:
diff changeset
   683
// access it's static fields but other threads can't so the code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   684
// either has to deoptimize when this case is detected or execute a
489c9b5090e2 Initial load
duke
parents:
diff changeset
   685
// check that the current thread is the initializing thread.  The
489c9b5090e2 Initial load
duke
parents:
diff changeset
   686
// current
489c9b5090e2 Initial load
duke
parents:
diff changeset
   687
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   688
// Patches basically look like this:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   689
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   690
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   691
// patch_site: jmp patch stub     ;; will be patched
489c9b5090e2 Initial load
duke
parents:
diff changeset
   692
// continue:   ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   693
//             ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   694
//             ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   695
//             ...
489c9b5090e2 Initial load
duke
parents:
diff changeset
   696
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   697
// They have a stub which looks like this:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   698
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   699
//             ;; patch body
489c9b5090e2 Initial load
duke
parents:
diff changeset
   700
//             movl <const>, reg           (for class constants)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   701
//        <or> movl [reg1 + <const>], reg  (for field offsets)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   702
//        <or> movl reg, [reg1 + <const>]  (for field offsets)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   703
//             <being_init offset> <bytes to copy> <bytes to skip>
489c9b5090e2 Initial load
duke
parents:
diff changeset
   704
// patch_stub: call Runtime1::patch_code (through a runtime stub)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   705
//             jmp patch_site
489c9b5090e2 Initial load
duke
parents:
diff changeset
   706
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   707
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   708
// A normal patch is done by rewriting the patch body, usually a move,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   709
// and then copying it into place over top of the jmp instruction
489c9b5090e2 Initial load
duke
parents:
diff changeset
   710
// being careful to flush caches and doing it in an MP-safe way.  The
489c9b5090e2 Initial load
duke
parents:
diff changeset
   711
// constants following the patch body are used to find various pieces
489c9b5090e2 Initial load
duke
parents:
diff changeset
   712
// of the patch relative to the call site for Runtime1::patch_code.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   713
// The case for getstatic and putstatic is more complicated because
489c9b5090e2 Initial load
duke
parents:
diff changeset
   714
// getstatic and putstatic have special semantics when executing while
489c9b5090e2 Initial load
duke
parents:
diff changeset
   715
// the class is being initialized.  getstatic/putstatic on a class
489c9b5090e2 Initial load
duke
parents:
diff changeset
   716
// which is being_initialized may be executed by the initializing
489c9b5090e2 Initial load
duke
parents:
diff changeset
   717
// thread but other threads have to block when they execute it.  This
489c9b5090e2 Initial load
duke
parents:
diff changeset
   718
// is accomplished in compiled code by executing a test of the current
489c9b5090e2 Initial load
duke
parents:
diff changeset
   719
// thread against the initializing thread of the class.  It's emitted
489c9b5090e2 Initial load
duke
parents:
diff changeset
   720
// as boilerplate in their stub which allows the patched code to be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   721
// executed before it's copied back into the main body of the nmethod.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   722
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   723
// being_init: get_thread(<tmp reg>
489c9b5090e2 Initial load
duke
parents:
diff changeset
   724
//             cmpl [reg1 + <init_thread_offset>], <tmp reg>
489c9b5090e2 Initial load
duke
parents:
diff changeset
   725
//             jne patch_stub
489c9b5090e2 Initial load
duke
parents:
diff changeset
   726
//             movl [reg1 + <const>], reg  (for field offsets)  <or>
489c9b5090e2 Initial load
duke
parents:
diff changeset
   727
//             movl reg, [reg1 + <const>]  (for field offsets)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   728
//             jmp continue
489c9b5090e2 Initial load
duke
parents:
diff changeset
   729
//             <being_init offset> <bytes to copy> <bytes to skip>
489c9b5090e2 Initial load
duke
parents:
diff changeset
   730
// patch_stub: jmp Runtim1::patch_code (through a runtime stub)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   731
//             jmp patch_site
489c9b5090e2 Initial load
duke
parents:
diff changeset
   732
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   733
// If the class is being initialized the patch body is rewritten and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   734
// the patch site is rewritten to jump to being_init, instead of
489c9b5090e2 Initial load
duke
parents:
diff changeset
   735
// patch_stub.  Whenever this code is executed it checks the current
489c9b5090e2 Initial load
duke
parents:
diff changeset
   736
// thread against the intializing thread so other threads will enter
489c9b5090e2 Initial load
duke
parents:
diff changeset
   737
// the runtime and end up blocked waiting the class to finish
489c9b5090e2 Initial load
duke
parents:
diff changeset
   738
// initializing inside the calls to resolve_field below.  The
489c9b5090e2 Initial load
duke
parents:
diff changeset
   739
// initializing class will continue on it's way.  Once the class is
489c9b5090e2 Initial load
duke
parents:
diff changeset
   740
// fully_initialized, the intializing_thread of the class becomes
489c9b5090e2 Initial load
duke
parents:
diff changeset
   741
// NULL, so the next thread to execute this code will fail the test,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   742
// call into patch_code and complete the patching process by copying
489c9b5090e2 Initial load
duke
parents:
diff changeset
   743
// the patch body back into the main part of the nmethod and resume
489c9b5090e2 Initial load
duke
parents:
diff changeset
   744
// executing.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   745
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   746
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
   747
489c9b5090e2 Initial load
duke
parents:
diff changeset
   748
JRT_ENTRY(void, Runtime1::patch_code(JavaThread* thread, Runtime1::StubID stub_id ))
489c9b5090e2 Initial load
duke
parents:
diff changeset
   749
  NOT_PRODUCT(_patch_code_slowcase_cnt++;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   750
489c9b5090e2 Initial load
duke
parents:
diff changeset
   751
  ResourceMark rm(thread);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   752
  RegisterMap reg_map(thread, false);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   753
  frame runtime_frame = thread->last_frame();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   754
  frame caller_frame = runtime_frame.sender(&reg_map);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   755
489c9b5090e2 Initial load
duke
parents:
diff changeset
   756
  // last java frame on stack
489c9b5090e2 Initial load
duke
parents:
diff changeset
   757
  vframeStream vfst(thread, true);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   758
  assert(!vfst.at_end(), "Java frame must exist");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   759
489c9b5090e2 Initial load
duke
parents:
diff changeset
   760
  methodHandle caller_method(THREAD, vfst.method());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   761
  // Note that caller_method->code() may not be same as caller_code because of OSR's
489c9b5090e2 Initial load
duke
parents:
diff changeset
   762
  // Note also that in the presence of inlining it is not guaranteed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   763
  // that caller_method() == caller_code->method()
489c9b5090e2 Initial load
duke
parents:
diff changeset
   764
489c9b5090e2 Initial load
duke
parents:
diff changeset
   765
489c9b5090e2 Initial load
duke
parents:
diff changeset
   766
  int bci = vfst.bci();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   767
489c9b5090e2 Initial load
duke
parents:
diff changeset
   768
  Events::log("patch_code @ " INTPTR_FORMAT , caller_frame.pc());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   769
489c9b5090e2 Initial load
duke
parents:
diff changeset
   770
  Bytecodes::Code code = Bytecode_at(caller_method->bcp_from(bci))->java_code();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   771
489c9b5090e2 Initial load
duke
parents:
diff changeset
   772
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   773
  // this is used by assertions in the access_field_patching_id
489c9b5090e2 Initial load
duke
parents:
diff changeset
   774
  BasicType patch_field_type = T_ILLEGAL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   775
#endif // PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   776
  bool deoptimize_for_volatile = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   777
  int patch_field_offset = -1;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   778
  KlassHandle init_klass(THREAD, klassOop(NULL)); // klass needed by access_field_patching code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   779
  Handle load_klass(THREAD, NULL);                // oop needed by load_klass_patching code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   780
  if (stub_id == Runtime1::access_field_patching_id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   781
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5707
diff changeset
   782
    Bytecode_field* field_access = Bytecode_field_at(caller_method, bci);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   783
    FieldAccessInfo result; // initialize class if needed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   784
    Bytecodes::Code code = field_access->code();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   785
    constantPoolHandle constants(THREAD, caller_method->constants());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   786
    LinkResolver::resolve_field(result, constants, field_access->index(), Bytecodes::java_code(code), false, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   787
    patch_field_offset = result.field_offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   788
489c9b5090e2 Initial load
duke
parents:
diff changeset
   789
    // If we're patching a field which is volatile then at compile it
489c9b5090e2 Initial load
duke
parents:
diff changeset
   790
    // must not have been know to be volatile, so the generated code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   791
    // isn't correct for a volatile reference.  The nmethod has to be
489c9b5090e2 Initial load
duke
parents:
diff changeset
   792
    // deoptimized so that the code can be regenerated correctly.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   793
    // This check is only needed for access_field_patching since this
489c9b5090e2 Initial load
duke
parents:
diff changeset
   794
    // is the path for patching field offsets.  load_klass is only
489c9b5090e2 Initial load
duke
parents:
diff changeset
   795
    // used for patching references to oops which don't need special
489c9b5090e2 Initial load
duke
parents:
diff changeset
   796
    // handling in the volatile case.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   797
    deoptimize_for_volatile = result.access_flags().is_volatile();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   798
489c9b5090e2 Initial load
duke
parents:
diff changeset
   799
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
   800
    patch_field_type = result.field_type();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   801
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   802
  } else if (stub_id == Runtime1::load_klass_patching_id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   803
    oop k;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   804
    switch (code) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   805
      case Bytecodes::_putstatic:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   806
      case Bytecodes::_getstatic:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   807
        { klassOop klass = resolve_field_return_klass(caller_method, bci, CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   808
          // Save a reference to the class that has to be checked for initialization
489c9b5090e2 Initial load
duke
parents:
diff changeset
   809
          init_klass = KlassHandle(THREAD, klass);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   810
          k = klass;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   811
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   812
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   813
      case Bytecodes::_new:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   814
        { Bytecode_new* bnew = Bytecode_new_at(caller_method->bcp_from(bci));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   815
          k = caller_method->constants()->klass_at(bnew->index(), CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   816
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   817
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   818
      case Bytecodes::_multianewarray:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   819
        { Bytecode_multianewarray* mna = Bytecode_multianewarray_at(caller_method->bcp_from(bci));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   820
          k = caller_method->constants()->klass_at(mna->index(), CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   821
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   822
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   823
      case Bytecodes::_instanceof:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   824
        { Bytecode_instanceof* io = Bytecode_instanceof_at(caller_method->bcp_from(bci));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   825
          k = caller_method->constants()->klass_at(io->index(), CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   826
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   827
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   828
      case Bytecodes::_checkcast:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   829
        { Bytecode_checkcast* cc = Bytecode_checkcast_at(caller_method->bcp_from(bci));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   830
          k = caller_method->constants()->klass_at(cc->index(), CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   831
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   832
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   833
      case Bytecodes::_anewarray:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   834
        { Bytecode_anewarray* anew = Bytecode_anewarray_at(caller_method->bcp_from(bci));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   835
          klassOop ek = caller_method->constants()->klass_at(anew->index(), CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   836
          k = Klass::cast(ek)->array_klass(CHECK);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   837
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   838
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   839
      case Bytecodes::_ldc:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   840
      case Bytecodes::_ldc_w:
489c9b5090e2 Initial load
duke
parents:
diff changeset
   841
        {
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5707
diff changeset
   842
          Bytecode_loadconstant* cc = Bytecode_loadconstant_at(caller_method, bci);
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5707
diff changeset
   843
          k = cc->resolve_constant(CHECK);
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5707
diff changeset
   844
          assert(k != NULL && !k->is_klass(), "must be class mirror or other Java constant");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   845
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   846
        break;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   847
      default: Unimplemented();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   848
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   849
    // convert to handle
489c9b5090e2 Initial load
duke
parents:
diff changeset
   850
    load_klass = Handle(THREAD, k);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   851
  } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   852
    ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   853
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   854
489c9b5090e2 Initial load
duke
parents:
diff changeset
   855
  if (deoptimize_for_volatile) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   856
    // At compile time we assumed the field wasn't volatile but after
489c9b5090e2 Initial load
duke
parents:
diff changeset
   857
    // loading it turns out it was volatile so we have to throw the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   858
    // compiled code out and let it be regenerated.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   859
    if (TracePatching) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   860
      tty->print_cr("Deoptimizing for patching volatile field reference");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   861
    }
1672
ae4d91125c2d 6767587: missing call to make_not_entrant after deoptimizing for patching volatiles
never
parents: 1394
diff changeset
   862
    // It's possible the nmethod was invalidated in the last
ae4d91125c2d 6767587: missing call to make_not_entrant after deoptimizing for patching volatiles
never
parents: 1394
diff changeset
   863
    // safepoint, but if it's still alive then make it not_entrant.
ae4d91125c2d 6767587: missing call to make_not_entrant after deoptimizing for patching volatiles
never
parents: 1394
diff changeset
   864
    nmethod* nm = CodeCache::find_nmethod(caller_frame.pc());
ae4d91125c2d 6767587: missing call to make_not_entrant after deoptimizing for patching volatiles
never
parents: 1394
diff changeset
   865
    if (nm != NULL) {
ae4d91125c2d 6767587: missing call to make_not_entrant after deoptimizing for patching volatiles
never
parents: 1394
diff changeset
   866
      nm->make_not_entrant();
ae4d91125c2d 6767587: missing call to make_not_entrant after deoptimizing for patching volatiles
never
parents: 1394
diff changeset
   867
    }
ae4d91125c2d 6767587: missing call to make_not_entrant after deoptimizing for patching volatiles
never
parents: 1394
diff changeset
   868
7106
867c9d296c6b 6968367: can_post_on_exceptions is still using VM_DeoptimizeFrame in some places
never
parents: 6453
diff changeset
   869
    Deoptimization::deoptimize_frame(thread, caller_frame.id());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   870
489c9b5090e2 Initial load
duke
parents:
diff changeset
   871
    // Return to the now deoptimized frame.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   872
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   873
5882
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5707
diff changeset
   874
  // If we are patching in a non-perm oop, make sure the nmethod
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5707
diff changeset
   875
  // is on the right list.
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5707
diff changeset
   876
  if (ScavengeRootsInCode && load_klass.not_null() && load_klass->is_scavengable()) {
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5707
diff changeset
   877
    MutexLockerEx ml_code (CodeCache_lock, Mutex::_no_safepoint_check_flag);
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5707
diff changeset
   878
    nmethod* nm = CodeCache::find_nmethod(caller_frame.pc());
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5707
diff changeset
   879
    guarantee(nm != NULL, "only nmethods can contain non-perm oops");
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5707
diff changeset
   880
    if (!nm->on_scavenge_root_list())
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5707
diff changeset
   881
      CodeCache::add_scavenge_root_nmethod(nm);
6b2aecc4f7d8 6939203: JSR 292 needs method handle constants
jrose
parents: 5707
diff changeset
   882
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   883
489c9b5090e2 Initial load
duke
parents:
diff changeset
   884
  // Now copy code back
489c9b5090e2 Initial load
duke
parents:
diff changeset
   885
489c9b5090e2 Initial load
duke
parents:
diff changeset
   886
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   887
    MutexLockerEx ml_patch (Patching_lock, Mutex::_no_safepoint_check_flag);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   888
    //
489c9b5090e2 Initial load
duke
parents:
diff changeset
   889
    // Deoptimization may have happened while we waited for the lock.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   890
    // In that case we don't bother to do any patching we just return
489c9b5090e2 Initial load
duke
parents:
diff changeset
   891
    // and let the deopt happen
489c9b5090e2 Initial load
duke
parents:
diff changeset
   892
    if (!caller_is_deopted()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   893
      NativeGeneralJump* jump = nativeGeneralJump_at(caller_frame.pc());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   894
      address instr_pc = jump->jump_destination();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   895
      NativeInstruction* ni = nativeInstruction_at(instr_pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   896
      if (ni->is_jump() ) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   897
        // the jump has not been patched yet
489c9b5090e2 Initial load
duke
parents:
diff changeset
   898
        // The jump destination is slow case and therefore not part of the stubs
489c9b5090e2 Initial load
duke
parents:
diff changeset
   899
        // (stubs are only for StaticCalls)
489c9b5090e2 Initial load
duke
parents:
diff changeset
   900
489c9b5090e2 Initial load
duke
parents:
diff changeset
   901
        // format of buffer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   902
        //    ....
489c9b5090e2 Initial load
duke
parents:
diff changeset
   903
        //    instr byte 0     <-- copy_buff
489c9b5090e2 Initial load
duke
parents:
diff changeset
   904
        //    instr byte 1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   905
        //    ..
489c9b5090e2 Initial load
duke
parents:
diff changeset
   906
        //    instr byte n-1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   907
        //      n
489c9b5090e2 Initial load
duke
parents:
diff changeset
   908
        //    ....             <-- call destination
489c9b5090e2 Initial load
duke
parents:
diff changeset
   909
489c9b5090e2 Initial load
duke
parents:
diff changeset
   910
        address stub_location = caller_frame.pc() + PatchingStub::patch_info_offset();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   911
        unsigned char* byte_count = (unsigned char*) (stub_location - 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   912
        unsigned char* byte_skip = (unsigned char*) (stub_location - 2);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   913
        unsigned char* being_initialized_entry_offset = (unsigned char*) (stub_location - 3);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   914
        address copy_buff = stub_location - *byte_skip - *byte_count;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   915
        address being_initialized_entry = stub_location - *being_initialized_entry_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   916
        if (TracePatching) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   917
          tty->print_cr(" Patching %s at bci %d at address 0x%x  (%s)", Bytecodes::name(code), bci,
489c9b5090e2 Initial load
duke
parents:
diff changeset
   918
                        instr_pc, (stub_id == Runtime1::access_field_patching_id) ? "field" : "klass");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   919
          nmethod* caller_code = CodeCache::find_nmethod(caller_frame.pc());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   920
          assert(caller_code != NULL, "nmethod not found");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   921
489c9b5090e2 Initial load
duke
parents:
diff changeset
   922
          // NOTE we use pc() not original_pc() because we already know they are
489c9b5090e2 Initial load
duke
parents:
diff changeset
   923
          // identical otherwise we'd have never entered this block of code
489c9b5090e2 Initial load
duke
parents:
diff changeset
   924
489c9b5090e2 Initial load
duke
parents:
diff changeset
   925
          OopMap* map = caller_code->oop_map_for_return_address(caller_frame.pc());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   926
          assert(map != NULL, "null check");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   927
          map->print();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   928
          tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   929
489c9b5090e2 Initial load
duke
parents:
diff changeset
   930
          Disassembler::decode(copy_buff, copy_buff + *byte_count, tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   931
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   932
        // depending on the code below, do_patch says whether to copy the patch body back into the nmethod
489c9b5090e2 Initial load
duke
parents:
diff changeset
   933
        bool do_patch = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   934
        if (stub_id == Runtime1::access_field_patching_id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   935
          // The offset may not be correct if the class was not loaded at code generation time.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   936
          // Set it now.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   937
          NativeMovRegMem* n_move = nativeMovRegMem_at(copy_buff);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   938
          assert(n_move->offset() == 0 || (n_move->offset() == 4 && (patch_field_type == T_DOUBLE || patch_field_type == T_LONG)), "illegal offset for type");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   939
          assert(patch_field_offset >= 0, "illegal offset");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   940
          n_move->add_offset_in_bytes(patch_field_offset);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   941
        } else if (stub_id == Runtime1::load_klass_patching_id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   942
          // If a getstatic or putstatic is referencing a klass which
489c9b5090e2 Initial load
duke
parents:
diff changeset
   943
          // isn't fully initialized, the patch body isn't copied into
489c9b5090e2 Initial load
duke
parents:
diff changeset
   944
          // place until initialization is complete.  In this case the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   945
          // patch site is setup so that any threads besides the
489c9b5090e2 Initial load
duke
parents:
diff changeset
   946
          // initializing thread are forced to come into the VM and
489c9b5090e2 Initial load
duke
parents:
diff changeset
   947
          // block.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   948
          do_patch = (code != Bytecodes::_getstatic && code != Bytecodes::_putstatic) ||
489c9b5090e2 Initial load
duke
parents:
diff changeset
   949
                     instanceKlass::cast(init_klass())->is_initialized();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   950
          NativeGeneralJump* jump = nativeGeneralJump_at(instr_pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   951
          if (jump->jump_destination() == being_initialized_entry) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   952
            assert(do_patch == true, "initialization must be complete at this point");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   953
          } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   954
            // patch the instruction <move reg, klass>
489c9b5090e2 Initial load
duke
parents:
diff changeset
   955
            NativeMovConstReg* n_copy = nativeMovConstReg_at(copy_buff);
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5883
diff changeset
   956
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5883
diff changeset
   957
            assert(n_copy->data() == 0 ||
6453
970dc585ab63 6953144: Tiered compilation
iveresov
parents: 6418
diff changeset
   958
                   n_copy->data() == (intptr_t)Universe::non_oop_word(),
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5883
diff changeset
   959
                   "illegal init value");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   960
            assert(load_klass() != NULL, "klass not set");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   961
            n_copy->set_data((intx) (load_klass()));
489c9b5090e2 Initial load
duke
parents:
diff changeset
   962
489c9b5090e2 Initial load
duke
parents:
diff changeset
   963
            if (TracePatching) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   964
              Disassembler::decode(copy_buff, copy_buff + *byte_count, tty);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   965
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   966
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5883
diff changeset
   967
#if defined(SPARC) || defined(PPC)
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   968
            // Update the oop location in the nmethod with the proper
489c9b5090e2 Initial load
duke
parents:
diff changeset
   969
            // oop.  When the code was generated, a NULL was stuffed
489c9b5090e2 Initial load
duke
parents:
diff changeset
   970
            // in the oop table and that table needs to be update to
489c9b5090e2 Initial load
duke
parents:
diff changeset
   971
            // have the right value.  On intel the value is kept
489c9b5090e2 Initial load
duke
parents:
diff changeset
   972
            // directly in the instruction instead of in the oop
489c9b5090e2 Initial load
duke
parents:
diff changeset
   973
            // table, so set_data above effectively updated the value.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   974
            nmethod* nm = CodeCache::find_nmethod(instr_pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   975
            assert(nm != NULL, "invalid nmethod_pc");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   976
            RelocIterator oops(nm, copy_buff, copy_buff + 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   977
            bool found = false;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   978
            while (oops.next() && !found) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   979
              if (oops.type() == relocInfo::oop_type) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   980
                oop_Relocation* r = oops.oop_reloc();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   981
                oop* oop_adr = r->oop_addr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   982
                *oop_adr = load_klass();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   983
                r->fix_oop_relocation();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   984
                found = true;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   985
              }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   986
            }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   987
            assert(found, "the oop must exist!");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   988
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   989
489c9b5090e2 Initial load
duke
parents:
diff changeset
   990
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   991
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   992
          ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   993
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   994
        if (do_patch) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   995
          // replace instructions
489c9b5090e2 Initial load
duke
parents:
diff changeset
   996
          // first replace the tail, then the call
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5883
diff changeset
   997
#ifdef ARM
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5883
diff changeset
   998
          if(stub_id == Runtime1::load_klass_patching_id && !VM_Version::supports_movw()) {
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5883
diff changeset
   999
            copy_buff -= *byte_count;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5883
diff changeset
  1000
            NativeMovConstReg* n_copy2 = nativeMovConstReg_at(copy_buff);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5883
diff changeset
  1001
            n_copy2->set_data((intx) (load_klass()), instr_pc);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5883
diff changeset
  1002
          }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5883
diff changeset
  1003
#endif
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5883
diff changeset
  1004
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1005
          for (int i = NativeCall::instruction_size; i < *byte_count; i++) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1006
            address ptr = copy_buff + i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1007
            int a_byte = (*ptr) & 0xFF;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1008
            address dst = instr_pc + i;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1009
            *(unsigned char*)dst = (unsigned char) a_byte;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1010
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1011
          ICache::invalidate_range(instr_pc, *byte_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1012
          NativeGeneralJump::replace_mt_safe(instr_pc, copy_buff);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1013
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1014
          if (stub_id == Runtime1::load_klass_patching_id) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1015
            // update relocInfo to oop
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1016
            nmethod* nm = CodeCache::find_nmethod(instr_pc);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1017
            assert(nm != NULL, "invalid nmethod_pc");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1018
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1019
            // The old patch site is now a move instruction so update
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1020
            // the reloc info so that it will get updated during
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1021
            // future GCs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1022
            RelocIterator iter(nm, (address)instr_pc, (address)(instr_pc + 1));
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1023
            relocInfo::change_reloc_info_for_address(&iter, (address) instr_pc,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1024
                                                     relocInfo::none, relocInfo::oop_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1025
#ifdef SPARC
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1026
            // Sparc takes two relocations for an oop so update the second one.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1027
            address instr_pc2 = instr_pc + NativeMovConstReg::add_offset;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1028
            RelocIterator iter2(nm, instr_pc2, instr_pc2 + 1);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1029
            relocInfo::change_reloc_info_for_address(&iter2, (address) instr_pc2,
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1030
                                                     relocInfo::none, relocInfo::oop_type);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1031
#endif
6176
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5883
diff changeset
  1032
#ifdef PPC
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5883
diff changeset
  1033
          { address instr_pc2 = instr_pc + NativeMovConstReg::lo_offset;
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5883
diff changeset
  1034
            RelocIterator iter2(nm, instr_pc2, instr_pc2 + 1);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5883
diff changeset
  1035
            relocInfo::change_reloc_info_for_address(&iter2, (address) instr_pc2, relocInfo::none, relocInfo::oop_type);
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5883
diff changeset
  1036
          }
4d9030fe341f 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 5883
diff changeset
  1037
#endif
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1038
          }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1039
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1040
        } else {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1041
          ICache::invalidate_range(copy_buff, *byte_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1042
          NativeGeneralJump::insert_unconditional(instr_pc, being_initialized_entry);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1043
        }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1044
      }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1045
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1046
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1047
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1048
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1049
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1050
// Entry point for compiled code. We want to patch a nmethod.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1051
// We don't do a normal VM transition here because we want to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1052
// know after the patching is complete and any safepoint(s) are taken
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1053
// if the calling nmethod was deoptimized. We do this by calling a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1054
// helper method which does the normal VM transition and when it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1055
// completes we can check for deoptimization. This simplifies the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1056
// assembly code in the cpu directories.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1057
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1058
int Runtime1::move_klass_patching(JavaThread* thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1059
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1060
// NOTE: we are still in Java
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1061
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1062
  Thread* THREAD = thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1063
  debug_only(NoHandleMark nhm;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1064
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1065
    // Enter VM mode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1066
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1067
    ResetNoHandleMark rnhm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1068
    patch_code(thread, load_klass_patching_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1069
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1070
  // Back in JAVA, use no oops DON'T safepoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1071
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1072
  // Return true if calling code is deoptimized
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1073
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1074
  return caller_is_deopted();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1075
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1076
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1077
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1078
// Entry point for compiled code. We want to patch a nmethod.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1079
// We don't do a normal VM transition here because we want to
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1080
// know after the patching is complete and any safepoint(s) are taken
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1081
// if the calling nmethod was deoptimized. We do this by calling a
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1082
// helper method which does the normal VM transition and when it
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1083
// completes we can check for deoptimization. This simplifies the
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1084
// assembly code in the cpu directories.
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1085
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1086
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1087
int Runtime1::access_field_patching(JavaThread* thread) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1088
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1089
// NOTE: we are still in Java
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1090
//
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1091
  Thread* THREAD = thread;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1092
  debug_only(NoHandleMark nhm;)
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1093
  {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1094
    // Enter VM mode
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1095
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1096
    ResetNoHandleMark rnhm;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1097
    patch_code(thread, access_field_patching_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1098
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1099
  // Back in JAVA, use no oops DON'T safepoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1100
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1101
  // Return true if calling code is deoptimized
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1102
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1103
  return caller_is_deopted();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1104
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1105
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1106
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1107
JRT_LEAF(void, Runtime1::trace_block_entry(jint block_id))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1108
  // for now we just print out the block id
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1109
  tty->print("%d ", block_id);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1110
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1111
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1112
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1113
// Array copy return codes.
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1114
enum {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1115
  ac_failed = -1, // arraycopy failed
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1116
  ac_ok = 0       // arraycopy succeeded
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1117
};
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1118
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1119
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4571
diff changeset
  1120
// Below length is the # elements copied.
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1121
template <class T> int obj_arraycopy_work(oopDesc* src, T* src_addr,
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1122
                                          oopDesc* dst, T* dst_addr,
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1123
                                          int length) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1124
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1125
  // For performance reasons, we assume we are using a card marking write
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1126
  // barrier. The assert will fail if this is not the case.
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1127
  // Note that we use the non-virtual inlineable variant of write_ref_array.
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1128
  BarrierSet* bs = Universe::heap()->barrier_set();
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4571
diff changeset
  1129
  assert(bs->has_write_ref_array_opt(), "Barrier set must have ref array opt");
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4571
diff changeset
  1130
  assert(bs->has_write_ref_array_pre_opt(), "For pre-barrier as well.");
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1131
  if (src == dst) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1132
    // same object, no check
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4571
diff changeset
  1133
    bs->write_ref_array_pre(dst_addr, length);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1134
    Copy::conjoint_oops_atomic(src_addr, dst_addr, length);
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4571
diff changeset
  1135
    bs->write_ref_array((HeapWord*)dst_addr, length);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1136
    return ac_ok;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1137
  } else {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1138
    klassOop bound = objArrayKlass::cast(dst->klass())->element_klass();
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1139
    klassOop stype = objArrayKlass::cast(src->klass())->element_klass();
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1140
    if (stype == bound || Klass::cast(stype)->is_subtype_of(bound)) {
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1141
      // Elements are guaranteed to be subtypes, so no check necessary
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4571
diff changeset
  1142
      bs->write_ref_array_pre(dst_addr, length);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1143
      Copy::conjoint_oops_atomic(src_addr, dst_addr, length);
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4571
diff changeset
  1144
      bs->write_ref_array((HeapWord*)dst_addr, length);
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1145
      return ac_ok;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1146
    }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1147
  }
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1148
  return ac_failed;
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1149
}
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1150
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1151
// fast and direct copy of arrays; returning -1, means that an exception may be thrown
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1152
// and we did not copy anything
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1153
JRT_LEAF(int, Runtime1::arraycopy(oopDesc* src, int src_pos, oopDesc* dst, int dst_pos, int length))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1154
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1155
  _generic_arraycopy_cnt++;        // Slow-path oop array copy
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1156
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1157
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1158
  if (src == NULL || dst == NULL || src_pos < 0 || dst_pos < 0 || length < 0) return ac_failed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1159
  if (!dst->is_array() || !src->is_array()) return ac_failed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1160
  if ((unsigned int) arrayOop(src)->length() < (unsigned int)src_pos + (unsigned int)length) return ac_failed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1161
  if ((unsigned int) arrayOop(dst)->length() < (unsigned int)dst_pos + (unsigned int)length) return ac_failed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1162
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1163
  if (length == 0) return ac_ok;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1164
  if (src->is_typeArray()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1165
    const klassOop klass_oop = src->klass();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1166
    if (klass_oop != dst->klass()) return ac_failed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1167
    typeArrayKlass* klass = typeArrayKlass::cast(klass_oop);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1168
    const int l2es = klass->log2_element_size();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1169
    const int ihs = klass->array_header_in_bytes() / wordSize;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1170
    char* src_addr = (char*) ((oopDesc**)src + ihs) + (src_pos << l2es);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1171
    char* dst_addr = (char*) ((oopDesc**)dst + ihs) + (dst_pos << l2es);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1172
    // Potential problem: memmove is not guaranteed to be word atomic
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1173
    // Revisit in Merlin
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1174
    memmove(dst_addr, src_addr, length << l2es);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1175
    return ac_ok;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1176
  } else if (src->is_objArray() && dst->is_objArray()) {
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1177
    if (UseCompressedOops) {
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1178
      narrowOop *src_addr  = objArrayOop(src)->obj_at_addr<narrowOop>(src_pos);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1179
      narrowOop *dst_addr  = objArrayOop(dst)->obj_at_addr<narrowOop>(dst_pos);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1180
      return obj_arraycopy_work(src, src_addr, dst, dst_addr, length);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1181
    } else {
360
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1182
      oop *src_addr  = objArrayOop(src)->obj_at_addr<oop>(src_pos);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1183
      oop *dst_addr  = objArrayOop(dst)->obj_at_addr<oop>(dst_pos);
21d113ecbf6a 6420645: Create a vm that uses compressed oops for up to 32gb heapsizes
coleenp
parents: 1
diff changeset
  1184
      return obj_arraycopy_work(src, src_addr, dst, dst_addr, length);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1185
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1186
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1187
  return ac_failed;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1188
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1189
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1190
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1191
JRT_LEAF(void, Runtime1::primitive_arraycopy(HeapWord* src, HeapWord* dst, int length))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1192
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1193
  _primitive_arraycopy_cnt++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1194
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1195
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1196
  if (length == 0) return;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1197
  // Not guaranteed to be word atomic, but that doesn't matter
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1198
  // for anything but an oop array, which is covered by oop_arraycopy.
5883
8dc4bdc132d5 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 5882
diff changeset
  1199
  Copy::conjoint_jbytes(src, dst, length);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1200
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1201
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1202
JRT_LEAF(void, Runtime1::oop_arraycopy(HeapWord* src, HeapWord* dst, int num))
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1203
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1204
  _oop_arraycopy_cnt++;
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1205
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1206
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1207
  if (num == 0) return;
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4571
diff changeset
  1208
  BarrierSet* bs = Universe::heap()->barrier_set();
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4571
diff changeset
  1209
  assert(bs->has_write_ref_array_opt(), "Barrier set must have ref array opt");
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4571
diff changeset
  1210
  assert(bs->has_write_ref_array_pre_opt(), "For pre-barrier as well.");
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4571
diff changeset
  1211
  if (UseCompressedOops) {
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4571
diff changeset
  1212
    bs->write_ref_array_pre((narrowOop*)dst, num);
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1213
    Copy::conjoint_oops_atomic((narrowOop*) src, (narrowOop*) dst, num);
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4571
diff changeset
  1214
  } else {
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4571
diff changeset
  1215
    bs->write_ref_array_pre((oop*)dst, num);
7427
d7b79a367474 6985015: C1 needs to support compressed oops
iveresov
parents: 7397
diff changeset
  1216
    Copy::conjoint_oops_atomic((oop*) src, (oop*) dst, num);
4886
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4571
diff changeset
  1217
  }
a2f9a66475b3 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 4571
diff changeset
  1218
  bs->write_ref_array(dst, num);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1219
JRT_END
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1220
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1221
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1222
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1223
void Runtime1::print_statistics() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1224
  tty->print_cr("C1 Runtime statistics:");
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1225
  tty->print_cr(" _resolve_invoke_virtual_cnt:     %d", SharedRuntime::_resolve_virtual_ctr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1226
  tty->print_cr(" _resolve_invoke_opt_virtual_cnt: %d", SharedRuntime::_resolve_opt_virtual_ctr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1227
  tty->print_cr(" _resolve_invoke_static_cnt:      %d", SharedRuntime::_resolve_static_ctr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1228
  tty->print_cr(" _handle_wrong_method_cnt:        %d", SharedRuntime::_wrong_method_ctr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1229
  tty->print_cr(" _ic_miss_cnt:                    %d", SharedRuntime::_ic_miss_ctr);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1230
  tty->print_cr(" _generic_arraycopy_cnt:          %d", _generic_arraycopy_cnt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1231
  tty->print_cr(" _primitive_arraycopy_cnt:        %d", _primitive_arraycopy_cnt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1232
  tty->print_cr(" _oop_arraycopy_cnt:              %d", _oop_arraycopy_cnt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1233
  tty->print_cr(" _arraycopy_slowcase_cnt:         %d", _arraycopy_slowcase_cnt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1234
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1235
  tty->print_cr(" _new_type_array_slowcase_cnt:    %d", _new_type_array_slowcase_cnt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1236
  tty->print_cr(" _new_object_array_slowcase_cnt:  %d", _new_object_array_slowcase_cnt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1237
  tty->print_cr(" _new_instance_slowcase_cnt:      %d", _new_instance_slowcase_cnt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1238
  tty->print_cr(" _new_multi_array_slowcase_cnt:   %d", _new_multi_array_slowcase_cnt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1239
  tty->print_cr(" _monitorenter_slowcase_cnt:      %d", _monitorenter_slowcase_cnt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1240
  tty->print_cr(" _monitorexit_slowcase_cnt:       %d", _monitorexit_slowcase_cnt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1241
  tty->print_cr(" _patch_code_slowcase_cnt:        %d", _patch_code_slowcase_cnt);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1242
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1243
  tty->print_cr(" _throw_range_check_exception_count:            %d:", _throw_range_check_exception_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1244
  tty->print_cr(" _throw_index_exception_count:                  %d:", _throw_index_exception_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1245
  tty->print_cr(" _throw_div0_exception_count:                   %d:", _throw_div0_exception_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1246
  tty->print_cr(" _throw_null_pointer_exception_count:           %d:", _throw_null_pointer_exception_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1247
  tty->print_cr(" _throw_class_cast_exception_count:             %d:", _throw_class_cast_exception_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1248
  tty->print_cr(" _throw_incompatible_class_change_error_count:  %d:", _throw_incompatible_class_change_error_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1249
  tty->print_cr(" _throw_array_store_exception_count:            %d:", _throw_array_store_exception_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1250
  tty->print_cr(" _throw_count:                                  %d:", _throw_count);
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1251
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1252
  SharedRuntime::print_ic_miss_histogram();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1253
  tty->cr();
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1254
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
  1255
#endif // PRODUCT