mirror of
https://github.com/openjdk/jdk.git
synced 2026-01-28 12:09:14 +00:00
8365163: [ubsan] left-shift issue in globalDefinitions.hpp
Reviewed-by: kbarrett, stefank, aph
This commit is contained in:
parent
523bc77981
commit
ef7872cc31
@ -641,19 +641,11 @@ inline jdouble jdouble_cast (jlong x) { return ((DoubleLongConv*)&x)->d; }
|
||||
inline jint low (jlong value) { return jint(value); }
|
||||
inline jint high(jlong value) { return jint(value >> 32); }
|
||||
|
||||
// the fancy casts are a hopefully portable way
|
||||
// to do unsigned 32 to 64 bit type conversion
|
||||
inline void set_low (jlong* value, jint low ) { *value &= (jlong)0xffffffff << 32;
|
||||
*value |= (jlong)(julong)(juint)low; }
|
||||
|
||||
inline void set_high(jlong* value, jint high) { *value &= (jlong)(julong)(juint)0xffffffff;
|
||||
*value |= (jlong)high << 32; }
|
||||
|
||||
inline jlong jlong_from(jint h, jint l) {
|
||||
jlong result = 0; // initialization to avoid warning
|
||||
set_high(&result, h);
|
||||
set_low(&result, l);
|
||||
return result;
|
||||
// First cast jint values to juint, so cast to julong will zero-extend.
|
||||
julong high = (julong)(juint)h << 32;
|
||||
julong low = (julong)(juint)l;
|
||||
return (jlong)(high | low);
|
||||
}
|
||||
|
||||
union jlong_accessor {
|
||||
|
||||
@ -295,3 +295,30 @@ TEST(globalDefinitions, format_specifiers) {
|
||||
// Check all platforms print this compatibly without leading 0x.
|
||||
check_format(UINT64_FORMAT_0, (u8)0x123, "0000000000000123");
|
||||
}
|
||||
|
||||
TEST(globalDefinitions, jlong_from) {
|
||||
jlong val = jlong_from(0xFF, 0);
|
||||
EXPECT_EQ(val, CONST64(0x00000000FF00000000));
|
||||
|
||||
val = jlong_from(0, 0xFF);
|
||||
EXPECT_EQ(val, CONST64(0x00000000000000FF));
|
||||
|
||||
val = jlong_from(0xFFFFFFFF, 0);
|
||||
EXPECT_EQ((julong)val, UCONST64(0xFFFFFFFF00000000));
|
||||
|
||||
val = jlong_from(0, 0xFFFFFFFF);
|
||||
EXPECT_EQ(val, CONST64(0x00000000FFFFFFFF));
|
||||
|
||||
val = jlong_from(0, -1);
|
||||
EXPECT_EQ(val, CONST64(0x00000000FFFFFFFF));
|
||||
|
||||
val = jlong_from(-1, 0);
|
||||
EXPECT_EQ((julong)val, UCONST64(0xFFFFFFFF00000000));
|
||||
|
||||
val = jlong_from(-1, -1);
|
||||
EXPECT_EQ((julong)val, UCONST64(0xFFFFFFFFFFFFFFFF));
|
||||
EXPECT_EQ(val, CONST64(-1));
|
||||
|
||||
val = jlong_from(0xABCD, 0xEFEF);
|
||||
EXPECT_EQ(val, CONST64(0x0000ABCD0000EFEF));
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user