annotate src/share/vm/runtime/stubRoutines.cpp @ 1721:413ad0331a0c

6977924: Changes for 6975078 produce build error with certain gcc versions Summary: The changes introduced for 6975078 assign badHeapOopVal to the _allocation field in the ResourceObj class. In 32 bit linux builds with certain versions of gcc this assignment will be flagged as an error while compiling allocation.cpp. In 32 bit builds the constant value badHeapOopVal (which is cast to an intptr_t) is negative. The _allocation field is typed as an unsigned intptr_t and gcc catches this as an error. Reviewed-by: jcoomes, ysr, phh
author johnc
date Wed, 18 Aug 2010 10:59:06 -0700
parents d93949c5bdcc
children 3e8fbc61cee8 d6f45b55c972
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
a61af66fc99e Initial load
duke
parents:
diff changeset
1 /*
1552
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1490
diff changeset
2 * Copyright (c) 1997, 2010, 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: 1490
diff changeset
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
c18cbe5936b8 6941466: Oracle rebranding changes for Hotspot repositories
trims
parents: 1490
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: 1490
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
a61af66fc99e Initial load
duke
parents:
diff changeset
25 #include "incls/_precompiled.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
26 #include "incls/_stubRoutines.cpp.incl"
a61af66fc99e Initial load
duke
parents:
diff changeset
27
a61af66fc99e Initial load
duke
parents:
diff changeset
28
a61af66fc99e Initial load
duke
parents:
diff changeset
29 // Implementation of StubRoutines - for a description
a61af66fc99e Initial load
duke
parents:
diff changeset
30 // of how to extend it, see the header file.
a61af66fc99e Initial load
duke
parents:
diff changeset
31
a61af66fc99e Initial load
duke
parents:
diff changeset
32 // Class Variables
a61af66fc99e Initial load
duke
parents:
diff changeset
33
a61af66fc99e Initial load
duke
parents:
diff changeset
34 BufferBlob* StubRoutines::_code1 = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
35 BufferBlob* StubRoutines::_code2 = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
36
a61af66fc99e Initial load
duke
parents:
diff changeset
37 address StubRoutines::_call_stub_return_address = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
38 address StubRoutines::_call_stub_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
39
a61af66fc99e Initial load
duke
parents:
diff changeset
40 address StubRoutines::_catch_exception_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
41 address StubRoutines::_forward_exception_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
42 address StubRoutines::_throw_AbstractMethodError_entry = NULL;
16
f8236e79048a 6664627: Merge changes made only in hotspot 11 forward to jdk 7
dcubed
parents: 0
diff changeset
43 address StubRoutines::_throw_IncompatibleClassChangeError_entry = NULL;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
44 address StubRoutines::_throw_ArithmeticException_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
45 address StubRoutines::_throw_NullPointerException_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
46 address StubRoutines::_throw_NullPointerException_at_call_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
47 address StubRoutines::_throw_StackOverflowError_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
48 address StubRoutines::_handler_for_unsafe_access_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
49 jint StubRoutines::_verify_oop_count = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
50 address StubRoutines::_verify_oop_subroutine_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
51 address StubRoutines::_atomic_xchg_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
52 address StubRoutines::_atomic_xchg_ptr_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
53 address StubRoutines::_atomic_store_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
54 address StubRoutines::_atomic_store_ptr_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
55 address StubRoutines::_atomic_cmpxchg_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
56 address StubRoutines::_atomic_cmpxchg_ptr_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
57 address StubRoutines::_atomic_cmpxchg_long_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
58 address StubRoutines::_atomic_add_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
59 address StubRoutines::_atomic_add_ptr_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
60 address StubRoutines::_fence_entry = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
61 address StubRoutines::_d2i_wrapper = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
62 address StubRoutines::_d2l_wrapper = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
63
a61af66fc99e Initial load
duke
parents:
diff changeset
64 jint StubRoutines::_fpu_cntrl_wrd_std = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
65 jint StubRoutines::_fpu_cntrl_wrd_24 = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
66 jint StubRoutines::_fpu_cntrl_wrd_64 = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
67 jint StubRoutines::_fpu_cntrl_wrd_trunc = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
68 jint StubRoutines::_mxcsr_std = 0;
a61af66fc99e Initial load
duke
parents:
diff changeset
69 jint StubRoutines::_fpu_subnormal_bias1[3] = { 0, 0, 0 };
a61af66fc99e Initial load
duke
parents:
diff changeset
70 jint StubRoutines::_fpu_subnormal_bias2[3] = { 0, 0, 0 };
a61af66fc99e Initial load
duke
parents:
diff changeset
71
a61af66fc99e Initial load
duke
parents:
diff changeset
72 // Compiled code entry points default values
a61af66fc99e Initial load
duke
parents:
diff changeset
73 // The dafault functions don't have separate disjoint versions.
a61af66fc99e Initial load
duke
parents:
diff changeset
74 address StubRoutines::_jbyte_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jbyte_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
75 address StubRoutines::_jshort_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jshort_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
76 address StubRoutines::_jint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jint_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
77 address StubRoutines::_jlong_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jlong_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
78 address StubRoutines::_oop_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
79 address StubRoutines::_jbyte_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jbyte_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
80 address StubRoutines::_jshort_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jshort_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
81 address StubRoutines::_jint_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jint_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
82 address StubRoutines::_jlong_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::jlong_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
83 address StubRoutines::_oop_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::oop_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
84
a61af66fc99e Initial load
duke
parents:
diff changeset
85 address StubRoutines::_arrayof_jbyte_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jbyte_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
86 address StubRoutines::_arrayof_jshort_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jshort_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
87 address StubRoutines::_arrayof_jint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jint_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
88 address StubRoutines::_arrayof_jlong_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jlong_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
89 address StubRoutines::_arrayof_oop_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
90 address StubRoutines::_arrayof_jbyte_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jbyte_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
91 address StubRoutines::_arrayof_jshort_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jshort_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
92 address StubRoutines::_arrayof_jint_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jint_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
93 address StubRoutines::_arrayof_jlong_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_jlong_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
94 address StubRoutines::_arrayof_oop_disjoint_arraycopy = CAST_FROM_FN_PTR(address, StubRoutines::arrayof_oop_copy);
a61af66fc99e Initial load
duke
parents:
diff changeset
95
a61af66fc99e Initial load
duke
parents:
diff changeset
96 address StubRoutines::_checkcast_arraycopy = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
97 address StubRoutines::_unsafe_arraycopy = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
98 address StubRoutines::_generic_arraycopy = NULL;
a61af66fc99e Initial load
duke
parents:
diff changeset
99
1174
ddb7834449d0 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 16
diff changeset
100 double (* StubRoutines::_intrinsic_log )(double) = NULL;
ddb7834449d0 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 16
diff changeset
101 double (* StubRoutines::_intrinsic_log10 )(double) = NULL;
ddb7834449d0 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 16
diff changeset
102 double (* StubRoutines::_intrinsic_exp )(double) = NULL;
ddb7834449d0 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 16
diff changeset
103 double (* StubRoutines::_intrinsic_pow )(double, double) = NULL;
ddb7834449d0 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 16
diff changeset
104 double (* StubRoutines::_intrinsic_sin )(double) = NULL;
ddb7834449d0 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 16
diff changeset
105 double (* StubRoutines::_intrinsic_cos )(double) = NULL;
ddb7834449d0 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 16
diff changeset
106 double (* StubRoutines::_intrinsic_tan )(double) = NULL;
ddb7834449d0 6849984: Value methods for platform dependent math functions constant fold incorrectly
never
parents: 16
diff changeset
107
0
a61af66fc99e Initial load
duke
parents:
diff changeset
108 // Initialization
a61af66fc99e Initial load
duke
parents:
diff changeset
109 //
a61af66fc99e Initial load
duke
parents:
diff changeset
110 // Note: to break cycle with universe initialization, stubs are generated in two phases.
a61af66fc99e Initial load
duke
parents:
diff changeset
111 // The first one generates stubs needed during universe init (e.g., _handle_must_compile_first_entry).
a61af66fc99e Initial load
duke
parents:
diff changeset
112 // The second phase includes all other stubs (which may depend on universe being initialized.)
a61af66fc99e Initial load
duke
parents:
diff changeset
113
a61af66fc99e Initial load
duke
parents:
diff changeset
114 extern void StubGenerator_generate(CodeBuffer* code, bool all); // only interface to generators
a61af66fc99e Initial load
duke
parents:
diff changeset
115
a61af66fc99e Initial load
duke
parents:
diff changeset
116 void StubRoutines::initialize1() {
a61af66fc99e Initial load
duke
parents:
diff changeset
117 if (_code1 == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
118 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
119 TraceTime timer("StubRoutines generation 1", TraceStartupTime);
a61af66fc99e Initial load
duke
parents:
diff changeset
120 _code1 = BufferBlob::create("StubRoutines (1)", code_size1);
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 1245
diff changeset
121 if (_code1 == NULL) {
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 1245
diff changeset
122 vm_exit_out_of_memory(code_size1,
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 1245
diff changeset
123 "CodeCache: no room for StubRoutines (1)");
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 1245
diff changeset
124 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
125 CodeBuffer buffer(_code1->instructions_begin(), _code1->instructions_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
126 StubGenerator_generate(&buffer, false);
a61af66fc99e Initial load
duke
parents:
diff changeset
127 }
a61af66fc99e Initial load
duke
parents:
diff changeset
128 }
a61af66fc99e Initial load
duke
parents:
diff changeset
129
a61af66fc99e Initial load
duke
parents:
diff changeset
130
a61af66fc99e Initial load
duke
parents:
diff changeset
131 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
132 typedef void (*arraycopy_fn)(address src, address dst, int count);
a61af66fc99e Initial load
duke
parents:
diff changeset
133
a61af66fc99e Initial load
duke
parents:
diff changeset
134 // simple tests of generated arraycopy functions
a61af66fc99e Initial load
duke
parents:
diff changeset
135 static void test_arraycopy_func(address func, int alignment) {
a61af66fc99e Initial load
duke
parents:
diff changeset
136 int v = 0xcc;
a61af66fc99e Initial load
duke
parents:
diff changeset
137 int v2 = 0x11;
1603
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
138 jlong lbuffer[8];
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
139 jlong lbuffer2[8];
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
140 address fbuffer = (address) lbuffer;
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
141 address fbuffer2 = (address) lbuffer2;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
142 unsigned int i;
a61af66fc99e Initial load
duke
parents:
diff changeset
143 for (i = 0; i < sizeof(lbuffer); i++) {
1603
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
144 fbuffer[i] = v; fbuffer2[i] = v2;
0
a61af66fc99e Initial load
duke
parents:
diff changeset
145 }
1603
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
146 // C++ does not guarantee jlong[] array alignment to 8 bytes.
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
147 // Use middle of array to check that memory before it is not modified.
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
148 address buffer = (address) round_to((intptr_t)&lbuffer[4], BytesPerLong);
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
149 address buffer2 = (address) round_to((intptr_t)&lbuffer2[4], BytesPerLong);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
150 // do an aligned copy
a61af66fc99e Initial load
duke
parents:
diff changeset
151 ((arraycopy_fn)func)(buffer, buffer2, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
152 for (i = 0; i < sizeof(lbuffer); i++) {
1603
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
153 assert(fbuffer[i] == v && fbuffer2[i] == v2, "shouldn't have copied anything");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
154 }
a61af66fc99e Initial load
duke
parents:
diff changeset
155 // adjust destination alignment
a61af66fc99e Initial load
duke
parents:
diff changeset
156 ((arraycopy_fn)func)(buffer, buffer2 + alignment, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
157 for (i = 0; i < sizeof(lbuffer); i++) {
1603
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
158 assert(fbuffer[i] == v && fbuffer2[i] == v2, "shouldn't have copied anything");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
159 }
a61af66fc99e Initial load
duke
parents:
diff changeset
160 // adjust source alignment
a61af66fc99e Initial load
duke
parents:
diff changeset
161 ((arraycopy_fn)func)(buffer + alignment, buffer2, 0);
a61af66fc99e Initial load
duke
parents:
diff changeset
162 for (i = 0; i < sizeof(lbuffer); i++) {
1603
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
163 assert(fbuffer[i] == v && fbuffer2[i] == v2, "shouldn't have copied anything");
0
a61af66fc99e Initial load
duke
parents:
diff changeset
164 }
a61af66fc99e Initial load
duke
parents:
diff changeset
165 }
a61af66fc99e Initial load
duke
parents:
diff changeset
166 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
167
a61af66fc99e Initial load
duke
parents:
diff changeset
168
a61af66fc99e Initial load
duke
parents:
diff changeset
169 void StubRoutines::initialize2() {
a61af66fc99e Initial load
duke
parents:
diff changeset
170 if (_code2 == NULL) {
a61af66fc99e Initial load
duke
parents:
diff changeset
171 ResourceMark rm;
a61af66fc99e Initial load
duke
parents:
diff changeset
172 TraceTime timer("StubRoutines generation 2", TraceStartupTime);
a61af66fc99e Initial load
duke
parents:
diff changeset
173 _code2 = BufferBlob::create("StubRoutines (2)", code_size2);
1490
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 1245
diff changeset
174 if (_code2 == NULL) {
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 1245
diff changeset
175 vm_exit_out_of_memory(code_size2,
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 1245
diff changeset
176 "CodeCache: no room for StubRoutines (2)");
f03d0a26bf83 6888954: argument formatting for assert() and friends
jcoomes
parents: 1245
diff changeset
177 }
0
a61af66fc99e Initial load
duke
parents:
diff changeset
178 CodeBuffer buffer(_code2->instructions_begin(), _code2->instructions_size());
a61af66fc99e Initial load
duke
parents:
diff changeset
179 StubGenerator_generate(&buffer, true);
a61af66fc99e Initial load
duke
parents:
diff changeset
180 }
a61af66fc99e Initial load
duke
parents:
diff changeset
181
a61af66fc99e Initial load
duke
parents:
diff changeset
182 #ifdef ASSERT
a61af66fc99e Initial load
duke
parents:
diff changeset
183
a61af66fc99e Initial load
duke
parents:
diff changeset
184 #define TEST_ARRAYCOPY(type) \
a61af66fc99e Initial load
duke
parents:
diff changeset
185 test_arraycopy_func( type##_arraycopy(), sizeof(type)); \
a61af66fc99e Initial load
duke
parents:
diff changeset
186 test_arraycopy_func( type##_disjoint_arraycopy(), sizeof(type)); \
a61af66fc99e Initial load
duke
parents:
diff changeset
187 test_arraycopy_func(arrayof_##type##_arraycopy(), sizeof(HeapWord)); \
a61af66fc99e Initial load
duke
parents:
diff changeset
188 test_arraycopy_func(arrayof_##type##_disjoint_arraycopy(), sizeof(HeapWord))
a61af66fc99e Initial load
duke
parents:
diff changeset
189
1603
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
190 // Make sure all the arraycopy stubs properly handle zero count
0
a61af66fc99e Initial load
duke
parents:
diff changeset
191 TEST_ARRAYCOPY(jbyte);
a61af66fc99e Initial load
duke
parents:
diff changeset
192 TEST_ARRAYCOPY(jshort);
a61af66fc99e Initial load
duke
parents:
diff changeset
193 TEST_ARRAYCOPY(jint);
a61af66fc99e Initial load
duke
parents:
diff changeset
194 TEST_ARRAYCOPY(jlong);
a61af66fc99e Initial load
duke
parents:
diff changeset
195
a61af66fc99e Initial load
duke
parents:
diff changeset
196 #undef TEST_ARRAYCOPY
a61af66fc99e Initial load
duke
parents:
diff changeset
197
1603
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
198 #define TEST_COPYRTN(type) \
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
199 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::conjoint_##type##s_atomic), sizeof(type)); \
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
200 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::arrayof_conjoint_##type##s), (int)MAX2(sizeof(HeapWord), sizeof(type)))
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
201
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
202 // Make sure all the copy runtime routines properly handle zero count
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
203 TEST_COPYRTN(jbyte);
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
204 TEST_COPYRTN(jshort);
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
205 TEST_COPYRTN(jint);
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
206 TEST_COPYRTN(jlong);
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
207
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
208 #undef TEST_COPYRTN
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
209
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
210 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::conjoint_words), sizeof(HeapWord));
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
211 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::disjoint_words), sizeof(HeapWord));
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
212 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::disjoint_words_atomic), sizeof(HeapWord));
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
213 // Aligned to BytesPerLong
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
214 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::aligned_conjoint_words), sizeof(jlong));
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
215 test_arraycopy_func(CAST_FROM_FN_PTR(address, Copy::aligned_disjoint_words), sizeof(jlong));
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
216
0
a61af66fc99e Initial load
duke
parents:
diff changeset
217 #endif
a61af66fc99e Initial load
duke
parents:
diff changeset
218 }
a61af66fc99e Initial load
duke
parents:
diff changeset
219
a61af66fc99e Initial load
duke
parents:
diff changeset
220
a61af66fc99e Initial load
duke
parents:
diff changeset
221 void stubRoutines_init1() { StubRoutines::initialize1(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
222 void stubRoutines_init2() { StubRoutines::initialize2(); }
a61af66fc99e Initial load
duke
parents:
diff changeset
223
a61af66fc99e Initial load
duke
parents:
diff changeset
224 //
a61af66fc99e Initial load
duke
parents:
diff changeset
225 // Default versions of arraycopy functions
a61af66fc99e Initial load
duke
parents:
diff changeset
226 //
a61af66fc99e Initial load
duke
parents:
diff changeset
227
1245
6484c4ee11cb 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 1174
diff changeset
228 static void gen_arraycopy_barrier_pre(oop* dest, size_t count) {
6484c4ee11cb 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 1174
diff changeset
229 assert(count != 0, "count should be non-zero");
6484c4ee11cb 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 1174
diff changeset
230 assert(count <= (size_t)max_intx, "count too large");
6484c4ee11cb 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 1174
diff changeset
231 BarrierSet* bs = Universe::heap()->barrier_set();
6484c4ee11cb 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 1174
diff changeset
232 assert(bs->has_write_ref_array_pre_opt(), "Must have pre-barrier opt");
6484c4ee11cb 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 1174
diff changeset
233 bs->write_ref_array_pre(dest, (int)count);
6484c4ee11cb 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 1174
diff changeset
234 }
6484c4ee11cb 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 1174
diff changeset
235
0
a61af66fc99e Initial load
duke
parents:
diff changeset
236 static void gen_arraycopy_barrier(oop* dest, size_t count) {
a61af66fc99e Initial load
duke
parents:
diff changeset
237 assert(count != 0, "count should be non-zero");
a61af66fc99e Initial load
duke
parents:
diff changeset
238 BarrierSet* bs = Universe::heap()->barrier_set();
a61af66fc99e Initial load
duke
parents:
diff changeset
239 assert(bs->has_write_ref_array_opt(), "Barrier set must have ref array opt");
1245
6484c4ee11cb 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 1174
diff changeset
240 bs->write_ref_array((HeapWord*)dest, count);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
241 }
a61af66fc99e Initial load
duke
parents:
diff changeset
242
a61af66fc99e Initial load
duke
parents:
diff changeset
243 JRT_LEAF(void, StubRoutines::jbyte_copy(jbyte* src, jbyte* dest, size_t count))
a61af66fc99e Initial load
duke
parents:
diff changeset
244 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
245 SharedRuntime::_jbyte_array_copy_ctr++; // Slow-path byte array copy
a61af66fc99e Initial load
duke
parents:
diff changeset
246 #endif // !PRODUCT
1603
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
247 Copy::conjoint_jbytes_atomic(src, dest, count);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
248 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
249
a61af66fc99e Initial load
duke
parents:
diff changeset
250 JRT_LEAF(void, StubRoutines::jshort_copy(jshort* src, jshort* dest, size_t count))
a61af66fc99e Initial load
duke
parents:
diff changeset
251 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
252 SharedRuntime::_jshort_array_copy_ctr++; // Slow-path short/char array copy
a61af66fc99e Initial load
duke
parents:
diff changeset
253 #endif // !PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
254 Copy::conjoint_jshorts_atomic(src, dest, count);
a61af66fc99e Initial load
duke
parents:
diff changeset
255 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
256
a61af66fc99e Initial load
duke
parents:
diff changeset
257 JRT_LEAF(void, StubRoutines::jint_copy(jint* src, jint* dest, size_t count))
a61af66fc99e Initial load
duke
parents:
diff changeset
258 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
259 SharedRuntime::_jint_array_copy_ctr++; // Slow-path int/float array copy
a61af66fc99e Initial load
duke
parents:
diff changeset
260 #endif // !PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
261 Copy::conjoint_jints_atomic(src, dest, count);
a61af66fc99e Initial load
duke
parents:
diff changeset
262 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
263
a61af66fc99e Initial load
duke
parents:
diff changeset
264 JRT_LEAF(void, StubRoutines::jlong_copy(jlong* src, jlong* dest, size_t count))
a61af66fc99e Initial load
duke
parents:
diff changeset
265 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
266 SharedRuntime::_jlong_array_copy_ctr++; // Slow-path long/double array copy
a61af66fc99e Initial load
duke
parents:
diff changeset
267 #endif // !PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
268 Copy::conjoint_jlongs_atomic(src, dest, count);
a61af66fc99e Initial load
duke
parents:
diff changeset
269 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
270
a61af66fc99e Initial load
duke
parents:
diff changeset
271 JRT_LEAF(void, StubRoutines::oop_copy(oop* src, oop* dest, size_t count))
a61af66fc99e Initial load
duke
parents:
diff changeset
272 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
273 SharedRuntime::_oop_array_copy_ctr++; // Slow-path oop array copy
a61af66fc99e Initial load
duke
parents:
diff changeset
274 #endif // !PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
275 assert(count != 0, "count should be non-zero");
1245
6484c4ee11cb 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 1174
diff changeset
276 gen_arraycopy_barrier_pre(dest, count);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
277 Copy::conjoint_oops_atomic(src, dest, count);
a61af66fc99e Initial load
duke
parents:
diff changeset
278 gen_arraycopy_barrier(dest, count);
a61af66fc99e Initial load
duke
parents:
diff changeset
279 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
280
a61af66fc99e Initial load
duke
parents:
diff changeset
281 JRT_LEAF(void, StubRoutines::arrayof_jbyte_copy(HeapWord* src, HeapWord* dest, size_t count))
a61af66fc99e Initial load
duke
parents:
diff changeset
282 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
283 SharedRuntime::_jbyte_array_copy_ctr++; // Slow-path byte array copy
a61af66fc99e Initial load
duke
parents:
diff changeset
284 #endif // !PRODUCT
1603
d93949c5bdcc 6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
kvn
parents: 1552
diff changeset
285 Copy::arrayof_conjoint_jbytes(src, dest, count);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
286 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
287
a61af66fc99e Initial load
duke
parents:
diff changeset
288 JRT_LEAF(void, StubRoutines::arrayof_jshort_copy(HeapWord* src, HeapWord* dest, size_t count))
a61af66fc99e Initial load
duke
parents:
diff changeset
289 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
290 SharedRuntime::_jshort_array_copy_ctr++; // Slow-path short/char array copy
a61af66fc99e Initial load
duke
parents:
diff changeset
291 #endif // !PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
292 Copy::arrayof_conjoint_jshorts(src, dest, count);
a61af66fc99e Initial load
duke
parents:
diff changeset
293 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
294
a61af66fc99e Initial load
duke
parents:
diff changeset
295 JRT_LEAF(void, StubRoutines::arrayof_jint_copy(HeapWord* src, HeapWord* dest, size_t count))
a61af66fc99e Initial load
duke
parents:
diff changeset
296 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
297 SharedRuntime::_jint_array_copy_ctr++; // Slow-path int/float array copy
a61af66fc99e Initial load
duke
parents:
diff changeset
298 #endif // !PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
299 Copy::arrayof_conjoint_jints(src, dest, count);
a61af66fc99e Initial load
duke
parents:
diff changeset
300 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
301
a61af66fc99e Initial load
duke
parents:
diff changeset
302 JRT_LEAF(void, StubRoutines::arrayof_jlong_copy(HeapWord* src, HeapWord* dest, size_t count))
a61af66fc99e Initial load
duke
parents:
diff changeset
303 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
304 SharedRuntime::_jlong_array_copy_ctr++; // Slow-path int/float array copy
a61af66fc99e Initial load
duke
parents:
diff changeset
305 #endif // !PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
306 Copy::arrayof_conjoint_jlongs(src, dest, count);
a61af66fc99e Initial load
duke
parents:
diff changeset
307 JRT_END
a61af66fc99e Initial load
duke
parents:
diff changeset
308
a61af66fc99e Initial load
duke
parents:
diff changeset
309 JRT_LEAF(void, StubRoutines::arrayof_oop_copy(HeapWord* src, HeapWord* dest, size_t count))
a61af66fc99e Initial load
duke
parents:
diff changeset
310 #ifndef PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
311 SharedRuntime::_oop_array_copy_ctr++; // Slow-path oop array copy
a61af66fc99e Initial load
duke
parents:
diff changeset
312 #endif // !PRODUCT
a61af66fc99e Initial load
duke
parents:
diff changeset
313 assert(count != 0, "count should be non-zero");
1245
6484c4ee11cb 6904516: More object array barrier fixes, following up on 6906727
ysr
parents: 1174
diff changeset
314 gen_arraycopy_barrier_pre((oop *) dest, count);
0
a61af66fc99e Initial load
duke
parents:
diff changeset
315 Copy::arrayof_conjoint_oops(src, dest, count);
a61af66fc99e Initial load
duke
parents:
diff changeset
316 gen_arraycopy_barrier((oop *) dest, count);
a61af66fc99e Initial load
duke
parents:
diff changeset
317 JRT_END