[jit] Fix the processing of LLVM compiled method frames on x86. Fixes running corlib...
authorZoltan Varga <vargaz@gmail.com>
Fri, 1 Nov 2013 12:14:38 +0000 (13:14 +0100)
committerZoltan Varga <vargaz@gmail.com>
Fri, 1 Nov 2013 12:14:48 +0000 (13:14 +0100)
mono/mini/exceptions-x86.c

index 8c1222c42ec26e37e75bf5fda057e4d588357d76..03ed0db4e9d7dcd3dd6e493363d474091a4f2604 100644 (file)
@@ -855,9 +855,19 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls,
                /* Adjust IP */
                new_ctx->eip --;
 
-               if (*lmf && (MONO_CONTEXT_GET_BP (ctx) >= (gpointer)(*lmf)->ebp)) {
-                       /* remove any unused lmf */
-                       *lmf = (gpointer)(((gsize)(*lmf)->previous_lmf) & ~3);
+               if (*lmf && ((*lmf) != jit_tls->first_lmf)) {
+                       gboolean is_tramp = ((guint32)((*lmf)->previous_lmf) & 1);
+                       gpointer lmf_esp;
+
+                       if (is_tramp)
+                               /* lmf->esp is only set in trampoline frames */
+                               lmf_esp = (gpointer)(*lmf)->esp;
+                       else
+                               /* In non-trampoline frames, ebp is the frame pointer */
+                               lmf_esp = (gpointer)(*lmf)->ebp;
+                       if (!is_tramp && MONO_CONTEXT_GET_SP (ctx) >= (gpointer)(*lmf)->ebp)
+                               /* remove any unused lmf */
+                               *lmf = (gpointer)(((gsize)(*lmf)->previous_lmf) & ~3);
                }
 
                /* Pop arguments off the stack */