Mercurial > hg > truffle
comparison src/share/vm/utilities/copy.hpp @ 1603:d93949c5bdcc
6730276: JDI_REGRESSION tests fail with "Error: count must be non-zero" error on x86
Summary: Modify assembler code to check for 0 count for all copy routines.
Reviewed-by: never, ysr, jcoomes
author | kvn |
---|---|
date | Thu, 10 Jun 2010 13:04:20 -0700 |
parents | e9ff18c4ace7 |
children | f95d63e2154a |
comparison
equal
deleted
inserted
replaced
1602:136b78722a08 | 1603:d93949c5bdcc |
---|---|
71 // | 71 // |
72 // Except in the arrayof case, whatever the alignment is, we assume we can copy | 72 // Except in the arrayof case, whatever the alignment is, we assume we can copy |
73 // whole alignment units. E.g., if BytesPerLong is 2x word alignment, an odd | 73 // whole alignment units. E.g., if BytesPerLong is 2x word alignment, an odd |
74 // count may copy an extra word. In the arrayof case, we are allowed to copy | 74 // count may copy an extra word. In the arrayof case, we are allowed to copy |
75 // only the number of copy units specified. | 75 // only the number of copy units specified. |
76 // | |
77 // All callees check count for 0. | |
78 // | |
76 | 79 |
77 // HeapWords | 80 // HeapWords |
78 | 81 |
79 // Word-aligned words, conjoint, not atomic on each word | 82 // Word-aligned words, conjoint, not atomic on each word |
80 static void conjoint_words(HeapWord* from, HeapWord* to, size_t count) { | 83 static void conjoint_words(HeapWord* from, HeapWord* to, size_t count) { |
97 } | 100 } |
98 | 101 |
99 // Object-aligned words, conjoint, not atomic on each word | 102 // Object-aligned words, conjoint, not atomic on each word |
100 static void aligned_conjoint_words(HeapWord* from, HeapWord* to, size_t count) { | 103 static void aligned_conjoint_words(HeapWord* from, HeapWord* to, size_t count) { |
101 assert_params_aligned(from, to); | 104 assert_params_aligned(from, to); |
102 assert_non_zero(count); | |
103 pd_aligned_conjoint_words(from, to, count); | 105 pd_aligned_conjoint_words(from, to, count); |
104 } | 106 } |
105 | 107 |
106 // Object-aligned words, disjoint, not atomic on each word | 108 // Object-aligned words, disjoint, not atomic on each word |
107 static void aligned_disjoint_words(HeapWord* from, HeapWord* to, size_t count) { | 109 static void aligned_disjoint_words(HeapWord* from, HeapWord* to, size_t count) { |
108 assert_params_aligned(from, to); | 110 assert_params_aligned(from, to); |
109 assert_disjoint(from, to, count); | 111 assert_disjoint(from, to, count); |
110 assert_non_zero(count); | |
111 pd_aligned_disjoint_words(from, to, count); | 112 pd_aligned_disjoint_words(from, to, count); |
112 } | 113 } |
113 | 114 |
114 // bytes, jshorts, jints, jlongs, oops | 115 // bytes, jshorts, jints, jlongs, oops |
115 | 116 |
116 // bytes, conjoint, not atomic on each byte (not that it matters) | 117 // bytes, conjoint, not atomic on each byte (not that it matters) |
117 static void conjoint_bytes(void* from, void* to, size_t count) { | 118 static void conjoint_jbytes(void* from, void* to, size_t count) { |
118 assert_non_zero(count); | |
119 pd_conjoint_bytes(from, to, count); | 119 pd_conjoint_bytes(from, to, count); |
120 } | 120 } |
121 | 121 |
122 // bytes, conjoint, atomic on each byte (not that it matters) | 122 // bytes, conjoint, atomic on each byte (not that it matters) |
123 static void conjoint_bytes_atomic(void* from, void* to, size_t count) { | 123 static void conjoint_jbytes_atomic(void* from, void* to, size_t count) { |
124 assert_non_zero(count); | |
125 pd_conjoint_bytes(from, to, count); | 124 pd_conjoint_bytes(from, to, count); |
126 } | 125 } |
127 | 126 |
128 // jshorts, conjoint, atomic on each jshort | 127 // jshorts, conjoint, atomic on each jshort |
129 static void conjoint_jshorts_atomic(jshort* from, jshort* to, size_t count) { | 128 static void conjoint_jshorts_atomic(jshort* from, jshort* to, size_t count) { |
130 assert_params_ok(from, to, LogBytesPerShort); | 129 assert_params_ok(from, to, LogBytesPerShort); |
131 assert_non_zero(count); | |
132 pd_conjoint_jshorts_atomic(from, to, count); | 130 pd_conjoint_jshorts_atomic(from, to, count); |
133 } | 131 } |
134 | 132 |
135 // jints, conjoint, atomic on each jint | 133 // jints, conjoint, atomic on each jint |
136 static void conjoint_jints_atomic(jint* from, jint* to, size_t count) { | 134 static void conjoint_jints_atomic(jint* from, jint* to, size_t count) { |
137 assert_params_ok(from, to, LogBytesPerInt); | 135 assert_params_ok(from, to, LogBytesPerInt); |
138 assert_non_zero(count); | |
139 pd_conjoint_jints_atomic(from, to, count); | 136 pd_conjoint_jints_atomic(from, to, count); |
140 } | 137 } |
141 | 138 |
142 // jlongs, conjoint, atomic on each jlong | 139 // jlongs, conjoint, atomic on each jlong |
143 static void conjoint_jlongs_atomic(jlong* from, jlong* to, size_t count) { | 140 static void conjoint_jlongs_atomic(jlong* from, jlong* to, size_t count) { |
144 assert_params_ok(from, to, LogBytesPerLong); | 141 assert_params_ok(from, to, LogBytesPerLong); |
145 assert_non_zero(count); | |
146 pd_conjoint_jlongs_atomic(from, to, count); | 142 pd_conjoint_jlongs_atomic(from, to, count); |
147 } | 143 } |
148 | 144 |
149 // oops, conjoint, atomic on each oop | 145 // oops, conjoint, atomic on each oop |
150 static void conjoint_oops_atomic(oop* from, oop* to, size_t count) { | 146 static void conjoint_oops_atomic(oop* from, oop* to, size_t count) { |
151 assert_params_ok(from, to, LogBytesPerHeapOop); | 147 assert_params_ok(from, to, LogBytesPerHeapOop); |
152 assert_non_zero(count); | |
153 pd_conjoint_oops_atomic(from, to, count); | 148 pd_conjoint_oops_atomic(from, to, count); |
154 } | 149 } |
155 | 150 |
156 // overloaded for UseCompressedOops | 151 // overloaded for UseCompressedOops |
157 static void conjoint_oops_atomic(narrowOop* from, narrowOop* to, size_t count) { | 152 static void conjoint_oops_atomic(narrowOop* from, narrowOop* to, size_t count) { |
158 assert(sizeof(narrowOop) == sizeof(jint), "this cast is wrong"); | 153 assert(sizeof(narrowOop) == sizeof(jint), "this cast is wrong"); |
159 assert_params_ok(from, to, LogBytesPerInt); | 154 assert_params_ok(from, to, LogBytesPerInt); |
160 assert_non_zero(count); | |
161 pd_conjoint_jints_atomic((jint*)from, (jint*)to, count); | 155 pd_conjoint_jints_atomic((jint*)from, (jint*)to, count); |
162 } | 156 } |
163 | 157 |
164 // Copy a span of memory. If the span is an integral number of aligned | 158 // Copy a span of memory. If the span is an integral number of aligned |
165 // longs, words, or ints, copy those units atomically. | 159 // longs, words, or ints, copy those units atomically. |
166 // The largest atomic transfer unit is 8 bytes, or the largest power | 160 // The largest atomic transfer unit is 8 bytes, or the largest power |
167 // of two which divides all of from, to, and size, whichever is smaller. | 161 // of two which divides all of from, to, and size, whichever is smaller. |
168 static void conjoint_memory_atomic(void* from, void* to, size_t size); | 162 static void conjoint_memory_atomic(void* from, void* to, size_t size); |
169 | 163 |
170 // bytes, conjoint array, atomic on each byte (not that it matters) | 164 // bytes, conjoint array, atomic on each byte (not that it matters) |
171 static void arrayof_conjoint_bytes(HeapWord* from, HeapWord* to, size_t count) { | 165 static void arrayof_conjoint_jbytes(HeapWord* from, HeapWord* to, size_t count) { |
172 assert_non_zero(count); | |
173 pd_arrayof_conjoint_bytes(from, to, count); | 166 pd_arrayof_conjoint_bytes(from, to, count); |
174 } | 167 } |
175 | 168 |
176 // jshorts, conjoint array, atomic on each jshort | 169 // jshorts, conjoint array, atomic on each jshort |
177 static void arrayof_conjoint_jshorts(HeapWord* from, HeapWord* to, size_t count) { | 170 static void arrayof_conjoint_jshorts(HeapWord* from, HeapWord* to, size_t count) { |
178 assert_params_ok(from, to, LogBytesPerShort); | 171 assert_params_ok(from, to, LogBytesPerShort); |
179 assert_non_zero(count); | |
180 pd_arrayof_conjoint_jshorts(from, to, count); | 172 pd_arrayof_conjoint_jshorts(from, to, count); |
181 } | 173 } |
182 | 174 |
183 // jints, conjoint array, atomic on each jint | 175 // jints, conjoint array, atomic on each jint |
184 static void arrayof_conjoint_jints(HeapWord* from, HeapWord* to, size_t count) { | 176 static void arrayof_conjoint_jints(HeapWord* from, HeapWord* to, size_t count) { |
185 assert_params_ok(from, to, LogBytesPerInt); | 177 assert_params_ok(from, to, LogBytesPerInt); |
186 assert_non_zero(count); | |
187 pd_arrayof_conjoint_jints(from, to, count); | 178 pd_arrayof_conjoint_jints(from, to, count); |
188 } | 179 } |
189 | 180 |
190 // jlongs, conjoint array, atomic on each jlong | 181 // jlongs, conjoint array, atomic on each jlong |
191 static void arrayof_conjoint_jlongs(HeapWord* from, HeapWord* to, size_t count) { | 182 static void arrayof_conjoint_jlongs(HeapWord* from, HeapWord* to, size_t count) { |
192 assert_params_ok(from, to, LogBytesPerLong); | 183 assert_params_ok(from, to, LogBytesPerLong); |
193 assert_non_zero(count); | |
194 pd_arrayof_conjoint_jlongs(from, to, count); | 184 pd_arrayof_conjoint_jlongs(from, to, count); |
195 } | 185 } |
196 | 186 |
197 // oops, conjoint array, atomic on each oop | 187 // oops, conjoint array, atomic on each oop |
198 static void arrayof_conjoint_oops(HeapWord* from, HeapWord* to, size_t count) { | 188 static void arrayof_conjoint_oops(HeapWord* from, HeapWord* to, size_t count) { |
199 assert_params_ok(from, to, LogBytesPerHeapOop); | 189 assert_params_ok(from, to, LogBytesPerHeapOop); |
200 assert_non_zero(count); | |
201 pd_arrayof_conjoint_oops(from, to, count); | 190 pd_arrayof_conjoint_oops(from, to, count); |
202 } | 191 } |
203 | 192 |
204 // Known overlap methods | 193 // Known overlap methods |
205 | 194 |
317 if (mask_bits((uintptr_t)to, BytesPerLong-1) != 0) | 306 if (mask_bits((uintptr_t)to, BytesPerLong-1) != 0) |
318 basic_fatal("not long aligned"); | 307 basic_fatal("not long aligned"); |
319 #endif | 308 #endif |
320 } | 309 } |
321 | 310 |
322 static void assert_non_zero(size_t count) { | |
323 #ifdef ASSERT | |
324 if (count == 0) { | |
325 basic_fatal("count must be non-zero"); | |
326 } | |
327 #endif | |
328 } | |
329 | |
330 static void assert_byte_count_ok(size_t byte_count, size_t unit_size) { | 311 static void assert_byte_count_ok(size_t byte_count, size_t unit_size) { |
331 #ifdef ASSERT | 312 #ifdef ASSERT |
332 if ((size_t)round_to(byte_count, unit_size) != byte_count) { | 313 if ((size_t)round_to(byte_count, unit_size) != byte_count) { |
333 basic_fatal("byte count must be aligned"); | 314 basic_fatal("byte count must be aligned"); |
334 } | 315 } |