annotate src/share/vm/code/icBuffer.cpp @ 7062:8c5333c80cfd

increased CompileThreshold to increase reliability of profiling information increased InitialCodeCacheSize to fit the bootstrapping added flag -XX:GraalClassPath to allow providing a .jar or .zip file that contains all Graal classes added support for the flag -XX:TraceCompilationPolicy to the Graal-specific compilation policy
author Christian Haeubl <haeubl@ssw.jku.at>
date Thu, 15 Nov 2012 11:40:50 +0100
parents 1d1603768966
children 7d815d842ee0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2426
1d1603768966 7010070: Update all 2010 Oracle-changed OpenJDK files to have the proper copyright dates - second pass
trims
parents: 2192
diff changeset
2 * Copyright (c) 1997, 2011, Oracle and/or its affiliates. All rights reserved.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a61af66fc99e Initial load
duke
parents:
diff changeset
4 *
a61af66fc99e Initial load
duke
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a61af66fc99e Initial load
duke
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a61af66fc99e Initial load
duke
parents:
diff changeset
7 * published by the Free Software Foundation.
a61af66fc99e Initial load
duke
parents:
diff changeset
8 *
a61af66fc99e Initial load
duke
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a61af66fc99e Initial load
duke
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a61af66fc99e Initial load
duke
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a61af66fc99e Initial load
duke
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a61af66fc99e Initial load
duke
parents:
diff changeset
13 * accompanied this code).
a61af66fc99e Initial load
duke
parents:
diff changeset
14 *
a61af66fc99e Initial load
duke
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a61af66fc99e Initial load
duke
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a61af66fc99e Initial load
duke
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a61af66fc99e Initial load
duke
parents:
diff changeset
18 *
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 0
diff changeset
21 * questions.
0
a61af66fc99e Initial load
duke
parents:
diff changeset
22 *
a61af66fc99e Initial load
duke
parents:
diff changeset
23 */
a61af66fc99e Initial load
duke
parents:
diff changeset
24
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
25 #include "precompiled.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
26 #include "code/compiledIC.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
27 #include "code/icBuffer.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
28 #include "code/nmethod.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
29 #include "code/scopeDesc.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
30 #include "gc_interface/collectedHeap.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
31 #include "interpreter/interpreter.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
32 #include "interpreter/linkResolver.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
33 #include "memory/resourceArea.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
34 #include "memory/universe.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
35 #include "oops/methodOop.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
36 #include "oops/oop.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
37 #include "oops/oop.inline2.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
38 #include "runtime/mutexLocker.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
39 #include "runtime/stubRoutines.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
40 #ifdef TARGET_ARCH_x86
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
41 # include "assembler_x86.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
42 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
43 #ifdef TARGET_ARCH_sparc
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
44 # include "assembler_sparc.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
45 #endif
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
46 #ifdef TARGET_ARCH_zero
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
47 # include "assembler_zero.inline.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1552
diff changeset
48 #endif
2192
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 1972
diff changeset
49 #ifdef TARGET_ARCH_arm
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 1972
diff changeset
50 # include "assembler_arm.inline.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 1972
diff changeset
51 #endif
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 1972
diff changeset
52 #ifdef TARGET_ARCH_ppc
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 1972
diff changeset
53 # include "assembler_ppc.inline.hpp"
b92c45f2bc75 7016023: Enable building ARM and PPC from src/closed repository
bobv
parents: 1972
diff changeset
54 #endif
0
a61af66fc99e Initial load
duke
parents:
diff changeset
55
a61af66fc99e Initial load
duke
parents:
diff changeset
56
a61af66fc99e Initial load
duke
parents:
diff changeset
57 DEF_STUB_INTERFACE(ICStub);
a61af66fc99e Initial load
duke
parents:
diff changeset
58
a61af66fc99e Initial load
duke
parents:
diff changeset
59 StubQueue* InlineCacheBuffer::_buffer = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
60 ICStub* InlineCacheBuffer::_next_stub = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
61
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63 void ICStub::finalize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
64 if (!is_empty()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
65 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 CompiledIC *ic = CompiledIC_at(ic_site());
a61af66fc99e Initial load
duke
parents:
diff changeset
67 assert(CodeCache::find_nmethod(ic->instruction_address()) != NULL, "inline cache in non-nmethod?");
a61af66fc99e Initial load
duke
parents:
diff changeset
68
a61af66fc99e Initial load
duke
parents:
diff changeset
69 assert(this == ICStub_from_destination_address(ic->stub_address()), "wrong owner of ic buffer");
a61af66fc99e Initial load
duke
parents:
diff changeset
70 ic->set_cached_oop(cached_oop());
a61af66fc99e Initial load
duke
parents:
diff changeset
71 ic->set_ic_destination(destination());
a61af66fc99e Initial load
duke
parents:
diff changeset
72 }
a61af66fc99e Initial load
duke
parents:
diff changeset
73 }
a61af66fc99e Initial load
duke
parents:
diff changeset
74
a61af66fc99e Initial load
duke
parents:
diff changeset
75
a61af66fc99e Initial load
duke
parents:
diff changeset
76 address ICStub::destination() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
77 return InlineCacheBuffer::ic_buffer_entry_point(code_begin());
a61af66fc99e Initial load
duke
parents:
diff changeset
78 }
a61af66fc99e Initial load
duke
parents:
diff changeset
79
a61af66fc99e Initial load
duke
parents:
diff changeset
80 oop ICStub::cached_oop() const {
a61af66fc99e Initial load
duke
parents:
diff changeset
81 return InlineCacheBuffer::ic_buffer_cached_oop(code_begin());
a61af66fc99e Initial load
duke
parents:
diff changeset
82 }
a61af66fc99e Initial load
duke
parents:
diff changeset
83
a61af66fc99e Initial load
duke
parents:
diff changeset
84
a61af66fc99e Initial load
duke
parents:
diff changeset
85 void ICStub::set_stub(CompiledIC *ic, oop cached_value, address dest_addr) {
a61af66fc99e Initial load
duke
parents:
diff changeset
86 // We cannot store a pointer to the 'ic' object, since it is resource allocated. Instead we
a61af66fc99e Initial load
duke
parents:
diff changeset
87 // store the location of the inline cache. Then we have enough information recreate the CompiledIC
a61af66fc99e Initial load
duke
parents:
diff changeset
88 // object when we need to remove the stub.
a61af66fc99e Initial load
duke
parents:
diff changeset
89 _ic_site = ic->instruction_address();
a61af66fc99e Initial load
duke
parents:
diff changeset
90
a61af66fc99e Initial load
duke
parents:
diff changeset
91 // Assemble new stub
a61af66fc99e Initial load
duke
parents:
diff changeset
92 InlineCacheBuffer::assemble_ic_buffer_code(code_begin(), cached_value, dest_addr);
a61af66fc99e Initial load
duke
parents:
diff changeset
93 assert(destination() == dest_addr, "can recover destination");
a61af66fc99e Initial load
duke
parents:
diff changeset
94 assert(cached_oop() == cached_value, "can recover destination");
a61af66fc99e Initial load
duke
parents:
diff changeset
95 }
a61af66fc99e Initial load
duke
parents:
diff changeset
96
a61af66fc99e Initial load
duke
parents:
diff changeset
97
a61af66fc99e Initial load
duke
parents:
diff changeset
98 void ICStub::clear() {
a61af66fc99e Initial load
duke
parents:
diff changeset
99 _ic_site = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
100 }
a61af66fc99e Initial load
duke
parents:
diff changeset
101
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
104 // anybody calling to this stub will trap
a61af66fc99e Initial load
duke
parents:
diff changeset
105
a61af66fc99e Initial load
duke
parents:
diff changeset
106 void ICStub::verify() {
a61af66fc99e Initial load
duke
parents:
diff changeset
107 }
a61af66fc99e Initial load
duke
parents:
diff changeset
108
7062
8c5333c80cfd increased CompileThreshold to increase reliability of profiling information
Christian Haeubl <haeubl@ssw.jku.at>
parents: 2426
diff changeset
109 void ICStub::print_on(outputStream* st) {
8c5333c80cfd increased CompileThreshold to increase reliability of profiling information
Christian Haeubl <haeubl@ssw.jku.at>
parents: 2426
diff changeset
110 st->print_cr("ICStub: site: " INTPTR_FORMAT, _ic_site);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
111 }
a61af66fc99e Initial load
duke
parents:
diff changeset
112 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 //-----------------------------------------------------------------------------------------------
a61af66fc99e Initial load
duke
parents:
diff changeset
115 // Implementation of InlineCacheBuffer
a61af66fc99e Initial load
duke
parents:
diff changeset
116
a61af66fc99e Initial load
duke
parents:
diff changeset
117 void InlineCacheBuffer::init_next_stub() {
a61af66fc99e Initial load
duke
parents:
diff changeset
118 ICStub* ic_stub = (ICStub*)buffer()->request_committed (ic_stub_code_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
119 assert (ic_stub != NULL, "no room for a single stub");
a61af66fc99e Initial load
duke
parents:
diff changeset
120 set_next_stub(ic_stub);
a61af66fc99e Initial load
duke
parents:
diff changeset
121 }
a61af66fc99e Initial load
duke
parents:
diff changeset
122
a61af66fc99e Initial load
duke
parents:
diff changeset
123 void InlineCacheBuffer::initialize() {
a61af66fc99e Initial load
duke
parents:
diff changeset
124 if (_buffer != NULL) return; // already initialized
a61af66fc99e Initial load
duke
parents:
diff changeset
125 _buffer = new StubQueue(new ICStubInterface, 10*K, InlineCacheBuffer_lock, "InlineCacheBuffer");
a61af66fc99e Initial load
duke
parents:
diff changeset
126 assert (_buffer != NULL, "cannot allocate InlineCacheBuffer");
a61af66fc99e Initial load
duke
parents:
diff changeset
127 init_next_stub();
a61af66fc99e Initial load
duke
parents:
diff changeset
128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 ICStub* InlineCacheBuffer::new_ic_stub() {
a61af66fc99e Initial load
duke
parents:
diff changeset
132 while (true) {
a61af66fc99e Initial load
duke
parents:
diff changeset
133 ICStub* ic_stub = (ICStub*)buffer()->request_committed(ic_stub_code_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
134 if (ic_stub != NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
135 return ic_stub;
a61af66fc99e Initial load
duke
parents:
diff changeset
136 }
a61af66fc99e Initial load
duke
parents:
diff changeset
137 // we ran out of inline cache buffer space; must enter safepoint.
a61af66fc99e Initial load
duke
parents:
diff changeset
138 // We do this by forcing a safepoint
a61af66fc99e Initial load
duke
parents:
diff changeset
139 EXCEPTION_MARK;
a61af66fc99e Initial load
duke
parents:
diff changeset
140
a61af66fc99e Initial load
duke
parents:
diff changeset
141 VM_ForceSafepoint vfs;
a61af66fc99e Initial load
duke
parents:
diff changeset
142 VMThread::execute(&vfs);
a61af66fc99e Initial load
duke
parents:
diff changeset
143 // We could potential get an async. exception at this point.
a61af66fc99e Initial load
duke
parents:
diff changeset
144 // In that case we will rethrow it to ourselvs.
a61af66fc99e Initial load
duke
parents:
diff changeset
145 if (HAS_PENDING_EXCEPTION) {
a61af66fc99e Initial load
duke
parents:
diff changeset
146 oop exception = PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
147 CLEAR_PENDING_EXCEPTION;
a61af66fc99e Initial load
duke
parents:
diff changeset
148 Thread::send_async_exception(JavaThread::current()->threadObj(), exception);
a61af66fc99e Initial load
duke
parents:
diff changeset
149 }
a61af66fc99e Initial load
duke
parents:
diff changeset
150 }
a61af66fc99e Initial load
duke
parents:
diff changeset
151 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
152 return NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
153 }
a61af66fc99e Initial load
duke
parents:
diff changeset
154
a61af66fc99e Initial load
duke
parents:
diff changeset
155
a61af66fc99e Initial load
duke
parents:
diff changeset
156 void InlineCacheBuffer::update_inline_caches() {
a61af66fc99e Initial load
duke
parents:
diff changeset
157 if (buffer()->number_of_stubs() > 1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
158 if (TraceICBuffer) {
a61af66fc99e Initial load
duke
parents:
diff changeset
159 tty->print_cr("[updating inline caches with %d stubs]", buffer()->number_of_stubs());
a61af66fc99e Initial load
duke
parents:
diff changeset
160 }
a61af66fc99e Initial load
duke
parents:
diff changeset
161 buffer()->remove_all();
a61af66fc99e Initial load
duke
parents:
diff changeset
162 init_next_stub();
a61af66fc99e Initial load
duke
parents:
diff changeset
163 }
a61af66fc99e Initial load
duke
parents:
diff changeset
164 }
a61af66fc99e Initial load
duke
parents:
diff changeset
165
a61af66fc99e Initial load
duke
parents:
diff changeset
166
a61af66fc99e Initial load
duke
parents:
diff changeset
167 bool InlineCacheBuffer::contains(address instruction_address) {
a61af66fc99e Initial load
duke
parents:
diff changeset
168 return buffer()->contains(instruction_address);
a61af66fc99e Initial load
duke
parents:
diff changeset
169 }
a61af66fc99e Initial load
duke
parents:
diff changeset
170
a61af66fc99e Initial load
duke
parents:
diff changeset
171
a61af66fc99e Initial load
duke
parents:
diff changeset
172 bool InlineCacheBuffer::is_empty() {
a61af66fc99e Initial load
duke
parents:
diff changeset
173 return buffer()->number_of_stubs() == 1; // always has sentinel
a61af66fc99e Initial load
duke
parents:
diff changeset
174 }
a61af66fc99e Initial load
duke
parents:
diff changeset
175
a61af66fc99e Initial load
duke
parents:
diff changeset
176
a61af66fc99e Initial load
duke
parents:
diff changeset
177 void InlineCacheBuffer_init() {
a61af66fc99e Initial load
duke
parents:
diff changeset
178 InlineCacheBuffer::initialize();
a61af66fc99e Initial load
duke
parents:
diff changeset
179 }
a61af66fc99e Initial load
duke
parents:
diff changeset
180
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 void InlineCacheBuffer::create_transition_stub(CompiledIC *ic, oop cached_oop, address entry) {
a61af66fc99e Initial load
duke
parents:
diff changeset
183 assert(!SafepointSynchronize::is_at_safepoint(), "should not be called during a safepoint");
a61af66fc99e Initial load
duke
parents:
diff changeset
184 assert (CompiledIC_lock->is_locked(), "");
a61af66fc99e Initial load
duke
parents:
diff changeset
185 assert(cached_oop == NULL || cached_oop->is_perm(), "must belong to perm. space");
a61af66fc99e Initial load
duke
parents:
diff changeset
186 if (TraceICBuffer) { tty->print_cr(" create transition stub for " INTPTR_FORMAT, ic->instruction_address()); }
a61af66fc99e Initial load
duke
parents:
diff changeset
187
a61af66fc99e Initial load
duke
parents:
diff changeset
188 // If an transition stub is already associate with the inline cache, then we remove the association.
a61af66fc99e Initial load
duke
parents:
diff changeset
189 if (ic->is_in_transition_state()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
190 ICStub* old_stub = ICStub_from_destination_address(ic->stub_address());
a61af66fc99e Initial load
duke
parents:
diff changeset
191 old_stub->clear();
a61af66fc99e Initial load
duke
parents:
diff changeset
192 }
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 // allocate and initialize new "out-of-line" inline-cache
a61af66fc99e Initial load
duke
parents:
diff changeset
195 ICStub* ic_stub = get_next_stub();
a61af66fc99e Initial load
duke
parents:
diff changeset
196 ic_stub->set_stub(ic, cached_oop, entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
197
a61af66fc99e Initial load
duke
parents:
diff changeset
198 // Update inline cache in nmethod to point to new "out-of-line" allocated inline cache
a61af66fc99e Initial load
duke
parents:
diff changeset
199 ic->set_ic_destination(ic_stub->code_begin());
a61af66fc99e Initial load
duke
parents:
diff changeset
200
a61af66fc99e Initial load
duke
parents:
diff changeset
201 set_next_stub(new_ic_stub()); // can cause safepoint synchronization
a61af66fc99e Initial load
duke
parents:
diff changeset
202 }
a61af66fc99e Initial load
duke
parents:
diff changeset
203
a61af66fc99e Initial load
duke
parents:
diff changeset
204
a61af66fc99e Initial load
duke
parents:
diff changeset
205 address InlineCacheBuffer::ic_destination_for(CompiledIC *ic) {
a61af66fc99e Initial load
duke
parents:
diff changeset
206 ICStub* stub = ICStub_from_destination_address(ic->stub_address());
a61af66fc99e Initial load
duke
parents:
diff changeset
207 return stub->destination();
a61af66fc99e Initial load
duke
parents:
diff changeset
208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
209
a61af66fc99e Initial load
duke
parents:
diff changeset
210
a61af66fc99e Initial load
duke
parents:
diff changeset
211 oop InlineCacheBuffer::cached_oop_for(CompiledIC *ic) {
a61af66fc99e Initial load
duke
parents:
diff changeset
212 ICStub* stub = ICStub_from_destination_address(ic->stub_address());
a61af66fc99e Initial load
duke
parents:
diff changeset
213 return stub->cached_oop();
a61af66fc99e Initial load
duke
parents:
diff changeset
214 }