From 67441500e4c94b425effac195772e9f17751068f Mon Sep 17 00:00:00 2001 From: Bernhard Urban Date: Wed, 17 May 2017 13:40:58 +0200 Subject: [PATCH] [interp] make mixed mode work on arm --- mono/mini/exceptions-arm.c | 22 +++++++++++++--------- mono/mini/mini-exceptions.c | 4 ++++ 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/mono/mini/exceptions-arm.c b/mono/mini/exceptions-arm.c index 109dd60841b..dac83f0bb43 100644 --- a/mono/mini/exceptions-arm.c +++ b/mono/mini/exceptions-arm.c @@ -465,20 +465,24 @@ mono_arch_unwind_frame (MonoDomain *domain, MonoJitTlsData *jit_tls, } else if (*lmf) { if (((gsize)(*lmf)->previous_lmf) & 2) { - /* - * This LMF entry is created by the soft debug code to mark transitions to - * managed code done during invokes. - */ MonoLMFExt *ext = (MonoLMFExt*)(*lmf); - g_assert (ext->debugger_invoke); - - memcpy (new_ctx, &ext->ctx, sizeof (MonoContext)); + if (ext->debugger_invoke) { + /* + * This LMF entry is created by the soft debug code to mark transitions to + * managed code done during invokes. + */ + frame->type = FRAME_TYPE_DEBUGGER_INVOKE; + memcpy (new_ctx, &ext->ctx, sizeof (MonoContext)); + } else if (ext->interp_exit) { + frame->type = FRAME_TYPE_INTERP_TO_MANAGED; + frame->interp_exit_data = ext->interp_exit_data; + } else { + g_assert_not_reached (); + } *lmf = (gpointer)(((gsize)(*lmf)->previous_lmf) & ~3); - frame->type = FRAME_TYPE_DEBUGGER_INVOKE; - return TRUE; } diff --git a/mono/mini/mini-exceptions.c b/mono/mini/mini-exceptions.c index f03d962cbbf..e612fdf73ba 100644 --- a/mono/mini/mini-exceptions.c +++ b/mono/mini/mini-exceptions.c @@ -2131,6 +2131,10 @@ mono_handle_exception_internal (MonoContext *ctx, MonoObject *obj, gboolean resu /* Undo the IP adjustment done by mono_arch_unwind_frame () */ #if defined(TARGET_AMD64) ctx->gregs [AMD64_RIP] ++; +#elif defined(TARGET_ARM) + ctx->pc ++; + /* set thumb bit */ + ctx->pc |= 1; #elif defined(TARGET_ARM64) ctx->pc ++; #else -- 2.25.1