annotate src/cpu/x86/vm/compiledIC_x86.cpp @ 17716:cdb71841f4bc

6498581: ThreadInterruptTest3 produces wrong output on Windows Summary: There is race condition between os::interrupt and os::is_interrupted on Windows. In JVM_Sleep(Thread.sleep), check if thread gets interrupted, it may see interrupted but not really interrupted so cause spurious waking up (early return from sleep). Fix by checking if interrupt event really gets set thus prevent false return. For intrinsic of _isInterrupted, on Windows, go fastpath only on bit not set. Reviewed-by: acorn, kvn Contributed-by: david.holmes@oracle.com, yumin.qi@oracle.com
author minqi
date Wed, 26 Feb 2014 15:20:41 -0800
parents a6e09d6dd8e5
children 36bcc10e01c0 78bbf4d43a14
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
10168
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
1 /*
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
2 * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
4 *
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
5 * This code is free software; you can redistribute it and/or modify it
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
6 * under the terms of the GNU General Public License version 2 only, as
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
7 * published by the Free Software Foundation.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
8 *
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
9 * This code is distributed in the hope that it will be useful, but WITHOUT
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
12 * version 2 for more details (a copy is included in the LICENSE file that
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
13 * accompanied this code).
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
14 *
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
15 * You should have received a copy of the GNU General Public License version
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
16 * 2 along with this work; if not, write to the Free Software Foundation,
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
18 *
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
20 * or visit www.oracle.com if you need additional information or have any
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
21 * questions.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
22 *
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
23 */
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
24
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
25 #include "precompiled.hpp"
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
26 #include "asm/macroAssembler.inline.hpp"
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
27 #include "code/compiledIC.hpp"
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
28 #include "code/icBuffer.hpp"
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
29 #include "code/nmethod.hpp"
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
30 #include "memory/resourceArea.hpp"
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
31 #include "runtime/mutexLocker.hpp"
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
32 #include "runtime/safepoint.hpp"
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
33
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
34 // Release the CompiledICHolder* associated with this call site is there is one.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
35 void CompiledIC::cleanup_call_site(virtual_call_Relocation* call_site) {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
36 // This call site might have become stale so inspect it carefully.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
37 NativeCall* call = nativeCall_at(call_site->addr());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
38 if (is_icholder_entry(call->destination())) {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
39 NativeMovConstReg* value = nativeMovConstReg_at(call_site->cached_value());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
40 InlineCacheBuffer::queue_for_release((CompiledICHolder*)value->data());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
41 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
42 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
43
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
44 bool CompiledIC::is_icholder_call_site(virtual_call_Relocation* call_site) {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
45 // This call site might have become stale so inspect it carefully.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
46 NativeCall* call = nativeCall_at(call_site->addr());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
47 return is_icholder_entry(call->destination());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
48 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
49
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
50 //-----------------------------------------------------------------------------
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
51 // High-level access to an inline cache. Guaranteed to be MT-safe.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
52
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
53 CompiledIC::CompiledIC(nmethod* nm, NativeCall* call)
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
54 : _ic_call(call)
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
55 {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
56 address ic_call = call->instruction_address();
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
57
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
58 assert(ic_call != NULL, "ic_call address must be set");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
59 assert(nm != NULL, "must pass nmethod");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
60 assert(nm->contains(ic_call), "must be in nmethod");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
61
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
62 // Search for the ic_call at the given address.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
63 RelocIterator iter(nm, ic_call, ic_call+1);
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
64 bool ret = iter.next();
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
65 assert(ret == true, "relocInfo must exist at this address");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
66 assert(iter.addr() == ic_call, "must find ic_call");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
67 if (iter.type() == relocInfo::virtual_call_type) {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
68 virtual_call_Relocation* r = iter.virtual_call_reloc();
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
69 _is_optimized = false;
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
70 _value = nativeMovConstReg_at(r->cached_value());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
71 } else {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
72 assert(iter.type() == relocInfo::opt_virtual_call_type, "must be a virtual call");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
73 _is_optimized = true;
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
74 _value = NULL;
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
75 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
76 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
77
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
78 // ----------------------------------------------------------------------------
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
79
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
80 #define __ _masm.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
81 void CompiledStaticCall::emit_to_interp_stub(CodeBuffer &cbuf) {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
82 // Stub is fixed up when the corresponding call is converted from
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
83 // calling compiled code to calling interpreted code.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
84 // movq rbx, 0
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
85 // jmp -5 # to self
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
86
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
87 address mark = cbuf.insts_mark(); // Get mark within main instrs section.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
88
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
89 // Note that the code buffer's insts_mark is always relative to insts.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
90 // That's why we must use the macroassembler to generate a stub.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
91 MacroAssembler _masm(&cbuf);
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
92
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
93 address base =
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
94 __ start_a_stub(to_interp_stub_size()*2);
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
95 if (base == NULL) return; // CodeBuffer::expand failed.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
96 // Static stub relocation stores the instruction address of the call.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
97 __ relocate(static_stub_Relocation::spec(mark), Assembler::imm_operand);
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
98 // Static stub relocation also tags the Method* in the code-stream.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
99 __ mov_metadata(rbx, (Metadata*) NULL); // Method is zapped till fixup time.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
100 // This is recognized as unresolved by relocs/nativeinst/ic code.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
101 __ jump(RuntimeAddress(__ pc()));
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
102
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
103 // Update current stubs pointer and restore insts_end.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
104 __ end_a_stub();
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
105 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
106 #undef __
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
107
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
108 int CompiledStaticCall::to_interp_stub_size() {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
109 return NOT_LP64(10) // movl; jmp
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
110 LP64_ONLY(15); // movq (1+1+8); jmp (1+4)
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
111 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
112
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
113 // Relocation entries for call stub, compiled java to interpreter.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
114 int CompiledStaticCall::reloc_to_interp_stub() {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
115 return 4; // 3 in emit_to_interp_stub + 1 in emit_call
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
116 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
117
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
118 void CompiledStaticCall::set_to_interpreted(methodHandle callee, address entry) {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
119 address stub = find_stub();
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
120 guarantee(stub != NULL, "stub not found");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
121
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
122 if (TraceICs) {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
123 ResourceMark rm;
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
124 tty->print_cr("CompiledStaticCall@" INTPTR_FORMAT ": set_to_interpreted %s",
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
125 instruction_address(),
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
126 callee->name_and_sig_as_C_string());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
127 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
128
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
129 // Creation also verifies the object.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
130 NativeMovConstReg* method_holder = nativeMovConstReg_at(stub);
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
131 NativeJump* jump = nativeJump_at(method_holder->next_instruction_address());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
132
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
133 assert(method_holder->data() == 0 || method_holder->data() == (intptr_t)callee(),
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
134 "a) MT-unsafe modification of inline cache");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
135 assert(jump->jump_destination() == (address)-1 || jump->jump_destination() == entry,
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
136 "b) MT-unsafe modification of inline cache");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
137
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
138 // Update stub.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
139 method_holder->set_data((intptr_t)callee());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
140 jump->set_jump_destination(entry);
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
141
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
142 // Update jump to call.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
143 set_destination_mt_safe(stub);
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
144 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
145
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
146 void CompiledStaticCall::set_stub_to_clean(static_stub_Relocation* static_stub) {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
147 assert (CompiledIC_lock->is_locked() || SafepointSynchronize::is_at_safepoint(), "mt unsafe call");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
148 // Reset stub.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
149 address stub = static_stub->addr();
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
150 assert(stub != NULL, "stub not found");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
151 // Creation also verifies the object.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
152 NativeMovConstReg* method_holder = nativeMovConstReg_at(stub);
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
153 NativeJump* jump = nativeJump_at(method_holder->next_instruction_address());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
154 method_holder->set_data(0);
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
155 jump->set_jump_destination((address)-1);
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
156 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
157
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
158 //-----------------------------------------------------------------------------
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
159 // Non-product mode code
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
160 #ifndef PRODUCT
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
161
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
162 void CompiledStaticCall::verify() {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
163 // Verify call.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
164 NativeCall::verify();
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
165 if (os::is_MP()) {
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
166 verify_alignment();
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
167 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
168
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
169 // Verify stub.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
170 address stub = find_stub();
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
171 assert(stub != NULL, "no stub found for static call");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
172 // Creation also verifies the object.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
173 NativeMovConstReg* method_holder = nativeMovConstReg_at(stub);
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
174 NativeJump* jump = nativeJump_at(method_holder->next_instruction_address());
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
175
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
176 // Verify state.
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
177 assert(is_clean() || is_call_to_compiled() || is_call_to_interpreted(), "sanity check");
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
178 }
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
179
a6e09d6dd8e5 8003853: specify offset of IC load in java_to_interp stub
dlong
parents:
diff changeset
180 #endif // !PRODUCT