hotspot/src/share/vm/code/icBuffer.cpp
author coleenp
Mon, 14 Jan 2013 11:01:39 -0500
changeset 15194 a35093d73168
parent 14626 0cf4eccf130f
child 24424 2658d7834c6e
permissions -rw-r--r--
8006005: Fix constant pool index validation and alignment trap for method parameter reflection Summary: This patch addresses an alignment trap due to the storage format of method parameters data in constMethod. It also adds code to validate constant pool indexes for method parameters data. Reviewed-by: jrose, dholmes Contributed-by: eric.mccorkle@oracle.com
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     1
/*
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
     2
 * Copyright (c) 1997, 2012, Oracle and/or its affiliates. All rights reserved.
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     4
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
489c9b5090e2 Initial load
duke
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
489c9b5090e2 Initial load
duke
parents:
diff changeset
     7
 * published by the Free Software Foundation.
489c9b5090e2 Initial load
duke
parents:
diff changeset
     8
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
489c9b5090e2 Initial load
duke
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
489c9b5090e2 Initial load
duke
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
489c9b5090e2 Initial load
duke
parents:
diff changeset
    13
 * accompanied this code).
489c9b5090e2 Initial load
duke
parents:
diff changeset
    14
 *
489c9b5090e2 Initial load
duke
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
489c9b5090e2 Initial load
duke
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
489c9b5090e2 Initial load
duke
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    18
 *
5547
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
f4b087cbb361 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1
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: 1
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: 5547
diff changeset
    25
#include "precompiled.hpp"
14626
0cf4eccf130f 8003240: x86: move MacroAssembler into separate file
twisti
parents: 13728
diff changeset
    26
#include "code/codeCache.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    27
#include "code/compiledIC.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    28
#include "code/icBuffer.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    29
#include "code/nmethod.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    30
#include "code/scopeDesc.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    31
#include "gc_interface/collectedHeap.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    32
#include "interpreter/interpreter.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    33
#include "interpreter/linkResolver.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    34
#include "memory/resourceArea.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    35
#include "memory/universe.inline.hpp"
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
    36
#include "oops/method.hpp"
7397
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    37
#include "oops/oop.inline.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    38
#include "oops/oop.inline2.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    39
#include "runtime/mutexLocker.hpp"
5b173b4ca846 6989984: Use standard include model for Hospot
stefank
parents: 5547
diff changeset
    40
#include "runtime/stubRoutines.hpp"
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    41
489c9b5090e2 Initial load
duke
parents:
diff changeset
    42
489c9b5090e2 Initial load
duke
parents:
diff changeset
    43
DEF_STUB_INTERFACE(ICStub);
489c9b5090e2 Initial load
duke
parents:
diff changeset
    44
489c9b5090e2 Initial load
duke
parents:
diff changeset
    45
StubQueue* InlineCacheBuffer::_buffer    = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    46
ICStub*    InlineCacheBuffer::_next_stub = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    47
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
    48
CompiledICHolder* InlineCacheBuffer::_pending_released = NULL;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
    49
int InlineCacheBuffer::_pending_count = 0;
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    50
489c9b5090e2 Initial load
duke
parents:
diff changeset
    51
void ICStub::finalize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    52
  if (!is_empty()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    53
    ResourceMark rm;
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
    54
    CompiledIC *ic = CompiledIC_at(CodeCache::find_nmethod(ic_site()), ic_site());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    55
    assert(CodeCache::find_nmethod(ic->instruction_address()) != NULL, "inline cache in non-nmethod?");
489c9b5090e2 Initial load
duke
parents:
diff changeset
    56
489c9b5090e2 Initial load
duke
parents:
diff changeset
    57
    assert(this == ICStub_from_destination_address(ic->stub_address()), "wrong owner of ic buffer");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
    58
    ic->set_ic_destination_and_value(destination(), cached_value());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    59
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
    60
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    61
489c9b5090e2 Initial load
duke
parents:
diff changeset
    62
489c9b5090e2 Initial load
duke
parents:
diff changeset
    63
address ICStub::destination() const {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    64
  return InlineCacheBuffer::ic_buffer_entry_point(code_begin());
489c9b5090e2 Initial load
duke
parents:
diff changeset
    65
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    66
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
    67
void* ICStub::cached_value() const {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
    68
  return InlineCacheBuffer::ic_buffer_cached_value(code_begin());
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    69
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    70
489c9b5090e2 Initial load
duke
parents:
diff changeset
    71
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
    72
void ICStub::set_stub(CompiledIC *ic, void* cached_val, address dest_addr) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    73
  // We cannot store a pointer to the 'ic' object, since it is resource allocated. Instead we
489c9b5090e2 Initial load
duke
parents:
diff changeset
    74
  // store the location of the inline cache. Then we have enough information recreate the CompiledIC
489c9b5090e2 Initial load
duke
parents:
diff changeset
    75
  // object when we need to remove the stub.
489c9b5090e2 Initial load
duke
parents:
diff changeset
    76
  _ic_site = ic->instruction_address();
489c9b5090e2 Initial load
duke
parents:
diff changeset
    77
489c9b5090e2 Initial load
duke
parents:
diff changeset
    78
  // Assemble new stub
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
    79
  InlineCacheBuffer::assemble_ic_buffer_code(code_begin(), cached_val, dest_addr);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    80
  assert(destination() == dest_addr,   "can recover destination");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
    81
  assert(cached_value() == cached_val, "can recover destination");
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    82
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    83
489c9b5090e2 Initial load
duke
parents:
diff changeset
    84
489c9b5090e2 Initial load
duke
parents:
diff changeset
    85
void ICStub::clear() {
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
    86
  if (CompiledIC::is_icholder_entry(destination())) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
    87
    InlineCacheBuffer::queue_for_release((CompiledICHolder*)cached_value());
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
    88
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
    89
  _ic_site = NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
    90
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    91
489c9b5090e2 Initial load
duke
parents:
diff changeset
    92
489c9b5090e2 Initial load
duke
parents:
diff changeset
    93
#ifndef PRODUCT
489c9b5090e2 Initial load
duke
parents:
diff changeset
    94
// anybody calling to this stub will trap
489c9b5090e2 Initial load
duke
parents:
diff changeset
    95
489c9b5090e2 Initial load
duke
parents:
diff changeset
    96
void ICStub::verify() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
    97
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
    98
489c9b5090e2 Initial load
duke
parents:
diff changeset
    99
void ICStub::print() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   100
  tty->print_cr("ICStub: site: " INTPTR_FORMAT, _ic_site);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   101
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   102
#endif
489c9b5090e2 Initial load
duke
parents:
diff changeset
   103
489c9b5090e2 Initial load
duke
parents:
diff changeset
   104
//-----------------------------------------------------------------------------------------------
489c9b5090e2 Initial load
duke
parents:
diff changeset
   105
// Implementation of InlineCacheBuffer
489c9b5090e2 Initial load
duke
parents:
diff changeset
   106
489c9b5090e2 Initial load
duke
parents:
diff changeset
   107
void InlineCacheBuffer::init_next_stub() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   108
  ICStub* ic_stub = (ICStub*)buffer()->request_committed (ic_stub_code_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   109
  assert (ic_stub != NULL, "no room for a single stub");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   110
  set_next_stub(ic_stub);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   111
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   112
489c9b5090e2 Initial load
duke
parents:
diff changeset
   113
void InlineCacheBuffer::initialize() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   114
  if (_buffer != NULL) return; // already initialized
489c9b5090e2 Initial load
duke
parents:
diff changeset
   115
  _buffer = new StubQueue(new ICStubInterface, 10*K, InlineCacheBuffer_lock, "InlineCacheBuffer");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   116
  assert (_buffer != NULL, "cannot allocate InlineCacheBuffer");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   117
  init_next_stub();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   118
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   119
489c9b5090e2 Initial load
duke
parents:
diff changeset
   120
489c9b5090e2 Initial load
duke
parents:
diff changeset
   121
ICStub* InlineCacheBuffer::new_ic_stub() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   122
  while (true) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   123
    ICStub* ic_stub = (ICStub*)buffer()->request_committed(ic_stub_code_size());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   124
    if (ic_stub != NULL) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   125
      return ic_stub;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   126
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   127
    // we ran out of inline cache buffer space; must enter safepoint.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   128
    // We do this by forcing a safepoint
489c9b5090e2 Initial load
duke
parents:
diff changeset
   129
    EXCEPTION_MARK;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   130
489c9b5090e2 Initial load
duke
parents:
diff changeset
   131
    VM_ForceSafepoint vfs;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   132
    VMThread::execute(&vfs);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   133
    // We could potential get an async. exception at this point.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   134
    // In that case we will rethrow it to ourselvs.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   135
    if (HAS_PENDING_EXCEPTION) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   136
      oop exception = PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   137
      CLEAR_PENDING_EXCEPTION;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   138
      Thread::send_async_exception(JavaThread::current()->threadObj(), exception);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   139
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   140
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   141
  ShouldNotReachHere();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   142
  return NULL;
489c9b5090e2 Initial load
duke
parents:
diff changeset
   143
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   144
489c9b5090e2 Initial load
duke
parents:
diff changeset
   145
489c9b5090e2 Initial load
duke
parents:
diff changeset
   146
void InlineCacheBuffer::update_inline_caches() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   147
  if (buffer()->number_of_stubs() > 1) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   148
    if (TraceICBuffer) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   149
      tty->print_cr("[updating inline caches with %d stubs]", buffer()->number_of_stubs());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   150
    }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   151
    buffer()->remove_all();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   152
    init_next_stub();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   153
  }
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   154
  release_pending_icholders();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   155
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   156
489c9b5090e2 Initial load
duke
parents:
diff changeset
   157
489c9b5090e2 Initial load
duke
parents:
diff changeset
   158
bool InlineCacheBuffer::contains(address instruction_address) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   159
  return buffer()->contains(instruction_address);
489c9b5090e2 Initial load
duke
parents:
diff changeset
   160
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   161
489c9b5090e2 Initial load
duke
parents:
diff changeset
   162
489c9b5090e2 Initial load
duke
parents:
diff changeset
   163
bool InlineCacheBuffer::is_empty() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   164
  return buffer()->number_of_stubs() == 1;    // always has sentinel
489c9b5090e2 Initial load
duke
parents:
diff changeset
   165
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   166
489c9b5090e2 Initial load
duke
parents:
diff changeset
   167
489c9b5090e2 Initial load
duke
parents:
diff changeset
   168
void InlineCacheBuffer_init() {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   169
  InlineCacheBuffer::initialize();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   170
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   171
489c9b5090e2 Initial load
duke
parents:
diff changeset
   172
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   173
void InlineCacheBuffer::create_transition_stub(CompiledIC *ic, void* cached_value, address entry) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   174
  assert(!SafepointSynchronize::is_at_safepoint(), "should not be called during a safepoint");
489c9b5090e2 Initial load
duke
parents:
diff changeset
   175
  assert (CompiledIC_lock->is_locked(), "");
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   176
  if (TraceICBuffer) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   177
    tty->print_cr("  create transition stub for " INTPTR_FORMAT " destination " INTPTR_FORMAT " cached value " INTPTR_FORMAT,
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   178
                  ic->instruction_address(), entry, cached_value);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   179
  }
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   180
489c9b5090e2 Initial load
duke
parents:
diff changeset
   181
  // If an transition stub is already associate with the inline cache, then we remove the association.
489c9b5090e2 Initial load
duke
parents:
diff changeset
   182
  if (ic->is_in_transition_state()) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   183
    ICStub* old_stub = ICStub_from_destination_address(ic->stub_address());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   184
    old_stub->clear();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   185
  }
489c9b5090e2 Initial load
duke
parents:
diff changeset
   186
489c9b5090e2 Initial load
duke
parents:
diff changeset
   187
  // allocate and initialize new "out-of-line" inline-cache
489c9b5090e2 Initial load
duke
parents:
diff changeset
   188
  ICStub* ic_stub = get_next_stub();
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   189
  ic_stub->set_stub(ic, cached_value, entry);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   190
489c9b5090e2 Initial load
duke
parents:
diff changeset
   191
  // Update inline cache in nmethod to point to new "out-of-line" allocated inline cache
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   192
  ic->set_ic_destination(ic_stub);
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   193
489c9b5090e2 Initial load
duke
parents:
diff changeset
   194
  set_next_stub(new_ic_stub()); // can cause safepoint synchronization
489c9b5090e2 Initial load
duke
parents:
diff changeset
   195
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   196
489c9b5090e2 Initial load
duke
parents:
diff changeset
   197
489c9b5090e2 Initial load
duke
parents:
diff changeset
   198
address InlineCacheBuffer::ic_destination_for(CompiledIC *ic) {
489c9b5090e2 Initial load
duke
parents:
diff changeset
   199
  ICStub* stub = ICStub_from_destination_address(ic->stub_address());
489c9b5090e2 Initial load
duke
parents:
diff changeset
   200
  return stub->destination();
489c9b5090e2 Initial load
duke
parents:
diff changeset
   201
}
489c9b5090e2 Initial load
duke
parents:
diff changeset
   202
489c9b5090e2 Initial load
duke
parents:
diff changeset
   203
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   204
void* InlineCacheBuffer::cached_value_for(CompiledIC *ic) {
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   205
  ICStub* stub = ICStub_from_destination_address(ic->stub_address());
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   206
  return stub->cached_value();
1
489c9b5090e2 Initial load
duke
parents:
diff changeset
   207
}
13728
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   208
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   209
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   210
// Free CompiledICHolder*s that are no longer in use
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   211
void InlineCacheBuffer::release_pending_icholders() {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   212
  assert(SafepointSynchronize::is_at_safepoint(), "should only be called during a safepoint");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   213
  CompiledICHolder* holder = _pending_released;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   214
  _pending_released = NULL;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   215
  while (holder != NULL) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   216
    CompiledICHolder* next = holder->next();
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   217
    delete holder;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   218
    holder = next;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   219
    _pending_count--;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   220
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   221
  assert(_pending_count == 0, "wrong count");
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   222
}
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   223
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   224
// Enqueue this icholder for release during the next safepoint.  It's
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   225
// not safe to free them until them since they might be visible to
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   226
// another thread.
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   227
void InlineCacheBuffer::queue_for_release(CompiledICHolder* icholder) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   228
  MutexLockerEx mex(InlineCacheBuffer_lock);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   229
  icholder->set_next(_pending_released);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   230
  _pending_released = icholder;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   231
  _pending_count++;
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   232
  if (TraceICBuffer) {
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   233
    tty->print_cr("enqueueing icholder " INTPTR_FORMAT " to be freed", icholder);
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   234
  }
882756847a04 6964458: Reimplement class meta-data storage to use native memory
coleenp
parents: 8921
diff changeset
   235
}