1 /*
2 * Copyright (c) 1997, 2021, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 *
5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation.
8 *
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 *
23 */
24
25 #include "precompiled.hpp"
26 #include "runtime/globals.hpp"
27 #include "runtime/os.hpp"
28 #include "runtime/signature.hpp"
29 #include "utilities/globalDefinitions.hpp"
30 #include "utilities/powerOfTwo.hpp"
31
32 // Basic error support
33
34 // Info for oops within a java object. Defaults are zero so
35 // things will break badly if incorrectly initialized.
36 int heapOopSize = 0;
37 int LogBytesPerHeapOop = 0;
38 int LogBitsPerHeapOop = 0;
39 int BytesPerHeapOop = 0;
40 int BitsPerHeapOop = 0;
41
42 // Object alignment, in units of HeapWords.
43 // Defaults are -1 so things will break badly if incorrectly initialized.
44 int MinObjAlignment = -1;
45 int MinObjAlignmentInBytes = -1;
46 int MinObjAlignmentInBytesMask = 0;
47
48 int LogMinObjAlignment = -1;
49 int LogMinObjAlignmentInBytes = -1;
50
51 // Oop encoding heap max
52 uint64_t OopEncodingHeapMax = 0;
53
54 // Something to help porters sleep at night
55
56 #ifdef ASSERT
char2type(int ch)57 BasicType char2type(int ch) {
58 switch (ch) {
59 #define EACH_SIG(ch, bt, ignore) \
60 case ch: return bt;
61 SIGNATURE_TYPES_DO(EACH_SIG, ignore)
62 #undef EACH_SIG
63 }
64 return T_ILLEGAL;
65 }
66
67 extern bool signature_constants_sane();
68 #endif //ASSERT
69
basic_types_init()70 void basic_types_init() {
71 #ifdef ASSERT
72 #ifdef _LP64
73 assert(min_intx == (intx)CONST64(0x8000000000000000), "correct constant");
74 assert(max_intx == CONST64(0x7FFFFFFFFFFFFFFF), "correct constant");
75 assert(max_uintx == CONST64(0xFFFFFFFFFFFFFFFF), "correct constant");
76 assert( 8 == sizeof( intx), "wrong size for basic type");
77 assert( 8 == sizeof( jobject), "wrong size for basic type");
78 #else
79 assert(min_intx == (intx)0x80000000, "correct constant");
80 assert(max_intx == 0x7FFFFFFF, "correct constant");
81 assert(max_uintx == 0xFFFFFFFF, "correct constant");
82 assert( 4 == sizeof( intx), "wrong size for basic type");
83 assert( 4 == sizeof( jobject), "wrong size for basic type");
84 #endif
85 assert( (~max_juint) == 0, "max_juint has all its bits");
86 assert( (~max_uintx) == 0, "max_uintx has all its bits");
87 assert( (~max_julong) == 0, "max_julong has all its bits");
88 assert( 1 == sizeof( jbyte), "wrong size for basic type");
89 assert( 2 == sizeof( jchar), "wrong size for basic type");
90 assert( 2 == sizeof( jshort), "wrong size for basic type");
91 assert( 4 == sizeof( juint), "wrong size for basic type");
92 assert( 4 == sizeof( jint), "wrong size for basic type");
93 assert( 1 == sizeof( jboolean), "wrong size for basic type");
94 assert( 8 == sizeof( jlong), "wrong size for basic type");
95 assert( 4 == sizeof( jfloat), "wrong size for basic type");
96 assert( 8 == sizeof( jdouble), "wrong size for basic type");
97 assert( 1 == sizeof( u1), "wrong size for basic type");
98 assert( 2 == sizeof( u2), "wrong size for basic type");
99 assert( 4 == sizeof( u4), "wrong size for basic type");
100 assert(wordSize == BytesPerWord, "should be the same since they're used interchangeably");
101 assert(wordSize == HeapWordSize, "should be the same since they're also used interchangeably");
102
103 assert(signature_constants_sane(), "");
104
105 int num_type_chars = 0;
106 for (int i = 0; i < 99; i++) {
107 if (type2char((BasicType)i) != 0) {
108 assert(char2type(type2char((BasicType)i)) == i, "proper inverses");
109 assert(Signature::basic_type(type2char((BasicType)i)) == i, "proper inverses");
110 num_type_chars++;
111 }
112 }
113 assert(num_type_chars == 11, "must have tested the right number of mappings");
114 assert(char2type(0) == T_ILLEGAL, "correct illegality");
115
116 {
117 for (int i = T_BOOLEAN; i <= T_CONFLICT; i++) {
118 BasicType vt = (BasicType)i;
119 BasicType ft = type2field[vt];
120 switch (vt) {
121 // the following types might plausibly show up in memory layouts:
122 case T_BOOLEAN:
123 case T_BYTE:
124 case T_CHAR:
125 case T_SHORT:
126 case T_INT:
127 case T_FLOAT:
128 case T_DOUBLE:
129 case T_LONG:
130 case T_OBJECT:
131 case T_ADDRESS: // random raw pointer
132 case T_METADATA: // metadata pointer
133 case T_NARROWOOP: // compressed pointer
134 case T_NARROWKLASS: // compressed klass pointer
135 case T_CONFLICT: // might as well support a bottom type
136 case T_VOID: // padding or other unaddressed word
137 // layout type must map to itself
138 assert(vt == ft, "");
139 break;
140 default:
141 // non-layout type must map to a (different) layout type
142 assert(vt != ft, "");
143 assert(ft == type2field[ft], "");
144 }
145 // every type must map to same-sized layout type:
146 assert(type2size[vt] == type2size[ft], "");
147 }
148 }
149 // These are assumed, e.g., when filling HeapWords with juints.
150 assert(is_power_of_2(sizeof(juint)), "juint must be power of 2");
151 assert(is_power_of_2(HeapWordSize), "HeapWordSize must be power of 2");
152 assert((size_t)HeapWordSize >= sizeof(juint),
153 "HeapWord should be at least as large as juint");
154 assert(sizeof(NULL) == sizeof(char*), "NULL must be same size as pointer");
155 #endif
156
157 if( JavaPriority1_To_OSPriority != -1 )
158 os::java_to_os_priority[1] = JavaPriority1_To_OSPriority;
159 if( JavaPriority2_To_OSPriority != -1 )
160 os::java_to_os_priority[2] = JavaPriority2_To_OSPriority;
161 if( JavaPriority3_To_OSPriority != -1 )
162 os::java_to_os_priority[3] = JavaPriority3_To_OSPriority;
163 if( JavaPriority4_To_OSPriority != -1 )
164 os::java_to_os_priority[4] = JavaPriority4_To_OSPriority;
165 if( JavaPriority5_To_OSPriority != -1 )
166 os::java_to_os_priority[5] = JavaPriority5_To_OSPriority;
167 if( JavaPriority6_To_OSPriority != -1 )
168 os::java_to_os_priority[6] = JavaPriority6_To_OSPriority;
169 if( JavaPriority7_To_OSPriority != -1 )
170 os::java_to_os_priority[7] = JavaPriority7_To_OSPriority;
171 if( JavaPriority8_To_OSPriority != -1 )
172 os::java_to_os_priority[8] = JavaPriority8_To_OSPriority;
173 if( JavaPriority9_To_OSPriority != -1 )
174 os::java_to_os_priority[9] = JavaPriority9_To_OSPriority;
175 if(JavaPriority10_To_OSPriority != -1 )
176 os::java_to_os_priority[10] = JavaPriority10_To_OSPriority;
177
178 // Set the size of basic types here (after argument parsing but before
179 // stub generation).
180 if (UseCompressedOops) {
181 // Size info for oops within java objects is fixed
182 heapOopSize = jintSize;
183 LogBytesPerHeapOop = LogBytesPerInt;
184 LogBitsPerHeapOop = LogBitsPerInt;
185 BytesPerHeapOop = BytesPerInt;
186 BitsPerHeapOop = BitsPerInt;
187 } else {
188 heapOopSize = oopSize;
189 LogBytesPerHeapOop = LogBytesPerWord;
190 LogBitsPerHeapOop = LogBitsPerWord;
191 BytesPerHeapOop = BytesPerWord;
192 BitsPerHeapOop = BitsPerWord;
193 }
194 _type2aelembytes[T_OBJECT] = heapOopSize;
195 _type2aelembytes[T_ARRAY] = heapOopSize;
196 }
197
198
199 // Map BasicType to signature character
200 char type2char_tab[T_CONFLICT+1] = {
201 0, 0, 0, 0,
202 JVM_SIGNATURE_BOOLEAN, JVM_SIGNATURE_CHAR,
203 JVM_SIGNATURE_FLOAT, JVM_SIGNATURE_DOUBLE,
204 JVM_SIGNATURE_BYTE, JVM_SIGNATURE_SHORT,
205 JVM_SIGNATURE_INT, JVM_SIGNATURE_LONG,
206 JVM_SIGNATURE_CLASS, JVM_SIGNATURE_ARRAY,
207 JVM_SIGNATURE_VOID, 0,
208 0, 0, 0, 0
209 };
210
211 // Map BasicType to Java type name
212 const char* type2name_tab[T_CONFLICT+1] = {
213 NULL, NULL, NULL, NULL,
214 "boolean",
215 "char",
216 "float",
217 "double",
218 "byte",
219 "short",
220 "int",
221 "long",
222 "object",
223 "array",
224 "void",
225 "*address*",
226 "*narrowoop*",
227 "*metadata*",
228 "*narrowklass*",
229 "*conflict*"
230 };
231
232
name2type(const char * name)233 BasicType name2type(const char* name) {
234 for (int i = T_BOOLEAN; i <= T_VOID; i++) {
235 BasicType t = (BasicType)i;
236 if (type2name_tab[t] != NULL && 0 == strcmp(type2name_tab[t], name))
237 return t;
238 }
239 return T_ILLEGAL;
240 }
241
242 // Map BasicType to size in words
243 int type2size[T_CONFLICT+1]={ -1, 0, 0, 0, 1, 1, 1, 2, 1, 1, 1, 2, 1, 1, 0, 1, 1, 1, 1, -1};
244
245 BasicType type2field[T_CONFLICT+1] = {
246 (BasicType)0, // 0,
247 (BasicType)0, // 1,
248 (BasicType)0, // 2,
249 (BasicType)0, // 3,
250 T_BOOLEAN, // T_BOOLEAN = 4,
251 T_CHAR, // T_CHAR = 5,
252 T_FLOAT, // T_FLOAT = 6,
253 T_DOUBLE, // T_DOUBLE = 7,
254 T_BYTE, // T_BYTE = 8,
255 T_SHORT, // T_SHORT = 9,
256 T_INT, // T_INT = 10,
257 T_LONG, // T_LONG = 11,
258 T_OBJECT, // T_OBJECT = 12,
259 T_OBJECT, // T_ARRAY = 13,
260 T_VOID, // T_VOID = 14,
261 T_ADDRESS, // T_ADDRESS = 15,
262 T_NARROWOOP, // T_NARROWOOP= 16,
263 T_METADATA, // T_METADATA = 17,
264 T_NARROWKLASS, // T_NARROWKLASS = 18,
265 T_CONFLICT // T_CONFLICT = 19,
266 };
267
268
269 BasicType type2wfield[T_CONFLICT+1] = {
270 (BasicType)0, // 0,
271 (BasicType)0, // 1,
272 (BasicType)0, // 2,
273 (BasicType)0, // 3,
274 T_INT, // T_BOOLEAN = 4,
275 T_INT, // T_CHAR = 5,
276 T_FLOAT, // T_FLOAT = 6,
277 T_DOUBLE, // T_DOUBLE = 7,
278 T_INT, // T_BYTE = 8,
279 T_INT, // T_SHORT = 9,
280 T_INT, // T_INT = 10,
281 T_LONG, // T_LONG = 11,
282 T_OBJECT, // T_OBJECT = 12,
283 T_OBJECT, // T_ARRAY = 13,
284 T_VOID, // T_VOID = 14,
285 T_ADDRESS, // T_ADDRESS = 15,
286 T_NARROWOOP, // T_NARROWOOP = 16,
287 T_METADATA, // T_METADATA = 17,
288 T_NARROWKLASS, // T_NARROWKLASS = 18,
289 T_CONFLICT // T_CONFLICT = 19,
290 };
291
292
293 int _type2aelembytes[T_CONFLICT+1] = {
294 0, // 0
295 0, // 1
296 0, // 2
297 0, // 3
298 T_BOOLEAN_aelem_bytes, // T_BOOLEAN = 4,
299 T_CHAR_aelem_bytes, // T_CHAR = 5,
300 T_FLOAT_aelem_bytes, // T_FLOAT = 6,
301 T_DOUBLE_aelem_bytes, // T_DOUBLE = 7,
302 T_BYTE_aelem_bytes, // T_BYTE = 8,
303 T_SHORT_aelem_bytes, // T_SHORT = 9,
304 T_INT_aelem_bytes, // T_INT = 10,
305 T_LONG_aelem_bytes, // T_LONG = 11,
306 T_OBJECT_aelem_bytes, // T_OBJECT = 12,
307 T_ARRAY_aelem_bytes, // T_ARRAY = 13,
308 0, // T_VOID = 14,
309 T_OBJECT_aelem_bytes, // T_ADDRESS = 15,
310 T_NARROWOOP_aelem_bytes, // T_NARROWOOP= 16,
311 T_OBJECT_aelem_bytes, // T_METADATA = 17,
312 T_NARROWKLASS_aelem_bytes, // T_NARROWKLASS= 18,
313 0 // T_CONFLICT = 19,
314 };
315
316 #ifdef ASSERT
type2aelembytes(BasicType t,bool allow_address)317 int type2aelembytes(BasicType t, bool allow_address) {
318 assert(allow_address || t != T_ADDRESS, " ");
319 return _type2aelembytes[t];
320 }
321 #endif
322
323 // Support for 64-bit integer arithmetic
324
325 // The following code is mostly taken from JVM typedefs_md.h and system_md.c
326
327 static const jlong high_bit = (jlong)1 << (jlong)63;
328 static const jlong other_bits = ~high_bit;
329
float2long(jfloat f)330 jlong float2long(jfloat f) {
331 jlong tmp = (jlong) f;
332 if (tmp != high_bit) {
333 return tmp;
334 } else {
335 if (g_isnan((jdouble)f)) {
336 return 0;
337 }
338 if (f < 0) {
339 return high_bit;
340 } else {
341 return other_bits;
342 }
343 }
344 }
345
346
double2long(jdouble f)347 jlong double2long(jdouble f) {
348 jlong tmp = (jlong) f;
349 if (tmp != high_bit) {
350 return tmp;
351 } else {
352 if (g_isnan(f)) {
353 return 0;
354 }
355 if (f < 0) {
356 return high_bit;
357 } else {
358 return other_bits;
359 }
360 }
361 }
362
363 // least common multiple
lcm(size_t a,size_t b)364 size_t lcm(size_t a, size_t b) {
365 size_t cur, div, next;
366
367 cur = MAX2(a, b);
368 div = MIN2(a, b);
369
370 assert(div != 0, "lcm requires positive arguments");
371
372
373 while ((next = cur % div) != 0) {
374 cur = div; div = next;
375 }
376
377
378 julong result = julong(a) * b / div;
379 assert(result <= (size_t)max_uintx, "Integer overflow in lcm");
380
381 return size_t(result);
382 }
383
384
385 // Test that nth_bit macro and friends behave as
386 // expected, even with low-precedence operators.
387
388 STATIC_ASSERT(nth_bit(3) == 0x8);
389 STATIC_ASSERT(nth_bit(1|2) == 0x8);
390
391 STATIC_ASSERT(right_n_bits(3) == 0x7);
392 STATIC_ASSERT(right_n_bits(1|2) == 0x7);
393