annotate src/share/vm/c1/c1_CodeStubs.hpp @ 3249:e1162778c1c8

7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error Summary: A referent object that is only weakly reachable at the start of concurrent marking but is re-attached to the strongly reachable object graph during marking may not be marked as live. This can cause the reference object to be processed prematurely and leave dangling pointers to the referent object. Implement a read barrier for the java.lang.ref.Reference::referent field by intrinsifying the Reference.get() method, and intercepting accesses though JNI, reflection, and Unsafe, so that when a non-null referent object is read it is also logged in an SATB buffer. Reviewed-by: kvn, iveresov, never, tonyp, dholmes
author johnc
date Thu, 07 Apr 2011 09:53:20 -0700
parents e4fee0bdaa85
children 09aad8452938
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
2168
e4fee0bdaa85 7008809: should report the class in ArrayStoreExceptions from compiled code
never
parents: 1972
diff changeset
2 * Copyright (c) 1999, 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: 1295
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1295
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: 1295
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: 1783
diff changeset
25 #ifndef SHARE_VM_C1_C1_CODESTUBS_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
26 #define SHARE_VM_C1_C1_CODESTUBS_HPP
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
27
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
28 #include "c1/c1_FrameMap.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
29 #include "c1/c1_IR.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
30 #include "c1/c1_Instruction.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
31 #include "c1/c1_LIR.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
32 #include "c1/c1_Runtime1.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
33 #include "utilities/array.hpp"
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
34
0
a61af66fc99e Initial load
duke
parents:
diff changeset
35 class CodeEmitInfo;
a61af66fc99e Initial load
duke
parents:
diff changeset
36 class LIR_Assembler;
a61af66fc99e Initial load
duke
parents:
diff changeset
37 class LIR_OpVisitState;
a61af66fc99e Initial load
duke
parents:
diff changeset
38
a61af66fc99e Initial load
duke
parents:
diff changeset
39 // CodeStubs are little 'out-of-line' pieces of code that
a61af66fc99e Initial load
duke
parents:
diff changeset
40 // usually handle slow cases of operations. All code stubs
a61af66fc99e Initial load
duke
parents:
diff changeset
41 // are collected and code is emitted at the end of the
a61af66fc99e Initial load
duke
parents:
diff changeset
42 // nmethod.
a61af66fc99e Initial load
duke
parents:
diff changeset
43
a61af66fc99e Initial load
duke
parents:
diff changeset
44 class CodeStub: public CompilationResourceObj {
a61af66fc99e Initial load
duke
parents:
diff changeset
45 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
46 Label _entry; // label at the stub entry point
a61af66fc99e Initial load
duke
parents:
diff changeset
47 Label _continuation; // label where stub continues, if any
a61af66fc99e Initial load
duke
parents:
diff changeset
48
a61af66fc99e Initial load
duke
parents:
diff changeset
49 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
50 CodeStub() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
51
a61af66fc99e Initial load
duke
parents:
diff changeset
52 // code generation
a61af66fc99e Initial load
duke
parents:
diff changeset
53 void assert_no_unbound_labels() { assert(!_entry.is_unbound() && !_continuation.is_unbound(), "unbound label"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
54 virtual void emit_code(LIR_Assembler* e) = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 virtual CodeEmitInfo* info() const { return NULL; }
a61af66fc99e Initial load
duke
parents:
diff changeset
56 virtual bool is_exception_throw_stub() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
57 virtual bool is_range_check_stub() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
58 virtual bool is_divbyzero_stub() const { return false; }
a61af66fc99e Initial load
duke
parents:
diff changeset
59 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
60 virtual void print_name(outputStream* out) const = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
62
a61af66fc99e Initial load
duke
parents:
diff changeset
63 // label access
a61af66fc99e Initial load
duke
parents:
diff changeset
64 Label* entry() { return &_entry; }
a61af66fc99e Initial load
duke
parents:
diff changeset
65 Label* continuation() { return &_continuation; }
a61af66fc99e Initial load
duke
parents:
diff changeset
66 // for LIR
a61af66fc99e Initial load
duke
parents:
diff changeset
67 virtual void visit(LIR_OpVisitState* visit) {
a61af66fc99e Initial load
duke
parents:
diff changeset
68 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
69 if (LIRTracePeephole && Verbose) {
a61af66fc99e Initial load
duke
parents:
diff changeset
70 tty->print("no visitor for ");
a61af66fc99e Initial load
duke
parents:
diff changeset
71 print_name(tty);
a61af66fc99e Initial load
duke
parents:
diff changeset
72 tty->cr();
a61af66fc99e Initial load
duke
parents:
diff changeset
73 }
a61af66fc99e Initial load
duke
parents:
diff changeset
74 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
75 }
a61af66fc99e Initial load
duke
parents:
diff changeset
76 };
a61af66fc99e Initial load
duke
parents:
diff changeset
77
a61af66fc99e Initial load
duke
parents:
diff changeset
78
a61af66fc99e Initial load
duke
parents:
diff changeset
79 define_array(CodeStubArray, CodeStub*)
a61af66fc99e Initial load
duke
parents:
diff changeset
80 define_stack(_CodeStubList, CodeStubArray)
a61af66fc99e Initial load
duke
parents:
diff changeset
81
a61af66fc99e Initial load
duke
parents:
diff changeset
82 class CodeStubList: public _CodeStubList {
a61af66fc99e Initial load
duke
parents:
diff changeset
83 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
84 CodeStubList(): _CodeStubList() {}
a61af66fc99e Initial load
duke
parents:
diff changeset
85
a61af66fc99e Initial load
duke
parents:
diff changeset
86 void append(CodeStub* stub) {
a61af66fc99e Initial load
duke
parents:
diff changeset
87 if (!contains(stub)) {
a61af66fc99e Initial load
duke
parents:
diff changeset
88 _CodeStubList::append(stub);
a61af66fc99e Initial load
duke
parents:
diff changeset
89 }
a61af66fc99e Initial load
duke
parents:
diff changeset
90 }
a61af66fc99e Initial load
duke
parents:
diff changeset
91 };
a61af66fc99e Initial load
duke
parents:
diff changeset
92
a61af66fc99e Initial load
duke
parents:
diff changeset
93 class CounterOverflowStub: public CodeStub {
a61af66fc99e Initial load
duke
parents:
diff changeset
94 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
95 CodeEmitInfo* _info;
a61af66fc99e Initial load
duke
parents:
diff changeset
96 int _bci;
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
97 LIR_Opr _method;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
98
a61af66fc99e Initial load
duke
parents:
diff changeset
99 public:
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
100 CounterOverflowStub(CodeEmitInfo* info, int bci, LIR_Opr method) : _info(info), _bci(bci), _method(method) {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
101 }
a61af66fc99e Initial load
duke
parents:
diff changeset
102
a61af66fc99e Initial load
duke
parents:
diff changeset
103 virtual void emit_code(LIR_Assembler* e);
a61af66fc99e Initial load
duke
parents:
diff changeset
104
a61af66fc99e Initial load
duke
parents:
diff changeset
105 virtual void visit(LIR_OpVisitState* visitor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
106 visitor->do_slow_case(_info);
1783
d5d065957597 6953144: Tiered compilation
iveresov
parents: 1681
diff changeset
107 visitor->do_input(_method);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
108 }
a61af66fc99e Initial load
duke
parents:
diff changeset
109
a61af66fc99e Initial load
duke
parents:
diff changeset
110 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
111 virtual void print_name(outputStream* out) const { out->print("CounterOverflowStub"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
112 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 };
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 class ConversionStub: public CodeStub {
a61af66fc99e Initial load
duke
parents:
diff changeset
117 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
118 Bytecodes::Code _bytecode;
a61af66fc99e Initial load
duke
parents:
diff changeset
119 LIR_Opr _input;
a61af66fc99e Initial load
duke
parents:
diff changeset
120 LIR_Opr _result;
a61af66fc99e Initial load
duke
parents:
diff changeset
121
a61af66fc99e Initial load
duke
parents:
diff changeset
122 static float float_zero;
a61af66fc99e Initial load
duke
parents:
diff changeset
123 static double double_zero;
a61af66fc99e Initial load
duke
parents:
diff changeset
124 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
125 ConversionStub(Bytecodes::Code bytecode, LIR_Opr input, LIR_Opr result)
a61af66fc99e Initial load
duke
parents:
diff changeset
126 : _bytecode(bytecode), _input(input), _result(result) {
a61af66fc99e Initial load
duke
parents:
diff changeset
127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
128
a61af66fc99e Initial load
duke
parents:
diff changeset
129 Bytecodes::Code bytecode() { return _bytecode; }
a61af66fc99e Initial load
duke
parents:
diff changeset
130 LIR_Opr input() { return _input; }
a61af66fc99e Initial load
duke
parents:
diff changeset
131 LIR_Opr result() { return _result; }
a61af66fc99e Initial load
duke
parents:
diff changeset
132
a61af66fc99e Initial load
duke
parents:
diff changeset
133 virtual void emit_code(LIR_Assembler* e);
a61af66fc99e Initial load
duke
parents:
diff changeset
134 virtual void visit(LIR_OpVisitState* visitor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
135 visitor->do_slow_case();
a61af66fc99e Initial load
duke
parents:
diff changeset
136 visitor->do_input(_input);
a61af66fc99e Initial load
duke
parents:
diff changeset
137 visitor->do_output(_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
138 }
a61af66fc99e Initial load
duke
parents:
diff changeset
139 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
140 virtual void print_name(outputStream* out) const { out->print("ConversionStub"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
141 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
142 };
a61af66fc99e Initial load
duke
parents:
diff changeset
143
a61af66fc99e Initial load
duke
parents:
diff changeset
144
a61af66fc99e Initial load
duke
parents:
diff changeset
145 // Throws ArrayIndexOutOfBoundsException by default but can be
a61af66fc99e Initial load
duke
parents:
diff changeset
146 // configured to throw IndexOutOfBoundsException in constructor
a61af66fc99e Initial load
duke
parents:
diff changeset
147 class RangeCheckStub: public CodeStub {
a61af66fc99e Initial load
duke
parents:
diff changeset
148 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
149 CodeEmitInfo* _info;
a61af66fc99e Initial load
duke
parents:
diff changeset
150 LIR_Opr _index;
a61af66fc99e Initial load
duke
parents:
diff changeset
151 bool _throw_index_out_of_bounds_exception;
a61af66fc99e Initial load
duke
parents:
diff changeset
152
a61af66fc99e Initial load
duke
parents:
diff changeset
153 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
154 RangeCheckStub(CodeEmitInfo* info, LIR_Opr index, bool throw_index_out_of_bounds_exception = false);
a61af66fc99e Initial load
duke
parents:
diff changeset
155 virtual void emit_code(LIR_Assembler* e);
a61af66fc99e Initial load
duke
parents:
diff changeset
156 virtual CodeEmitInfo* info() const { return _info; }
a61af66fc99e Initial load
duke
parents:
diff changeset
157 virtual bool is_exception_throw_stub() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
158 virtual bool is_range_check_stub() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
159 virtual void visit(LIR_OpVisitState* visitor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
160 visitor->do_slow_case(_info);
a61af66fc99e Initial load
duke
parents:
diff changeset
161 visitor->do_input(_index);
a61af66fc99e Initial load
duke
parents:
diff changeset
162 }
a61af66fc99e Initial load
duke
parents:
diff changeset
163 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
164 virtual void print_name(outputStream* out) const { out->print("RangeCheckStub"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
165 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
166 };
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 class DivByZeroStub: public CodeStub {
a61af66fc99e Initial load
duke
parents:
diff changeset
170 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
171 CodeEmitInfo* _info;
a61af66fc99e Initial load
duke
parents:
diff changeset
172 int _offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
173
a61af66fc99e Initial load
duke
parents:
diff changeset
174 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
175 DivByZeroStub(CodeEmitInfo* info)
a61af66fc99e Initial load
duke
parents:
diff changeset
176 : _info(info), _offset(-1) {
a61af66fc99e Initial load
duke
parents:
diff changeset
177 }
a61af66fc99e Initial load
duke
parents:
diff changeset
178 DivByZeroStub(int offset, CodeEmitInfo* info)
a61af66fc99e Initial load
duke
parents:
diff changeset
179 : _info(info), _offset(offset) {
a61af66fc99e Initial load
duke
parents:
diff changeset
180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
181 virtual void emit_code(LIR_Assembler* e);
a61af66fc99e Initial load
duke
parents:
diff changeset
182 virtual CodeEmitInfo* info() const { return _info; }
a61af66fc99e Initial load
duke
parents:
diff changeset
183 virtual bool is_exception_throw_stub() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
184 virtual bool is_divbyzero_stub() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
185 virtual void visit(LIR_OpVisitState* visitor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
186 visitor->do_slow_case(_info);
a61af66fc99e Initial load
duke
parents:
diff changeset
187 }
a61af66fc99e Initial load
duke
parents:
diff changeset
188 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
189 virtual void print_name(outputStream* out) const { out->print("DivByZeroStub"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
190 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
191 };
a61af66fc99e Initial load
duke
parents:
diff changeset
192
a61af66fc99e Initial load
duke
parents:
diff changeset
193
a61af66fc99e Initial load
duke
parents:
diff changeset
194 class ImplicitNullCheckStub: public CodeStub {
a61af66fc99e Initial load
duke
parents:
diff changeset
195 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
196 CodeEmitInfo* _info;
a61af66fc99e Initial load
duke
parents:
diff changeset
197 int _offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
198
a61af66fc99e Initial load
duke
parents:
diff changeset
199 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
200 ImplicitNullCheckStub(int offset, CodeEmitInfo* info)
a61af66fc99e Initial load
duke
parents:
diff changeset
201 : _offset(offset), _info(info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
202 }
a61af66fc99e Initial load
duke
parents:
diff changeset
203 virtual void emit_code(LIR_Assembler* e);
a61af66fc99e Initial load
duke
parents:
diff changeset
204 virtual CodeEmitInfo* info() const { return _info; }
a61af66fc99e Initial load
duke
parents:
diff changeset
205 virtual bool is_exception_throw_stub() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
206 virtual void visit(LIR_OpVisitState* visitor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
207 visitor->do_slow_case(_info);
a61af66fc99e Initial load
duke
parents:
diff changeset
208 }
a61af66fc99e Initial load
duke
parents:
diff changeset
209 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
210 virtual void print_name(outputStream* out) const { out->print("ImplicitNullCheckStub"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
211 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
212 };
a61af66fc99e Initial load
duke
parents:
diff changeset
213
a61af66fc99e Initial load
duke
parents:
diff changeset
214
a61af66fc99e Initial load
duke
parents:
diff changeset
215 class NewInstanceStub: public CodeStub {
a61af66fc99e Initial load
duke
parents:
diff changeset
216 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
217 ciInstanceKlass* _klass;
a61af66fc99e Initial load
duke
parents:
diff changeset
218 LIR_Opr _klass_reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
219 LIR_Opr _result;
a61af66fc99e Initial load
duke
parents:
diff changeset
220 CodeEmitInfo* _info;
a61af66fc99e Initial load
duke
parents:
diff changeset
221 Runtime1::StubID _stub_id;
a61af66fc99e Initial load
duke
parents:
diff changeset
222
a61af66fc99e Initial load
duke
parents:
diff changeset
223 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
224 NewInstanceStub(LIR_Opr klass_reg, LIR_Opr result, ciInstanceKlass* klass, CodeEmitInfo* info, Runtime1::StubID stub_id);
a61af66fc99e Initial load
duke
parents:
diff changeset
225 virtual void emit_code(LIR_Assembler* e);
a61af66fc99e Initial load
duke
parents:
diff changeset
226 virtual CodeEmitInfo* info() const { return _info; }
a61af66fc99e Initial load
duke
parents:
diff changeset
227 virtual void visit(LIR_OpVisitState* visitor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
228 visitor->do_slow_case(_info);
a61af66fc99e Initial load
duke
parents:
diff changeset
229 visitor->do_input(_klass_reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
230 visitor->do_output(_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
231 }
a61af66fc99e Initial load
duke
parents:
diff changeset
232 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
233 virtual void print_name(outputStream* out) const { out->print("NewInstanceStub"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
234 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
235 };
a61af66fc99e Initial load
duke
parents:
diff changeset
236
a61af66fc99e Initial load
duke
parents:
diff changeset
237
a61af66fc99e Initial load
duke
parents:
diff changeset
238 class NewTypeArrayStub: public CodeStub {
a61af66fc99e Initial load
duke
parents:
diff changeset
239 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
240 LIR_Opr _klass_reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
241 LIR_Opr _length;
a61af66fc99e Initial load
duke
parents:
diff changeset
242 LIR_Opr _result;
a61af66fc99e Initial load
duke
parents:
diff changeset
243 CodeEmitInfo* _info;
a61af66fc99e Initial load
duke
parents:
diff changeset
244
a61af66fc99e Initial load
duke
parents:
diff changeset
245 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
246 NewTypeArrayStub(LIR_Opr klass_reg, LIR_Opr length, LIR_Opr result, CodeEmitInfo* info);
a61af66fc99e Initial load
duke
parents:
diff changeset
247 virtual void emit_code(LIR_Assembler* e);
a61af66fc99e Initial load
duke
parents:
diff changeset
248 virtual CodeEmitInfo* info() const { return _info; }
a61af66fc99e Initial load
duke
parents:
diff changeset
249 virtual void visit(LIR_OpVisitState* visitor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
250 visitor->do_slow_case(_info);
a61af66fc99e Initial load
duke
parents:
diff changeset
251 visitor->do_input(_klass_reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
252 visitor->do_input(_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
253 assert(_result->is_valid(), "must be valid"); visitor->do_output(_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
254 }
a61af66fc99e Initial load
duke
parents:
diff changeset
255 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
256 virtual void print_name(outputStream* out) const { out->print("NewTypeArrayStub"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
257 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
258 };
a61af66fc99e Initial load
duke
parents:
diff changeset
259
a61af66fc99e Initial load
duke
parents:
diff changeset
260
a61af66fc99e Initial load
duke
parents:
diff changeset
261 class NewObjectArrayStub: public CodeStub {
a61af66fc99e Initial load
duke
parents:
diff changeset
262 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
263 LIR_Opr _klass_reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
264 LIR_Opr _length;
a61af66fc99e Initial load
duke
parents:
diff changeset
265 LIR_Opr _result;
a61af66fc99e Initial load
duke
parents:
diff changeset
266 CodeEmitInfo* _info;
a61af66fc99e Initial load
duke
parents:
diff changeset
267
a61af66fc99e Initial load
duke
parents:
diff changeset
268 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
269 NewObjectArrayStub(LIR_Opr klass_reg, LIR_Opr length, LIR_Opr result, CodeEmitInfo* info);
a61af66fc99e Initial load
duke
parents:
diff changeset
270 virtual void emit_code(LIR_Assembler* e);
a61af66fc99e Initial load
duke
parents:
diff changeset
271 virtual CodeEmitInfo* info() const { return _info; }
a61af66fc99e Initial load
duke
parents:
diff changeset
272 virtual void visit(LIR_OpVisitState* visitor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
273 visitor->do_slow_case(_info);
a61af66fc99e Initial load
duke
parents:
diff changeset
274 visitor->do_input(_klass_reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
275 visitor->do_input(_length);
a61af66fc99e Initial load
duke
parents:
diff changeset
276 assert(_result->is_valid(), "must be valid"); visitor->do_output(_result);
a61af66fc99e Initial load
duke
parents:
diff changeset
277 }
a61af66fc99e Initial load
duke
parents:
diff changeset
278 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
279 virtual void print_name(outputStream* out) const { out->print("NewObjectArrayStub"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
280 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
281 };
a61af66fc99e Initial load
duke
parents:
diff changeset
282
a61af66fc99e Initial load
duke
parents:
diff changeset
283
a61af66fc99e Initial load
duke
parents:
diff changeset
284 class MonitorAccessStub: public CodeStub {
a61af66fc99e Initial load
duke
parents:
diff changeset
285 protected:
a61af66fc99e Initial load
duke
parents:
diff changeset
286 LIR_Opr _obj_reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
287 LIR_Opr _lock_reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
288
a61af66fc99e Initial load
duke
parents:
diff changeset
289 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
290 MonitorAccessStub(LIR_Opr obj_reg, LIR_Opr lock_reg) {
a61af66fc99e Initial load
duke
parents:
diff changeset
291 _obj_reg = obj_reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
292 _lock_reg = lock_reg;
a61af66fc99e Initial load
duke
parents:
diff changeset
293 }
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
296 virtual void print_name(outputStream* out) const { out->print("MonitorAccessStub"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
297 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
298 };
a61af66fc99e Initial load
duke
parents:
diff changeset
299
a61af66fc99e Initial load
duke
parents:
diff changeset
300
a61af66fc99e Initial load
duke
parents:
diff changeset
301 class MonitorEnterStub: public MonitorAccessStub {
a61af66fc99e Initial load
duke
parents:
diff changeset
302 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
303 CodeEmitInfo* _info;
a61af66fc99e Initial load
duke
parents:
diff changeset
304
a61af66fc99e Initial load
duke
parents:
diff changeset
305 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
306 MonitorEnterStub(LIR_Opr obj_reg, LIR_Opr lock_reg, CodeEmitInfo* info);
a61af66fc99e Initial load
duke
parents:
diff changeset
307
a61af66fc99e Initial load
duke
parents:
diff changeset
308 virtual void emit_code(LIR_Assembler* e);
a61af66fc99e Initial load
duke
parents:
diff changeset
309 virtual CodeEmitInfo* info() const { return _info; }
a61af66fc99e Initial load
duke
parents:
diff changeset
310 virtual void visit(LIR_OpVisitState* visitor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
311 visitor->do_input(_obj_reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
312 visitor->do_input(_lock_reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
313 visitor->do_slow_case(_info);
a61af66fc99e Initial load
duke
parents:
diff changeset
314 }
a61af66fc99e Initial load
duke
parents:
diff changeset
315 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
316 virtual void print_name(outputStream* out) const { out->print("MonitorEnterStub"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
317 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
318 };
a61af66fc99e Initial load
duke
parents:
diff changeset
319
a61af66fc99e Initial load
duke
parents:
diff changeset
320
a61af66fc99e Initial load
duke
parents:
diff changeset
321 class MonitorExitStub: public MonitorAccessStub {
a61af66fc99e Initial load
duke
parents:
diff changeset
322 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
323 bool _compute_lock;
a61af66fc99e Initial load
duke
parents:
diff changeset
324 int _monitor_ix;
a61af66fc99e Initial load
duke
parents:
diff changeset
325
a61af66fc99e Initial load
duke
parents:
diff changeset
326 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
327 MonitorExitStub(LIR_Opr lock_reg, bool compute_lock, int monitor_ix)
a61af66fc99e Initial load
duke
parents:
diff changeset
328 : MonitorAccessStub(LIR_OprFact::illegalOpr, lock_reg),
a61af66fc99e Initial load
duke
parents:
diff changeset
329 _compute_lock(compute_lock), _monitor_ix(monitor_ix) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
330 virtual void emit_code(LIR_Assembler* e);
a61af66fc99e Initial load
duke
parents:
diff changeset
331 virtual void visit(LIR_OpVisitState* visitor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
332 assert(_obj_reg->is_illegal(), "unused");
a61af66fc99e Initial load
duke
parents:
diff changeset
333 if (_compute_lock) {
a61af66fc99e Initial load
duke
parents:
diff changeset
334 visitor->do_temp(_lock_reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
335 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
336 visitor->do_input(_lock_reg);
a61af66fc99e Initial load
duke
parents:
diff changeset
337 }
a61af66fc99e Initial load
duke
parents:
diff changeset
338 }
a61af66fc99e Initial load
duke
parents:
diff changeset
339 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
340 virtual void print_name(outputStream* out) const { out->print("MonitorExitStub"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
341 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
342 };
a61af66fc99e Initial load
duke
parents:
diff changeset
343
a61af66fc99e Initial load
duke
parents:
diff changeset
344
a61af66fc99e Initial load
duke
parents:
diff changeset
345 class PatchingStub: public CodeStub {
a61af66fc99e Initial load
duke
parents:
diff changeset
346 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
347 enum PatchID {
a61af66fc99e Initial load
duke
parents:
diff changeset
348 access_field_id,
a61af66fc99e Initial load
duke
parents:
diff changeset
349 load_klass_id
a61af66fc99e Initial load
duke
parents:
diff changeset
350 };
a61af66fc99e Initial load
duke
parents:
diff changeset
351 enum constants {
a61af66fc99e Initial load
duke
parents:
diff changeset
352 patch_info_size = 3
a61af66fc99e Initial load
duke
parents:
diff changeset
353 };
a61af66fc99e Initial load
duke
parents:
diff changeset
354 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
355 PatchID _id;
a61af66fc99e Initial load
duke
parents:
diff changeset
356 address _pc_start;
a61af66fc99e Initial load
duke
parents:
diff changeset
357 int _bytes_to_copy;
a61af66fc99e Initial load
duke
parents:
diff changeset
358 Label _patched_code_entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
359 Label _patch_site_entry;
a61af66fc99e Initial load
duke
parents:
diff changeset
360 Label _patch_site_continuation;
a61af66fc99e Initial load
duke
parents:
diff changeset
361 Register _obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
362 CodeEmitInfo* _info;
a61af66fc99e Initial load
duke
parents:
diff changeset
363 int _oop_index; // index of the patchable oop in nmethod oop table if needed
a61af66fc99e Initial load
duke
parents:
diff changeset
364 static int _patch_info_offset;
a61af66fc99e Initial load
duke
parents:
diff changeset
365
a61af66fc99e Initial load
duke
parents:
diff changeset
366 void align_patch_site(MacroAssembler* masm);
a61af66fc99e Initial load
duke
parents:
diff changeset
367
a61af66fc99e Initial load
duke
parents:
diff changeset
368 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
369 static int patch_info_offset() { return _patch_info_offset; }
a61af66fc99e Initial load
duke
parents:
diff changeset
370
a61af66fc99e Initial load
duke
parents:
diff changeset
371 PatchingStub(MacroAssembler* masm, PatchID id, int oop_index = -1):
a61af66fc99e Initial load
duke
parents:
diff changeset
372 _id(id)
a61af66fc99e Initial load
duke
parents:
diff changeset
373 , _info(NULL)
a61af66fc99e Initial load
duke
parents:
diff changeset
374 , _oop_index(oop_index) {
a61af66fc99e Initial load
duke
parents:
diff changeset
375 if (os::is_MP()) {
a61af66fc99e Initial load
duke
parents:
diff changeset
376 // force alignment of patch sites on MP hardware so we
a61af66fc99e Initial load
duke
parents:
diff changeset
377 // can guarantee atomic writes to the patch site.
a61af66fc99e Initial load
duke
parents:
diff changeset
378 align_patch_site(masm);
a61af66fc99e Initial load
duke
parents:
diff changeset
379 }
a61af66fc99e Initial load
duke
parents:
diff changeset
380 _pc_start = masm->pc();
a61af66fc99e Initial load
duke
parents:
diff changeset
381 masm->bind(_patch_site_entry);
a61af66fc99e Initial load
duke
parents:
diff changeset
382 }
a61af66fc99e Initial load
duke
parents:
diff changeset
383
a61af66fc99e Initial load
duke
parents:
diff changeset
384 void install(MacroAssembler* masm, LIR_PatchCode patch_code, Register obj, CodeEmitInfo* info) {
a61af66fc99e Initial load
duke
parents:
diff changeset
385 _info = info;
a61af66fc99e Initial load
duke
parents:
diff changeset
386 _obj = obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
387 masm->bind(_patch_site_continuation);
a61af66fc99e Initial load
duke
parents:
diff changeset
388 _bytes_to_copy = masm->pc() - pc_start();
a61af66fc99e Initial load
duke
parents:
diff changeset
389 if (_id == PatchingStub::access_field_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
390 // embed a fixed offset to handle long patches which need to be offset by a word.
a61af66fc99e Initial load
duke
parents:
diff changeset
391 // the patching code will just add the field offset field to this offset so
a61af66fc99e Initial load
duke
parents:
diff changeset
392 // that we can refernce either the high or low word of a double word field.
a61af66fc99e Initial load
duke
parents:
diff changeset
393 int field_offset = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
394 switch (patch_code) {
a61af66fc99e Initial load
duke
parents:
diff changeset
395 case lir_patch_low: field_offset = lo_word_offset_in_bytes; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
396 case lir_patch_high: field_offset = hi_word_offset_in_bytes; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
397 case lir_patch_normal: field_offset = 0; break;
a61af66fc99e Initial load
duke
parents:
diff changeset
398 default: ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
399 }
a61af66fc99e Initial load
duke
parents:
diff changeset
400 NativeMovRegMem* n_move = nativeMovRegMem_at(pc_start());
a61af66fc99e Initial load
duke
parents:
diff changeset
401 n_move->set_offset(field_offset);
a61af66fc99e Initial load
duke
parents:
diff changeset
402 } else if (_id == load_klass_id) {
a61af66fc99e Initial load
duke
parents:
diff changeset
403 assert(_obj != noreg, "must have register object for load_klass");
a61af66fc99e Initial load
duke
parents:
diff changeset
404 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
405 // verify that we're pointing at a NativeMovConstReg
a61af66fc99e Initial load
duke
parents:
diff changeset
406 nativeMovConstReg_at(pc_start());
a61af66fc99e Initial load
duke
parents:
diff changeset
407 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
408 } else {
a61af66fc99e Initial load
duke
parents:
diff changeset
409 ShouldNotReachHere();
a61af66fc99e Initial load
duke
parents:
diff changeset
410 }
a61af66fc99e Initial load
duke
parents:
diff changeset
411 assert(_bytes_to_copy <= (masm->pc() - pc_start()), "not enough bytes");
a61af66fc99e Initial load
duke
parents:
diff changeset
412 }
a61af66fc99e Initial load
duke
parents:
diff changeset
413
a61af66fc99e Initial load
duke
parents:
diff changeset
414 address pc_start() const { return _pc_start; }
a61af66fc99e Initial load
duke
parents:
diff changeset
415 PatchID id() const { return _id; }
a61af66fc99e Initial load
duke
parents:
diff changeset
416
a61af66fc99e Initial load
duke
parents:
diff changeset
417 virtual void emit_code(LIR_Assembler* e);
a61af66fc99e Initial load
duke
parents:
diff changeset
418 virtual CodeEmitInfo* info() const { return _info; }
a61af66fc99e Initial load
duke
parents:
diff changeset
419 virtual void visit(LIR_OpVisitState* visitor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
420 visitor->do_slow_case(_info);
a61af66fc99e Initial load
duke
parents:
diff changeset
421 }
a61af66fc99e Initial load
duke
parents:
diff changeset
422 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
423 virtual void print_name(outputStream* out) const { out->print("PatchingStub"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
424 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
425 };
a61af66fc99e Initial load
duke
parents:
diff changeset
426
a61af66fc99e Initial load
duke
parents:
diff changeset
427
1295
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
428 //------------------------------------------------------------------------------
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
429 // DeoptimizeStub
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
430 //
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
431 class DeoptimizeStub : public CodeStub {
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
432 private:
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
433 CodeEmitInfo* _info;
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
434
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
435 public:
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
436 DeoptimizeStub(CodeEmitInfo* info) : _info(new CodeEmitInfo(info)) {}
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
437
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
438 virtual void emit_code(LIR_Assembler* e);
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
439 virtual CodeEmitInfo* info() const { return _info; }
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
440 virtual bool is_exception_throw_stub() const { return true; }
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
441 virtual void visit(LIR_OpVisitState* visitor) {
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
442 visitor->do_slow_case(_info);
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
443 }
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
444 #ifndef PRODUCT
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
445 virtual void print_name(outputStream* out) const { out->print("DeoptimizeStub"); }
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
446 #endif // PRODUCT
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
447 };
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
448
3cf667df43ef 6919934: JSR 292 needs to support x86 C1
twisti
parents: 342
diff changeset
449
0
a61af66fc99e Initial load
duke
parents:
diff changeset
450 class SimpleExceptionStub: public CodeStub {
a61af66fc99e Initial load
duke
parents:
diff changeset
451 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
452 LIR_Opr _obj;
a61af66fc99e Initial load
duke
parents:
diff changeset
453 Runtime1::StubID _stub;
a61af66fc99e Initial load
duke
parents:
diff changeset
454 CodeEmitInfo* _info;
a61af66fc99e Initial load
duke
parents:
diff changeset
455
a61af66fc99e Initial load
duke
parents:
diff changeset
456 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
457 SimpleExceptionStub(Runtime1::StubID stub, LIR_Opr obj, CodeEmitInfo* info):
a61af66fc99e Initial load
duke
parents:
diff changeset
458 _obj(obj), _info(info), _stub(stub) {
a61af66fc99e Initial load
duke
parents:
diff changeset
459 }
a61af66fc99e Initial load
duke
parents:
diff changeset
460
1681
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
461 void set_obj(LIR_Opr obj) {
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
462 _obj = obj;
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
463 }
126ea7725993 6953477: Increase portability and flexibility of building Hotspot
bobv
parents: 1552
diff changeset
464
0
a61af66fc99e Initial load
duke
parents:
diff changeset
465 virtual void emit_code(LIR_Assembler* e);
a61af66fc99e Initial load
duke
parents:
diff changeset
466 virtual CodeEmitInfo* info() const { return _info; }
a61af66fc99e Initial load
duke
parents:
diff changeset
467 virtual bool is_exception_throw_stub() const { return true; }
a61af66fc99e Initial load
duke
parents:
diff changeset
468 virtual void visit(LIR_OpVisitState* visitor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
469 if (_obj->is_valid()) visitor->do_input(_obj);
a61af66fc99e Initial load
duke
parents:
diff changeset
470 visitor->do_slow_case(_info);
a61af66fc99e Initial load
duke
parents:
diff changeset
471 }
a61af66fc99e Initial load
duke
parents:
diff changeset
472 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
473 virtual void print_name(outputStream* out) const { out->print("SimpleExceptionStub"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
474 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
475 };
a61af66fc99e Initial load
duke
parents:
diff changeset
476
a61af66fc99e Initial load
duke
parents:
diff changeset
477
a61af66fc99e Initial load
duke
parents:
diff changeset
478
2168
e4fee0bdaa85 7008809: should report the class in ArrayStoreExceptions from compiled code
never
parents: 1972
diff changeset
479 class ArrayStoreExceptionStub: public SimpleExceptionStub {
0
a61af66fc99e Initial load
duke
parents:
diff changeset
480 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
481 CodeEmitInfo* _info;
a61af66fc99e Initial load
duke
parents:
diff changeset
482
a61af66fc99e Initial load
duke
parents:
diff changeset
483 public:
2168
e4fee0bdaa85 7008809: should report the class in ArrayStoreExceptions from compiled code
never
parents: 1972
diff changeset
484 ArrayStoreExceptionStub(LIR_Opr obj, CodeEmitInfo* info): SimpleExceptionStub(Runtime1::throw_array_store_exception_id, obj, info) {}
0
a61af66fc99e Initial load
duke
parents:
diff changeset
485 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
486 virtual void print_name(outputStream* out) const { out->print("ArrayStoreExceptionStub"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
487 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
488 };
a61af66fc99e Initial load
duke
parents:
diff changeset
489
a61af66fc99e Initial load
duke
parents:
diff changeset
490
a61af66fc99e Initial load
duke
parents:
diff changeset
491 class ArrayCopyStub: public CodeStub {
a61af66fc99e Initial load
duke
parents:
diff changeset
492 private:
a61af66fc99e Initial load
duke
parents:
diff changeset
493 LIR_OpArrayCopy* _op;
a61af66fc99e Initial load
duke
parents:
diff changeset
494
a61af66fc99e Initial load
duke
parents:
diff changeset
495 public:
a61af66fc99e Initial load
duke
parents:
diff changeset
496 ArrayCopyStub(LIR_OpArrayCopy* op): _op(op) { }
a61af66fc99e Initial load
duke
parents:
diff changeset
497
a61af66fc99e Initial load
duke
parents:
diff changeset
498 LIR_Opr src() const { return _op->src(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
499 LIR_Opr src_pos() const { return _op->src_pos(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
500 LIR_Opr dst() const { return _op->dst(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
501 LIR_Opr dst_pos() const { return _op->dst_pos(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
502 LIR_Opr length() const { return _op->length(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
503 LIR_Opr tmp() const { return _op->tmp(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
504
a61af66fc99e Initial load
duke
parents:
diff changeset
505 virtual void emit_code(LIR_Assembler* e);
a61af66fc99e Initial load
duke
parents:
diff changeset
506 virtual CodeEmitInfo* info() const { return _op->info(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
507 virtual void visit(LIR_OpVisitState* visitor) {
a61af66fc99e Initial load
duke
parents:
diff changeset
508 // don't pass in the code emit info since it's processed in the fast path
a61af66fc99e Initial load
duke
parents:
diff changeset
509 visitor->do_slow_case();
a61af66fc99e Initial load
duke
parents:
diff changeset
510 }
a61af66fc99e Initial load
duke
parents:
diff changeset
511 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
512 virtual void print_name(outputStream* out) const { out->print("ArrayCopyStub"); }
a61af66fc99e Initial load
duke
parents:
diff changeset
513 #endif // PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
514 };
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
515
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
516 //////////////////////////////////////////////////////////////////////////////////////////
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
517 #ifndef SERIALGC
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
518
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
519 // Code stubs for Garbage-First barriers.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
520 class G1PreBarrierStub: public CodeStub {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
521 private:
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
522 bool _do_load;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
523 LIR_Opr _addr;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
524 LIR_Opr _pre_val;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
525 LIR_PatchCode _patch_code;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
526 CodeEmitInfo* _info;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
527
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
528 public:
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
529 // Version that _does_ generate a load of the previous value from addr.
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
530 // addr (the address of the field to be read) must be a LIR_Address
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
531 // pre_val (a temporary register) must be a register;
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
532 G1PreBarrierStub(LIR_Opr addr, LIR_Opr pre_val, LIR_PatchCode patch_code, CodeEmitInfo* info) :
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
533 _addr(addr), _pre_val(pre_val), _do_load(true),
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
534 _patch_code(patch_code), _info(info)
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
535 {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
536 assert(_pre_val->is_register(), "should be temporary register");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
537 assert(_addr->is_address(), "should be the address of the field");
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
538 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
539
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
540 // Version that _does not_ generate load of the previous value; the
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
541 // previous value is assumed to have already been loaded into pre_val.
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
542 G1PreBarrierStub(LIR_Opr pre_val) :
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
543 _addr(LIR_OprFact::illegalOpr), _pre_val(pre_val), _do_load(false),
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
544 _patch_code(lir_patch_none), _info(NULL)
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
545 {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
546 assert(_pre_val->is_register(), "should be a register");
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
547 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
548
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
549 LIR_Opr addr() const { return _addr; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
550 LIR_Opr pre_val() const { return _pre_val; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
551 LIR_PatchCode patch_code() const { return _patch_code; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
552 CodeEmitInfo* info() const { return _info; }
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
553 bool do_load() const { return _do_load; }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
554
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
555 virtual void emit_code(LIR_Assembler* e);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
556 virtual void visit(LIR_OpVisitState* visitor) {
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
557 if (_do_load) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
558 // don't pass in the code emit info since it's processed in the fast
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
559 // path
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
560 if (_info != NULL)
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
561 visitor->do_slow_case(_info);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
562 else
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
563 visitor->do_slow_case();
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
564
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
565 visitor->do_input(_addr);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
566 visitor->do_temp(_pre_val);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
567 } else {
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
568 visitor->do_slow_case();
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
569 visitor->do_input(_pre_val);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
570 }
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
571 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
572 #ifndef PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
573 virtual void print_name(outputStream* out) const { out->print("G1PreBarrierStub"); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
574 #endif // PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
575 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
576
3249
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
577 // This G1 barrier code stub is used in Unsafe.getObject.
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
578 // It generates a sequence of guards around the SATB
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
579 // barrier code that are used to detect when we have
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
580 // the referent field of a Reference object.
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
581 // The first check is assumed to have been generated
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
582 // in the code generated for Unsafe.getObject().
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
583
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
584 class G1UnsafeGetObjSATBBarrierStub: public CodeStub {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
585 private:
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
586 LIR_Opr _val;
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
587 LIR_Opr _src;
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
588
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
589 LIR_Opr _tmp;
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
590 LIR_Opr _thread;
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
591
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
592 bool _gen_src_check;
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
593
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
594 public:
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
595 // A G1 barrier that is guarded by generated guards that determine whether
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
596 // val (which is the result of Unsafe.getObject() should be recorded in an
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
597 // SATB log buffer. We could be reading the referent field of a Reference object
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
598 // using Unsafe.getObject() and we need to record the referent.
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
599 //
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
600 // * val is the operand returned by the unsafe.getObject routine.
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
601 // * src is the base object
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
602 // * tmp is a temp used to load the klass of src, and then reference type
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
603 // * thread is the thread object.
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
604
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
605 G1UnsafeGetObjSATBBarrierStub(LIR_Opr val, LIR_Opr src,
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
606 LIR_Opr tmp, LIR_Opr thread,
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
607 bool gen_src_check) :
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
608 _val(val), _src(src),
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
609 _tmp(tmp), _thread(thread),
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
610 _gen_src_check(gen_src_check)
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
611 {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
612 assert(_val->is_register(), "should have already been loaded");
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
613 assert(_src->is_register(), "should have already been loaded");
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
614
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
615 assert(_tmp->is_register(), "should be a temporary register");
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
616 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
617
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
618 LIR_Opr val() const { return _val; }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
619 LIR_Opr src() const { return _src; }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
620
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
621 LIR_Opr tmp() const { return _tmp; }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
622 LIR_Opr thread() const { return _thread; }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
623
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
624 bool gen_src_check() const { return _gen_src_check; }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
625
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
626 virtual void emit_code(LIR_Assembler* e);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
627
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
628 virtual void visit(LIR_OpVisitState* visitor) {
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
629 visitor->do_slow_case();
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
630 visitor->do_input(_val);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
631 visitor->do_input(_src);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
632 visitor->do_input(_thread);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
633
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
634 visitor->do_temp(_tmp);
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
635 }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
636
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
637 #ifndef PRODUCT
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
638 virtual void print_name(outputStream* out) const { out->print("G1UnsafeGetObjSATBBarrierStub"); }
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
639 #endif // PRODUCT
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
640 };
e1162778c1c8 7009266: G1: assert(obj->is_oop_or_null(true )) failed: Error
johnc
parents: 2168
diff changeset
641
342
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
642 class G1PostBarrierStub: public CodeStub {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
643 private:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
644 LIR_Opr _addr;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
645 LIR_Opr _new_val;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
646
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
647 static jbyte* _byte_map_base;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
648 static jbyte* byte_map_base_slow();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
649 static jbyte* byte_map_base() {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
650 if (_byte_map_base == NULL) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
651 _byte_map_base = byte_map_base_slow();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
652 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
653 return _byte_map_base;
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
654 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
655
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
656 public:
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
657 // addr (the address of the object head) and new_val must be registers.
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
658 G1PostBarrierStub(LIR_Opr addr, LIR_Opr new_val): _addr(addr), _new_val(new_val) { }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
659
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
660 LIR_Opr addr() const { return _addr; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
661 LIR_Opr new_val() const { return _new_val; }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
662
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
663 virtual void emit_code(LIR_Assembler* e);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
664 virtual void visit(LIR_OpVisitState* visitor) {
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
665 // don't pass in the code emit info since it's processed in the fast path
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
666 visitor->do_slow_case();
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
667 visitor->do_input(_addr);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
668 visitor->do_input(_new_val);
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
669 }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
670 #ifndef PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
671 virtual void print_name(outputStream* out) const { out->print("G1PostBarrierStub"); }
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
672 #endif // PRODUCT
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
673 };
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
674
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
675 #endif // SERIALGC
37f87013dfd8 6711316: Open source the Garbage-First garbage collector
ysr
parents: 0
diff changeset
676 //////////////////////////////////////////////////////////////////////////////////////////
1972
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
677
f95d63e2154a 6989984: Use standard include model for Hospot
stefank
parents: 1783
diff changeset
678 #endif // SHARE_VM_C1_C1_CODESTUBS_HPP