From 56e3456e5f233bcf969de7197c6be003aba040a7 Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Wed, 17 May 2017 21:52:18 +0200 Subject: [PATCH] [interp] respect 64bit alignment on armv7 --- mono/mini/interp/interp.c | 5 +++-- mono/mini/mini-arm.c | 6 ++++++ mono/mini/mini-arm.h | 3 +++ 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/mono/mini/interp/interp.c b/mono/mini/interp/interp.c index 27b790a6a50..68d3b3998a4 100644 --- a/mono/mini/interp/interp.c +++ b/mono/mini/interp/interp.c @@ -723,6 +723,7 @@ static InterpMethodArguments* build_args_from_sig (MonoMethodSignature *sig, Mon #ifdef TARGET_ARM g_assert (mono_arm_eabi_supported ()); + int i8_align = mono_arm_i8_align (); #endif if (sig->hasthis) @@ -757,7 +758,7 @@ static InterpMethodArguments* build_args_from_sig (MonoMethodSignature *sig, Mon case MONO_TYPE_I8: #ifdef TARGET_ARM /* pairs begin at even registers */ - if (margs->ilen & 1) + if (i8_align == 8 && margs->ilen & 1) margs->ilen++; #endif margs->ilen += 2; @@ -834,7 +835,7 @@ static InterpMethodArguments* build_args_from_sig (MonoMethodSignature *sig, Mon stackval *sarg = &frame->stack_args [i]; #ifdef TARGET_ARM /* pairs begin at even registers */ - if (int_i & 1) + if (i8_align == 8 && int_i & 1) int_i++; #endif margs->iargs [int_i] = (gpointer) sarg->data.pair.lo; diff --git a/mono/mini/mini-arm.c b/mono/mini/mini-arm.c index d88dc4f10cc..96c7d3a6adf 100644 --- a/mono/mini/mini-arm.c +++ b/mono/mini/mini-arm.c @@ -4039,6 +4039,12 @@ mono_arm_eabi_supported (void) return eabi_supported; } +int +mono_arm_i8_align (void) +{ + return i8_align; +} + #ifndef DISABLE_JIT static guint8* diff --git a/mono/mini/mini-arm.h b/mono/mini/mini-arm.h index eec8a507f28..671014199b8 100644 --- a/mono/mini/mini-arm.h +++ b/mono/mini/mini-arm.h @@ -393,6 +393,9 @@ mono_arm_thumb_supported (void); gboolean mono_arm_eabi_supported (void); +int +mono_arm_i8_align (void); + GSList* mono_arm_get_exception_trampolines (gboolean aot); -- 2.25.1