/* load ESP into EBP */
x86_mov_reg_membase (code, X86_EBP, X86_EAX, G_STRUCT_OFFSET (MonoContext, esp), 4);
- /* Align it, it can be unaligned if it was captured asynchronously */
- x86_alu_reg_imm (code, X86_AND, X86_EBP, ~(MONO_ARCH_LOCALLOC_ALIGNMENT - 1));
/* load return address into ECX */
x86_mov_reg_membase (code, X86_ECX, X86_EAX, G_STRUCT_OFFSET (MonoContext, eip), 4);
/* save the return addr to the restored stack - 4 */
frame->type = FRAME_TYPE_MANAGED;
- if (ji->from_aot)
- unwind_info = mono_aot_get_unwind_info (ji, &unwind_info_len);
- else
- unwind_info = mono_get_cached_unwind_info (ji->used_regs, &unwind_info_len);
+ unwind_info = mono_jinfo_get_unwind_info (ji, &unwind_info_len);
regs [X86_EAX] = new_ctx->eax;
regs [X86_EBX] = new_ctx->ebx;
}
/* Pop arguments off the stack */
- /*
- * FIXME: LLVM doesn't push these, we can't use ji->from_llvm as it describes
- * the callee.
- */
-#ifndef ENABLE_LLVM
- if (ji->has_arch_eh_info)
- new_ctx->esp += mono_jit_info_get_arch_eh_info (ji)->stack_size;
+ if (ji->has_arch_eh_info) {
+ int stack_size;
+
+ stack_size = mono_jit_info_get_arch_eh_info (ji)->stack_size;
+
+ if (stack_size) {
+#ifdef ENABLE_LLVM
+ MonoJitInfo *caller_ji;
+
+ caller_ji = mini_jit_info_table_find (domain, (char*)new_ctx->eip, NULL);
+ /* LLVM doesn't push the arguments */
+ if (caller_ji && !caller_ji->from_llvm)
+ new_ctx->esp += stack_size;
+#else
+ new_ctx->esp += stack_size;
#endif
+ }
+ }
return TRUE;
} else if (*lmf) {