--- old/src/java.base/share/native/libjava/Bits.c 2015-11-22 15:16:52.322960000 -0800 +++ new/src/java.base/share/native/libjava/Bits.c 2015-11-22 15:16:52.208959000 -0800 @@ -52,16 +52,38 @@ #define SWAPLONG(x) ((jlong)(((jlong)SWAPINT((jint)(x)) << 32) | \ ((jlong)SWAPINT((jint)((x) >> 32)) & 0xffffffff))) +/* The destination buffer passed to Java_java_nio_Bits_copyFromShortArray + * function and the source buffer passed to Java_java_nio_Bits_copyToArray + * may not be aligned on 's boundary. Inform the compiler about this via + * 'unaligned' attribute, provided it supports this attribute. Fro recent + * compilers, use __has_attribute preprocessor predicate; if it is not available, + * we know that GCC supports it. + */ +#ifndef __has_attribute +#define __has_attribute(x) 0 +#endif + +#if defined(__GNUC__) || __has_attribute(aligned) +typedef jshort __attribute__((aligned(1))) jshort_unaligned; +typedef jint __attribute__((aligned(1))) jint_unaligned; +typedef jlong __attribute__((aligned(1))) jlong_unaligned; +#else +typedef jshort jshort_unaligned; +typedef jint jint_unaligned; +typedef jlong jlong_unaligned; +#endif + JNIEXPORT void JNICALL Java_java_nio_Bits_copyFromShortArray(JNIEnv *env, jclass clazz, jobject src, jlong srcPos, jlong dstAddr, jlong length) { jbyte *bytes; size_t size; - jshort *srcShort, *dstShort, *endShort; + jshort *srcShort, *endShort; + jshort_unaligned *dstShort; jshort tmpShort; - dstShort = (jshort *)jlong_to_ptr(dstAddr); + dstShort = (jshort_unaligned *)jlong_to_ptr(dstAddr); while (length > 0) { size = (length < MBYTE) ? (size_t)length : (size_t)MBYTE; @@ -88,10 +110,11 @@ { jbyte *bytes; size_t size; - jshort *srcShort, *dstShort, *endShort; + jshort_unaligned *srcShort, *endShort; + jshort *dstShort; jshort tmpShort; - srcShort = (jshort *)jlong_to_ptr(srcAddr); + srcShort = (jshort_unaligned *)jlong_to_ptr(srcAddr); while (length > 0) { size = (length < MBYTE) ? (size_t)length : (size_t)MBYTE; @@ -118,10 +141,11 @@ { jbyte *bytes; size_t size; - jint *srcInt, *dstInt, *endInt; + jint *srcInt, *endInt; + jint_unaligned *dstInt; jint tmpInt; - dstInt = (jint *)jlong_to_ptr(dstAddr); + dstInt = (jint_unaligned *)jlong_to_ptr(dstAddr); while (length > 0) { size = (length < MBYTE) ? (size_t)length : (size_t)MBYTE; @@ -148,10 +172,11 @@ { jbyte *bytes; size_t size; - jint *srcInt, *dstInt, *endInt; + jint_unaligned *srcInt, *endInt; + jint *dstInt; jint tmpInt; - srcInt = (jint *)jlong_to_ptr(srcAddr); + srcInt = (jint_unaligned *)jlong_to_ptr(srcAddr); while (length > 0) { size = (length < MBYTE) ? (size_t)length : (size_t)MBYTE; @@ -178,10 +203,11 @@ { jbyte *bytes; size_t size; - jlong *srcLong, *dstLong, *endLong; + jlong *srcLong, *endLong; + jlong_unaligned *dstLong; jlong tmpLong; - dstLong = (jlong *)jlong_to_ptr(dstAddr); + dstLong = (jlong_unaligned *)jlong_to_ptr(dstAddr); while (length > 0) { size = (length < MBYTE) ? (size_t)length : (size_t)MBYTE; @@ -208,10 +234,11 @@ { jbyte *bytes; size_t size; - jlong *srcLong, *dstLong, *endLong; + jlong_unaligned *srcLong, *endLong; + jlong *dstLong; jlong tmpLong; - srcLong = (jlong *)jlong_to_ptr(srcAddr); + srcLong = (jlong_unaligned *)jlong_to_ptr(srcAddr); while (length > 0) { size = (length < MBYTE) ? (size_t)length : (size_t)MBYTE;