--- a/openjdk/hotspot/src/share/vm/runtime/interfaceSupport.hpp 2017-10-30 18:28:38.000000000 +0100 +++ b/openjdk/hotspot/src/share/vm/runtime/interfaceSupport.hpp 2018-03-04 23:56:01.119558614 +0100 @@ -422,6 +422,11 @@ /* do nothing */ #endif +#if defined(__GNUC__) && defined(LINUX) && !defined(_LP64) +#define ALIGN_ATTR __attribute__((force_align_arg_pointer)) +#else +#define ALIGN_ATTR +#endif // LEAF routines do not lock, GC or throw exceptions @@ -464,20 +469,20 @@ // (thread is an argument passed in to all these routines) #define IRT_ENTRY(result_type, header) \ - result_type header { \ + ALIGN_ATTR result_type header { \ ThreadInVMfromJava __tiv(thread); \ VM_ENTRY_BASE(result_type, header, thread) \ debug_only(VMEntryWrapper __vew;) #define IRT_LEAF(result_type, header) \ - result_type header { \ + ALIGN_ATTR result_type header { \ VM_LEAF_BASE(result_type, header) \ debug_only(No_Safepoint_Verifier __nspv(true);) #define IRT_ENTRY_NO_ASYNC(result_type, header) \ - result_type header { \ + ALIGN_ATTR result_type header { \ ThreadInVMfromJavaNoAsyncException __tiv(thread); \ VM_ENTRY_BASE(result_type, header, thread) \ debug_only(VMEntryWrapper __vew;) @@ -488,20 +493,20 @@ // Definitions for JRT (Java (Compiler/Shared) Runtime) #define JRT_ENTRY(result_type, header) \ - result_type header { \ + ALIGN_ATTR result_type header { \ ThreadInVMfromJava __tiv(thread); \ VM_ENTRY_BASE(result_type, header, thread) \ debug_only(VMEntryWrapper __vew;) #define JRT_LEAF(result_type, header) \ - result_type header { \ + ALIGN_ATTR result_type header { \ VM_LEAF_BASE(result_type, header) \ debug_only(JRT_Leaf_Verifier __jlv;) #define JRT_ENTRY_NO_ASYNC(result_type, header) \ - result_type header { \ + ALIGN_ATTR result_type header { \ ThreadInVMfromJavaNoAsyncException __tiv(thread); \ VM_ENTRY_BASE(result_type, header, thread) \ debug_only(VMEntryWrapper __vew;) @@ -509,7 +514,7 @@ // Same as JRT Entry but allows for return value after the safepoint // to get back into Java from the VM #define JRT_BLOCK_ENTRY(result_type, header) \ - result_type header { \ + ALIGN_ATTR result_type header { \ TRACE_CALL(result_type, header) \ HandleMarkCleaner __hm(thread); @@ -531,7 +536,7 @@ #define JNI_ENTRY_NO_PRESERVE(result_type, header) \ extern "C" { \ - result_type JNICALL header { \ + ALIGN_ATTR result_type JNICALL header { \ JavaThread* thread=JavaThread::thread_from_jni_environment(env); \ assert( !VerifyJNIEnvThread || (thread == Thread::current()), "JNIEnv is only valid in same thread"); \ ThreadInVMfromNative __tiv(thread); \ @@ -543,7 +548,7 @@ // a GC, is called outside the NoHandleMark (set via VM_QUICK_ENTRY_BASE). #define JNI_QUICK_ENTRY(result_type, header) \ extern "C" { \ - result_type JNICALL header { \ + ALIGN_ATTR result_type JNICALL header { \ JavaThread* thread=JavaThread::thread_from_jni_environment(env); \ assert( !VerifyJNIEnvThread || (thread == Thread::current()), "JNIEnv is only valid in same thread"); \ ThreadInVMfromNative __tiv(thread); \ @@ -553,7 +558,7 @@ #define JNI_LEAF(result_type, header) \ extern "C" { \ - result_type JNICALL header { \ + ALIGN_ATTR result_type JNICALL header { \ JavaThread* thread=JavaThread::thread_from_jni_environment(env); \ assert( !VerifyJNIEnvThread || (thread == Thread::current()), "JNIEnv is only valid in same thread"); \ VM_LEAF_BASE(result_type, header) @@ -568,7 +573,7 @@ #define JVM_ENTRY(result_type, header) \ extern "C" { \ - result_type JNICALL header { \ + ALIGN_ATTR result_type JNICALL header { \ JavaThread* thread=JavaThread::thread_from_jni_environment(env); \ ThreadInVMfromNative __tiv(thread); \ debug_only(VMNativeEntryWrapper __vew;) \ @@ -577,7 +582,7 @@ #define JVM_ENTRY_NO_ENV(result_type, header) \ extern "C" { \ - result_type JNICALL header { \ + ALIGN_ATTR result_type JNICALL header { \ JavaThread* thread = (JavaThread*)ThreadLocalStorage::thread(); \ ThreadInVMfromNative __tiv(thread); \ debug_only(VMNativeEntryWrapper __vew;) \ @@ -586,7 +591,7 @@ #define JVM_QUICK_ENTRY(result_type, header) \ extern "C" { \ - result_type JNICALL header { \ + ALIGN_ATTR result_type JNICALL header { \ JavaThread* thread=JavaThread::thread_from_jni_environment(env); \ ThreadInVMfromNative __tiv(thread); \ debug_only(VMNativeEntryWrapper __vew;) \ @@ -595,7 +600,7 @@ #define JVM_LEAF(result_type, header) \ extern "C" { \ - result_type JNICALL header { \ + ALIGN_ATTR result_type JNICALL header { \ VM_Exit::block_if_vm_exited(); \ VM_LEAF_BASE(result_type, header)