1 /*
  2  * Copyright (c) 1997, 2025, 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 "runtime/globals.hpp"
 26 #include "runtime/os.hpp"
 27 #include "runtime/signature.hpp"
 28 #include "utilities/globalDefinitions.hpp"
 29 #include "utilities/powerOfTwo.hpp"
 30 
 31 // Basic error support
 32 
 33 // Info for oops within a java object.  Defaults are zero so
 34 // things will break badly if incorrectly initialized.
 35 int heapOopSize        = 0;
 36 int LogBytesPerHeapOop = 0;
 37 int LogBitsPerHeapOop  = 0;
 38 int BytesPerHeapOop    = 0;
 39 int BitsPerHeapOop     = 0;
 40 
 41 // Old CDS options
 42 bool RequireSharedSpaces;
 43 extern "C" {
 44 JNIEXPORT jboolean UseSharedSpaces = true;
 45 }
 46 
 47 // Object alignment, in units of HeapWords.
 48 // Defaults are -1 so things will break badly if incorrectly initialized.
 49 int MinObjAlignment            = -1;
 50 int MinObjAlignmentInBytes     = -1;
 51 int MinObjAlignmentInBytesMask = 0;
 52 
 53 int LogMinObjAlignment         = -1;
 54 int LogMinObjAlignmentInBytes  = -1;
 55 
 56 // Oop encoding heap max
 57 uint64_t OopEncodingHeapMax = 0;
 58 
 59 const int LockingMode = LM_LIGHTWEIGHT;
 60 
 61 // Something to help porters sleep at night
 62 
 63 #ifdef ASSERT
 64 static BasicType char2type(int ch) {
 65   switch (ch) {
 66 #define EACH_SIG(ch, bt, ignore) \
 67     case ch: return bt;
 68     SIGNATURE_TYPES_DO(EACH_SIG, ignore)
 69 #undef EACH_SIG
 70   }
 71   return T_ILLEGAL;
 72 }
 73 
 74 extern bool signature_constants_sane();
 75 #endif //ASSERT
 76 
 77 void basic_types_init() {
 78 #ifdef ASSERT
 79 #ifdef _LP64
 80   static_assert(min_intx ==  (intx)CONST64(0x8000000000000000), "correct constant");
 81   static_assert(max_intx ==  CONST64(0x7FFFFFFFFFFFFFFF), "correct constant");
 82   static_assert(max_uintx == CONST64(0xFFFFFFFFFFFFFFFF), "correct constant");
 83   static_assert( 8 == sizeof( intx),      "wrong size for basic type");
 84   static_assert( 8 == sizeof( jobject),   "wrong size for basic type");
 85 #else
 86   static_assert(min_intx ==  (intx)0x80000000,  "correct constant");
 87   static_assert(max_intx ==  0x7FFFFFFF,  "correct constant");
 88   static_assert(max_uintx == 0xFFFFFFFF,  "correct constant");
 89   static_assert( 4 == sizeof( intx),      "wrong size for basic type");
 90   static_assert( 4 == sizeof( jobject),   "wrong size for basic type");
 91 #endif
 92   static_assert( (~max_juint) == 0,  "max_juint has all its bits");
 93   static_assert( (~max_uintx) == 0,  "max_uintx has all its bits");
 94   static_assert( (~max_julong) == 0, "max_julong has all its bits");
 95   static_assert( 1 == sizeof( jbyte),     "wrong size for basic type");
 96   static_assert( 2 == sizeof( jchar),     "wrong size for basic type");
 97   static_assert( 2 == sizeof( jshort),    "wrong size for basic type");
 98   static_assert( 4 == sizeof( juint),     "wrong size for basic type");
 99   static_assert( 4 == sizeof( jint),      "wrong size for basic type");
100   static_assert( 1 == sizeof( jboolean),  "wrong size for basic type");
101   static_assert( 8 == sizeof( jlong),     "wrong size for basic type");
102   static_assert( 4 == sizeof( jfloat),    "wrong size for basic type");
103   static_assert( 8 == sizeof( jdouble),   "wrong size for basic type");
104   static_assert( 1 == sizeof( u1),        "wrong size for basic type");
105   static_assert( 2 == sizeof( u2),        "wrong size for basic type");
106   static_assert( 4 == sizeof( u4),        "wrong size for basic type");
107   static_assert(wordSize == BytesPerWord, "should be the same since they're used interchangeably");
108   static_assert(wordSize == HeapWordSize, "should be the same since they're also used interchangeably");
109 
110   assert(signature_constants_sane(), "");
111 
112   int num_type_chars = 0;
113   for (int i = 0; i < 99; i++) {
114     if (type2char((BasicType)i) != 0) {
115       assert(char2type(type2char((BasicType)i)) == i, "proper inverses");
116       assert(Signature::basic_type(type2char((BasicType)i)) == i, "proper inverses");
117       num_type_chars++;
118     }
119   }
120   assert(num_type_chars == 11, "must have tested the right number of mappings");
121   assert(char2type(0) == T_ILLEGAL, "correct illegality");
122 
123   {
124     for (int i = T_BOOLEAN; i <= T_CONFLICT; i++) {
125       BasicType vt = (BasicType)i;
126       BasicType ft = type2field[vt];
127       switch (vt) {
128       // the following types might plausibly show up in memory layouts:
129       case T_BOOLEAN:
130       case T_BYTE:
131       case T_CHAR:
132       case T_SHORT:
133       case T_INT:
134       case T_FLOAT:
135       case T_DOUBLE:
136       case T_LONG:
137       case T_OBJECT:
138       case T_ADDRESS:     // random raw pointer
139       case T_METADATA:    // metadata pointer
140       case T_NARROWOOP:   // compressed pointer
141       case T_NARROWKLASS: // compressed klass pointer
142       case T_CONFLICT:    // might as well support a bottom type
143       case T_VOID:        // padding or other unaddressed word
144         // layout type must map to itself
145         assert(vt == ft, "");
146         break;
147       default:
148         // non-layout type must map to a (different) layout type
149         assert(vt != ft, "");
150         assert(ft == type2field[ft], "");
151       }
152       // every type must map to same-sized layout type:
153       assert(type2size[vt] == type2size[ft], "");
154     }
155   }
156   // These are assumed, e.g., when filling HeapWords with juints.
157   static_assert(is_power_of_2(sizeof(juint)), "juint must be power of 2");
158   static_assert(is_power_of_2(HeapWordSize), "HeapWordSize must be power of 2");
159   static_assert((size_t)HeapWordSize >= sizeof(juint),
160                 "HeapWord should be at least as large as juint");
161 #endif
162 
163   if( JavaPriority1_To_OSPriority != -1 )
164     os::java_to_os_priority[1] = JavaPriority1_To_OSPriority;
165   if( JavaPriority2_To_OSPriority != -1 )
166     os::java_to_os_priority[2] = JavaPriority2_To_OSPriority;
167   if( JavaPriority3_To_OSPriority != -1 )
168     os::java_to_os_priority[3] = JavaPriority3_To_OSPriority;
169   if( JavaPriority4_To_OSPriority != -1 )
170     os::java_to_os_priority[4] = JavaPriority4_To_OSPriority;
171   if( JavaPriority5_To_OSPriority != -1 )
172     os::java_to_os_priority[5] = JavaPriority5_To_OSPriority;
173   if( JavaPriority6_To_OSPriority != -1 )
174     os::java_to_os_priority[6] = JavaPriority6_To_OSPriority;
175   if( JavaPriority7_To_OSPriority != -1 )
176     os::java_to_os_priority[7] = JavaPriority7_To_OSPriority;
177   if( JavaPriority8_To_OSPriority != -1 )
178     os::java_to_os_priority[8] = JavaPriority8_To_OSPriority;
179   if( JavaPriority9_To_OSPriority != -1 )
180     os::java_to_os_priority[9] = JavaPriority9_To_OSPriority;
181   if(JavaPriority10_To_OSPriority != -1 )
182     os::java_to_os_priority[10] = JavaPriority10_To_OSPriority;
183 
184   // Set the size of basic types here (after argument parsing but before
185   // stub generation).
186   if (UseCompressedOops) {
187     // Size info for oops within java objects is fixed
188     heapOopSize        = jintSize;
189     LogBytesPerHeapOop = LogBytesPerInt;
190     LogBitsPerHeapOop  = LogBitsPerInt;
191     BytesPerHeapOop    = BytesPerInt;
192     BitsPerHeapOop     = BitsPerInt;
193   } else {
194     heapOopSize        = oopSize;
195     LogBytesPerHeapOop = LogBytesPerWord;
196     LogBitsPerHeapOop  = LogBitsPerWord;
197     BytesPerHeapOop    = BytesPerWord;
198     BitsPerHeapOop     = BitsPerWord;
199   }
200   _type2aelembytes[T_OBJECT] = heapOopSize;
201   _type2aelembytes[T_ARRAY]  = heapOopSize;
202 }
203 
204 
205 // Map BasicType to signature character
206 char type2char_tab[T_CONFLICT+1] = {
207   0, 0, 0, 0,
208   JVM_SIGNATURE_BOOLEAN, JVM_SIGNATURE_CHAR,
209   JVM_SIGNATURE_FLOAT,   JVM_SIGNATURE_DOUBLE,
210   JVM_SIGNATURE_BYTE,    JVM_SIGNATURE_SHORT,
211   JVM_SIGNATURE_INT,     JVM_SIGNATURE_LONG,
212   JVM_SIGNATURE_CLASS,   JVM_SIGNATURE_ARRAY,
213   JVM_SIGNATURE_VOID,
214   0, 0, 0, 0, 0, 0
215 };
216 
217 // Map BasicType to Java type name
218 const char* type2name_tab[T_CONFLICT+1] = {
219   nullptr, nullptr, nullptr, nullptr,
220   "boolean",
221   "char",
222   "float",
223   "double",
224   "byte",
225   "short",
226   "int",
227   "long",
228   "object",
229   "array",
230   "void",
231   "flat element",
232   "*address*",
233   "*narrowoop*",
234   "*metadata*",
235   "*narrowklass*",
236   "*conflict*"
237 };
238 const char* type2name(BasicType t) {
239   if (t < ARRAY_SIZE(type2name_tab)) {
240     return type2name_tab[t];
241   } else if (t == T_ILLEGAL) {
242     return "*illegal*";
243   } else {
244     fatal("invalid type %d", t);
245     return "invalid type";
246   }
247 }
248 
249 
250 
251 BasicType name2type(const char* name) {
252   for (int i = T_BOOLEAN; i <= T_VOID; i++) {
253     BasicType t = (BasicType)i;
254     if (type2name_tab[t] != nullptr && 0 == strcmp(type2name_tab[t], name))
255       return t;
256   }
257   return T_ILLEGAL;
258 }
259 
260 // Map BasicType to size in words
261 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, -1};
262 
263 BasicType type2field[T_CONFLICT+1] = {
264   (BasicType)0,            // 0,
265   (BasicType)0,            // 1,
266   (BasicType)0,            // 2,
267   (BasicType)0,            // 3,
268   T_BOOLEAN,               // T_BOOLEAN  =  4,
269   T_CHAR,                  // T_CHAR     =  5,
270   T_FLOAT,                 // T_FLOAT    =  6,
271   T_DOUBLE,                // T_DOUBLE   =  7,
272   T_BYTE,                  // T_BYTE     =  8,
273   T_SHORT,                 // T_SHORT    =  9,
274   T_INT,                   // T_INT      = 10,
275   T_LONG,                  // T_LONG     = 11,
276   T_OBJECT,                // T_OBJECT   = 12,
277   T_OBJECT,                // T_ARRAY    = 13,
278   T_VOID,                  // T_VOID     = 14,
279   (BasicType)0,            // T_FLAT_ELEMENT = 15,
280   T_ADDRESS,               // T_ADDRESS  = 16,
281   T_NARROWOOP,             // T_NARROWOOP= 17,
282   T_METADATA,              // T_METADATA = 18,
283   T_NARROWKLASS,           // T_NARROWKLASS = 19,
284   T_CONFLICT               // T_CONFLICT = 20
285 };
286 
287 
288 BasicType type2wfield[T_CONFLICT+1] = {
289   (BasicType)0,            // 0,
290   (BasicType)0,            // 1,
291   (BasicType)0,            // 2,
292   (BasicType)0,            // 3,
293   T_INT,     // T_BOOLEAN  =  4,
294   T_INT,     // T_CHAR     =  5,
295   T_FLOAT,   // T_FLOAT    =  6,
296   T_DOUBLE,  // T_DOUBLE   =  7,
297   T_INT,     // T_BYTE     =  8,
298   T_INT,     // T_SHORT    =  9,
299   T_INT,     // T_INT      = 10,
300   T_LONG,    // T_LONG     = 11,
301   T_OBJECT,  // T_OBJECT   = 12,
302   T_OBJECT,  // T_ARRAY    = 13,
303   T_VOID,    // T_VOID     = 14,
304   (BasicType)0,  // T_FLAT_ELEMENT = 15,
305   T_ADDRESS, // T_ADDRESS  = 16,
306   T_NARROWOOP, // T_NARROWOOP  = 17,
307   T_METADATA,  // T_METADATA   = 18,
308   T_NARROWKLASS, // T_NARROWKLASS  = 19,
309   T_CONFLICT // T_CONFLICT = 20
310 };
311 
312 
313 int _type2aelembytes[T_CONFLICT+1] = {
314   0,                         // 0
315   0,                         // 1
316   0,                         // 2
317   0,                         // 3
318   T_BOOLEAN_aelem_bytes,     // T_BOOLEAN  =  4,
319   T_CHAR_aelem_bytes,        // T_CHAR     =  5,
320   T_FLOAT_aelem_bytes,       // T_FLOAT    =  6,
321   T_DOUBLE_aelem_bytes,      // T_DOUBLE   =  7,
322   T_BYTE_aelem_bytes,        // T_BYTE     =  8,
323   T_SHORT_aelem_bytes,       // T_SHORT    =  9,
324   T_INT_aelem_bytes,         // T_INT      = 10,
325   T_LONG_aelem_bytes,        // T_LONG     = 11,
326   T_OBJECT_aelem_bytes,      // T_OBJECT   = 12,
327   T_ARRAY_aelem_bytes,       // T_ARRAY    = 13,
328   0,                         // T_VOID     = 14,
329   0,                         // T_FLAT_ELEMENT = 15,
330   T_OBJECT_aelem_bytes,      // T_ADDRESS  = 16,
331   T_NARROWOOP_aelem_bytes,   // T_NARROWOOP= 17,
332   T_OBJECT_aelem_bytes,      // T_METADATA = 18,
333   T_NARROWKLASS_aelem_bytes, // T_NARROWKLASS= 19,
334   0                          // T_CONFLICT = 20
335 };
336 
337 #ifdef ASSERT
338 int type2aelembytes(BasicType t, bool allow_address) {
339   assert((allow_address || t != T_ADDRESS) && t <= T_CONFLICT, "unexpected basic type");
340   return _type2aelembytes[t];
341 }
342 #endif
343 
344 // Support for 64-bit integer arithmetic
345 
346 // The following code is mostly taken from JVM typedefs_md.h and system_md.c
347 
348 static const jlong high_bit   = (jlong)1 << (jlong)63;
349 static const jlong other_bits = ~high_bit;
350 
351 jlong float2long(jfloat f) {
352   jlong tmp = (jlong) f;
353   if (tmp != high_bit) {
354     return tmp;
355   } else {
356     if (g_isnan((jdouble)f)) {
357       return 0;
358     }
359     if (f < 0) {
360       return high_bit;
361     } else {
362       return other_bits;
363     }
364   }
365 }
366 
367 
368 jlong double2long(jdouble f) {
369   jlong tmp = (jlong) f;
370   if (tmp != high_bit) {
371     return tmp;
372   } else {
373     if (g_isnan(f)) {
374       return 0;
375     }
376     if (f < 0) {
377       return high_bit;
378     } else {
379       return other_bits;
380     }
381   }
382 }
383 
384 // least common multiple
385 size_t lcm(size_t a, size_t b) {
386     size_t cur, div, next;
387 
388     cur = MAX2(a, b);
389     div = MIN2(a, b);
390 
391     assert(div != 0, "lcm requires positive arguments");
392 
393 
394     while ((next = cur % div) != 0) {
395         cur = div; div = next;
396     }
397 
398 
399     julong result = julong(a) * b / div;
400     assert(result <= (size_t)max_uintx, "Integer overflow in lcm");
401 
402     return size_t(result);
403 }
404 
405 
406 // Test that nth_bit macro and friends behave as
407 // expected, even with low-precedence operators.
408 
409 STATIC_ASSERT(nth_bit(3)   == 0x8);
410 STATIC_ASSERT(nth_bit(1|2) == 0x8);
411 
412 STATIC_ASSERT(right_n_bits(3)   == 0x7);
413 STATIC_ASSERT(right_n_bits(1|2) == 0x7);
414 
415 // Check for Flush-To-Zero mode
416 
417 // On some processors faster execution can be achieved by setting a
418 // mode to return zero for extremely small results, rather than an
419 // IEEE-754 subnormal number. This mode is not compatible with the
420 // Java Language Standard.
421 
422 // We need the addition of _large_subnormal and _small_subnormal to be
423 // performed at runtime. _small_subnormal is volatile so that
424 // expressions involving it cannot be evaluated at compile time.
425 static const double large_subnormal_double
426   = jdouble_cast(0x0030000000000000); // 0x1.0p-1020;
427 static const volatile double small_subnormal_double
428   = jdouble_cast(0x0000000000000003); // 0x0.0000000000003p-1022;
429 
430 // Quickly test to make sure IEEE-754 subnormal numbers are correctly
431 // handled.
432 bool IEEE_subnormal_handling_OK() {
433   // _small_subnormal is the smallest subnormal number that has two
434   // bits set. _large_subnormal is a number such that, when
435   // _small_subnormal is added to it, must be rounded according to the
436   // mode. These two tests detect the rounding mode in use. If
437   // subnormals are turned off (i.e. subnormals-are-zero) flush-to-
438   // zero mode is in use.
439 
440   return (large_subnormal_double + small_subnormal_double > large_subnormal_double
441           && -large_subnormal_double - small_subnormal_double < -large_subnormal_double);
442 }