--- old/src/java.base/share/classes/java/lang/invoke/X-VarHandleMemoryAddressView.java.template 2019-12-09 18:35:46.759102975 +0000 +++ new/src/java.base/share/classes/java/lang/invoke/X-VarHandleMemoryAddressView.java.template 2019-12-09 18:35:46.283091432 +0000 @@ -37,6 +37,8 @@ static final boolean BE = UNSAFE.isBigEndian(); + static final int VM_ALIGN = $BoxType$.BYTES - 1; + #if[floatingPoint] @ForceInline static $rawType$ convEndian(boolean big, $type$ v) { @@ -71,9 +73,21 @@ } @ForceInline - static long offset(MemoryAddressProxy bb, long offset, long alignment) { + static long offset(MemoryAddressProxy bb, long offset, long alignmentMask) { + long address = bb.unsafeGetOffset() + offset; + if ((address & alignmentMask) != 0) { + throw VarHandleMemoryAddressBase.newIllegalStateExceptionForMisalignedAccess(address); + } + if ((address & VM_ALIGN) != 0) { + throw VarHandleMemoryAddressBase.newIllegalStateExceptionForMisalignedAccess(address); + } + return address; + } + + @ForceInline + static long offsetNoVMAlignCheck(MemoryAddressProxy bb, long offset, long alignmentMask) { long address = bb.unsafeGetOffset() + offset; - if ((address & alignment) != 0) { + if ((address & alignmentMask) != 0) { throw VarHandleMemoryAddressBase.newIllegalStateExceptionForMisalignedAccess(address); } return address; @@ -85,18 +99,18 @@ #if[floatingPoint] $rawType$ rawValue = UNSAFE.get$RawType$Unaligned( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offsetNoVMAlignCheck(bb, base, handle.alignmentMask), handle.be); return $Type$.$rawType$BitsTo$Type$(rawValue); #else[floatingPoint] #if[byte] return UNSAFE.get$Type$( bb.unsafeGetBase(), - offset(bb, base, handle.alignment)); + offsetNoVMAlignCheck(bb, base, handle.alignmentMask)); #else[byte] return UNSAFE.get$Type$Unaligned( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offsetNoVMAlignCheck(bb, base, handle.alignmentMask), handle.be); #end[byte] #end[floatingPoint] @@ -108,19 +122,19 @@ #if[floatingPoint] UNSAFE.put$RawType$Unaligned( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offsetNoVMAlignCheck(bb, base, handle.alignmentMask), $Type$.$type$ToRaw$RawType$Bits(value), handle.be); #else[floatingPoint] #if[byte] UNSAFE.put$Type$( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offsetNoVMAlignCheck(bb, base, handle.alignmentMask), value); #else[byte] UNSAFE.put$Type$Unaligned( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offsetNoVMAlignCheck(bb, base, handle.alignmentMask), value, handle.be); #end[byte] @@ -133,7 +147,7 @@ return convEndian(handle.be, UNSAFE.get$RawType$Volatile( bb.unsafeGetBase(), - offset(bb, base, handle.alignment))); + offset(bb, base, handle.alignmentMask))); } @ForceInline @@ -141,7 +155,7 @@ MemoryAddressProxy bb = checkAddress(obb, base, handle.length, false); UNSAFE.put$RawType$Volatile( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), convEndian(handle.be, value)); } @@ -151,7 +165,7 @@ return convEndian(handle.be, UNSAFE.get$RawType$Acquire( bb.unsafeGetBase(), - offset(bb, base, handle.alignment))); + offset(bb, base, handle.alignmentMask))); } @ForceInline @@ -159,7 +173,7 @@ MemoryAddressProxy bb = checkAddress(obb, base, handle.length, false); UNSAFE.put$RawType$Release( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), convEndian(handle.be, value)); } @@ -169,7 +183,7 @@ return convEndian(handle.be, UNSAFE.get$RawType$Opaque( bb.unsafeGetBase(), - offset(bb, base, handle.alignment))); + offset(bb, base, handle.alignmentMask))); } @ForceInline @@ -177,7 +191,7 @@ MemoryAddressProxy bb = checkAddress(obb, base, handle.length, false); UNSAFE.put$RawType$Opaque( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), convEndian(handle.be, value)); } #if[CAS] @@ -187,7 +201,7 @@ MemoryAddressProxy bb = checkAddress(obb, base, handle.length, false); return UNSAFE.compareAndSet$RawType$( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), convEndian(handle.be, expected), convEndian(handle.be, value)); } @@ -197,7 +211,7 @@ return convEndian(handle.be, UNSAFE.compareAndExchange$RawType$( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), convEndian(handle.be, expected), convEndian(handle.be, value))); } @@ -207,7 +221,7 @@ return convEndian(handle.be, UNSAFE.compareAndExchange$RawType$Acquire( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), convEndian(handle.be, expected), convEndian(handle.be, value))); } @@ -217,7 +231,7 @@ return convEndian(handle.be, UNSAFE.compareAndExchange$RawType$Release( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), convEndian(handle.be, expected), convEndian(handle.be, value))); } @@ -226,7 +240,7 @@ MemoryAddressProxy bb = checkAddress(obb, base, handle.length, false); return UNSAFE.weakCompareAndSet$RawType$Plain( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), convEndian(handle.be, expected), convEndian(handle.be, value)); } @@ -235,7 +249,7 @@ MemoryAddressProxy bb = checkAddress(obb, base, handle.length, false); return UNSAFE.weakCompareAndSet$RawType$( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), convEndian(handle.be, expected), convEndian(handle.be, value)); } @@ -244,7 +258,7 @@ MemoryAddressProxy bb = checkAddress(obb, base, handle.length, false); return UNSAFE.weakCompareAndSet$RawType$Acquire( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), convEndian(handle.be, expected), convEndian(handle.be, value)); } @@ -253,7 +267,7 @@ MemoryAddressProxy bb = checkAddress(obb, base, handle.length, false); return UNSAFE.weakCompareAndSet$RawType$Release( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), convEndian(handle.be, expected), convEndian(handle.be, value)); } @@ -263,7 +277,7 @@ return convEndian(handle.be, UNSAFE.getAndSet$RawType$( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), convEndian(handle.be, value))); } @@ -273,7 +287,7 @@ return convEndian(handle.be, UNSAFE.getAndSet$RawType$Acquire( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), convEndian(handle.be, value))); } @@ -283,7 +297,7 @@ return convEndian(handle.be, UNSAFE.getAndSet$RawType$Release( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), convEndian(handle.be, value))); } #end[CAS] @@ -295,10 +309,10 @@ if (handle.be == BE) { return UNSAFE.getAndAdd$RawType$( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), delta); } else { - return getAndAddConvEndianWithCAS(bb, offset(bb, base, handle.alignment), delta); + return getAndAddConvEndianWithCAS(bb, offset(bb, base, handle.alignmentMask), delta); } } @@ -308,10 +322,10 @@ if (handle.be == BE) { return UNSAFE.getAndAdd$RawType$Acquire( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), delta); } else { - return getAndAddConvEndianWithCAS(bb, offset(bb, base, handle.alignment), delta); + return getAndAddConvEndianWithCAS(bb, offset(bb, base, handle.alignmentMask), delta); } } @@ -321,10 +335,10 @@ if (handle.be == BE) { return UNSAFE.getAndAdd$RawType$Release( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), delta); } else { - return getAndAddConvEndianWithCAS(bb, offset(bb, base, handle.alignment), delta); + return getAndAddConvEndianWithCAS(bb, offset(bb, base, handle.alignmentMask), delta); } } @@ -348,10 +362,10 @@ if (handle.be == BE) { return UNSAFE.getAndBitwiseOr$RawType$( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), value); } else { - return getAndBitwiseOrConvEndianWithCAS(bb, offset(bb, base, handle.alignment), value); + return getAndBitwiseOrConvEndianWithCAS(bb, offset(bb, base, handle.alignmentMask), value); } } @@ -361,10 +375,10 @@ if (handle.be == BE) { return UNSAFE.getAndBitwiseOr$RawType$Release( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), value); } else { - return getAndBitwiseOrConvEndianWithCAS(bb, offset(bb, base, handle.alignment), value); + return getAndBitwiseOrConvEndianWithCAS(bb, offset(bb, base, handle.alignmentMask), value); } } @@ -374,10 +388,10 @@ if (handle.be == BE) { return UNSAFE.getAndBitwiseOr$RawType$Acquire( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), value); } else { - return getAndBitwiseOrConvEndianWithCAS(bb, offset(bb, base, handle.alignment), value); + return getAndBitwiseOrConvEndianWithCAS(bb, offset(bb, base, handle.alignmentMask), value); } } @@ -399,10 +413,10 @@ if (handle.be == BE) { return UNSAFE.getAndBitwiseAnd$RawType$( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), value); } else { - return getAndBitwiseAndConvEndianWithCAS(bb, offset(bb, base, handle.alignment), value); + return getAndBitwiseAndConvEndianWithCAS(bb, offset(bb, base, handle.alignmentMask), value); } } @@ -412,10 +426,10 @@ if (handle.be == BE) { return UNSAFE.getAndBitwiseAnd$RawType$Release( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), value); } else { - return getAndBitwiseAndConvEndianWithCAS(bb, offset(bb, base, handle.alignment), value); + return getAndBitwiseAndConvEndianWithCAS(bb, offset(bb, base, handle.alignmentMask), value); } } @@ -425,10 +439,10 @@ if (handle.be == BE) { return UNSAFE.getAndBitwiseAnd$RawType$Acquire( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), value); } else { - return getAndBitwiseAndConvEndianWithCAS(bb, offset(bb, base, handle.alignment), value); + return getAndBitwiseAndConvEndianWithCAS(bb, offset(bb, base, handle.alignmentMask), value); } } @@ -451,10 +465,10 @@ if (handle.be == BE) { return UNSAFE.getAndBitwiseXor$RawType$( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), value); } else { - return getAndBitwiseXorConvEndianWithCAS(bb, offset(bb, base, handle.alignment), value); + return getAndBitwiseXorConvEndianWithCAS(bb, offset(bb, base, handle.alignmentMask), value); } } @@ -464,10 +478,10 @@ if (handle.be == BE) { return UNSAFE.getAndBitwiseXor$RawType$Release( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), value); } else { - return getAndBitwiseXorConvEndianWithCAS(bb, offset(bb, base, handle.alignment), value); + return getAndBitwiseXorConvEndianWithCAS(bb, offset(bb, base, handle.alignmentMask), value); } } @@ -477,10 +491,10 @@ if (handle.be == BE) { return UNSAFE.getAndBitwiseXor$RawType$Acquire( bb.unsafeGetBase(), - offset(bb, base, handle.alignment), + offset(bb, base, handle.alignmentMask), value); } else { - return getAndBitwiseXorConvEndianWithCAS(bb, offset(bb, base, handle.alignment), value); + return getAndBitwiseXorConvEndianWithCAS(bb, offset(bb, base, handle.alignmentMask), value); } }