Mercurial > hg > truffle
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 |
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 |