[interp] make mixed mode work on arm64
authorBernhard Urban <bernhard.urban@xamarin.com>
Wed, 17 May 2017 11:40:58 +0000 (13:40 +0200)
committerBernhard Urban <bernhard.urban@xamarin.com>
Wed, 17 May 2017 15:36:43 +0000 (17:36 +0200)
mono/mini/exceptions-arm64.c
mono/mini/mini-arm64.h
mono/mini/mini-exceptions.c

index a991846b99ee55e691eb1e44392352d8a18d1480..29dc7709aa029ff9263677be3fe9e015d2d8231d 100644 (file)
@@ -484,20 +484,24 @@ mono_arch_unwind_frame (MonoDomain *domain, MonoJitTlsData *jit_tls,
                return TRUE;
        } 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;
                }
 
index 8b59f02e3f078d355734c56236c8a98224ffcaf4..c7cd1fb1262f4f40dc91cf98e148f5f1f61fd03c 100644 (file)
@@ -155,6 +155,7 @@ typedef struct {
 #define MONO_ARCH_HAVE_OPCODE_NEEDS_EMULATION 1
 #define MONO_ARCH_HAVE_DECOMPOSE_LONG_OPTS 1
 #define MONO_ARCH_HAVE_HANDLER_BLOCK_GUARD 1
+#define MONO_ARCH_HAVE_INIT_LMF_EXT 1
 #ifndef TARGET_IOS
 #define MONO_ARCH_HAVE_HANDLER_BLOCK_GUARD_AOT 1
 #endif
index 099e6e10dd03ccda34fd010318f18e52b37674e5..f03d962cbbf2b6879aaa71108f9bfa746339e4ac 100644 (file)
@@ -2129,8 +2129,10 @@ mono_handle_exception_internal (MonoContext *ctx, MonoObject *obj, gboolean resu
                                                 */
                                                mono_interp_set_resume_state (mono_ex, &frame, ei->handler_start);
                                                /* Undo the IP adjustment done by mono_arch_unwind_frame () */
-#ifdef TARGET_AMD64
+#if defined(TARGET_AMD64)
                                                ctx->gregs [AMD64_RIP] ++;
+#elif defined(TARGET_ARM64)
+                                               ctx->pc ++;
 #else
                                                NOT_IMPLEMENTED;
 #endif