X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fexceptions-arm.c;h=2c9e748454e8d57a30fe6fa725542e64e4f01b5a;hb=e4aa060bea5bc82362b9ea2c66de4c8da782a061;hp=1e8d571de0db339923eeaccf627b0d0d5b25b8e6;hpb=01bc03ffde6db4fd421f455dd37a083679ccbaa8;p=mono.git diff --git a/mono/mini/exceptions-arm.c b/mono/mini/exceptions-arm.c index 1e8d571de0d..2c9e748454e 100644 --- a/mono/mini/exceptions-arm.c +++ b/mono/mini/exceptions-arm.c @@ -25,6 +25,7 @@ #include #include +#include #include #include #include @@ -35,6 +36,7 @@ #include "mini.h" #include "mini-arm.h" #include "mono/utils/mono-sigcontext.h" +#include "mono/utils/mono-compiler.h" /* * arch_get_restore_context: @@ -61,16 +63,16 @@ mono_arch_get_restore_context (MonoTrampInfo **info, gboolean aot) ctx_reg = ARMREG_R0; if (!mono_arch_is_soft_float ()) { - ARM_ADD_REG_IMM8 (code, ARMREG_IP, ctx_reg, G_STRUCT_OFFSET (MonoContext, fregs)); + ARM_ADD_REG_IMM8 (code, ARMREG_IP, ctx_reg, MONO_STRUCT_OFFSET (MonoContext, fregs)); ARM_FLDMD (code, ARM_VFP_D0, 16, ARMREG_IP); } /* move pc to PC */ - ARM_LDR_IMM (code, ARMREG_IP, ctx_reg, G_STRUCT_OFFSET (MonoContext, pc)); - ARM_STR_IMM (code, ARMREG_IP, ctx_reg, G_STRUCT_OFFSET (MonoContext, regs) + (ARMREG_PC * sizeof (mgreg_t))); + ARM_LDR_IMM (code, ARMREG_IP, ctx_reg, MONO_STRUCT_OFFSET (MonoContext, pc)); + ARM_STR_IMM (code, ARMREG_IP, ctx_reg, MONO_STRUCT_OFFSET (MonoContext, regs) + (ARMREG_PC * sizeof (mgreg_t))); /* restore everything */ - ARM_ADD_REG_IMM8 (code, ARMREG_IP, ctx_reg, G_STRUCT_OFFSET(MonoContext, regs)); + ARM_ADD_REG_IMM8 (code, ARMREG_IP, ctx_reg, MONO_STRUCT_OFFSET(MonoContext, regs)); ARM_LDM (code, ARMREG_IP, 0xffff); /* never reached */ @@ -111,8 +113,8 @@ mono_arch_get_call_filter (MonoTrampInfo **info, gboolean aot) /* restore all the regs from ctx (in r0), but not sp, the stack pointer */ ctx_reg = ARMREG_R0; - ARM_LDR_IMM (code, ARMREG_IP, ctx_reg, G_STRUCT_OFFSET (MonoContext, pc)); - ARM_ADD_REG_IMM8 (code, ARMREG_LR, ctx_reg, G_STRUCT_OFFSET(MonoContext, regs) + (MONO_ARM_FIRST_SAVED_REG * sizeof (mgreg_t))); + ARM_LDR_IMM (code, ARMREG_IP, ctx_reg, MONO_STRUCT_OFFSET (MonoContext, pc)); + ARM_ADD_REG_IMM8 (code, ARMREG_LR, ctx_reg, MONO_STRUCT_OFFSET(MonoContext, regs) + (MONO_ARM_FIRST_SAVED_REG * sizeof (mgreg_t))); ARM_LDM (code, ARMREG_LR, MONO_ARM_REGSAVE_MASK); /* call handler at eip (r1) and set the first arg with the exception (r2) */ ARM_MOV_REG_REG (code, ARMREG_R0, ARMREG_R2); @@ -423,7 +425,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, mono_unwind_frame (unwind_info, unwind_info_len, ji->code_start, (guint8*)ji->code_start + ji->code_size, - ip, regs, MONO_MAX_IREGS + 8, + ip, NULL, regs, MONO_MAX_IREGS + 8, save_locations, MONO_MAX_IREGS, &cfa); for (i = 0; i < 16; ++i) @@ -435,11 +437,6 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, new_ctx->fregs [8 + i] = regs [MONO_MAX_IREGS + i]; #endif - if (*lmf && (MONO_CONTEXT_GET_SP (ctx) >= (gpointer)(*lmf)->sp)) { - /* remove any unused lmf */ - *lmf = (gpointer)(((gsize)(*lmf)->previous_lmf) & ~3); - } - /* Clear thumb bit */ new_ctx->pc &= ~1; @@ -504,20 +501,6 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, return FALSE; } -#if MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX -void -mono_arch_sigctx_to_monoctx (void *sigctx, MonoContext *mctx) -{ - mono_sigctx_to_monoctx (sigctx, mctx); -} - -void -mono_arch_monoctx_to_sigctx (MonoContext *mctx, void *ctx) -{ - mono_monoctx_to_sigctx (mctx, ctx); -} -#endif /* MONO_ARCH_HAVE_SIGCTX_TO_MONOCTX */ - /* * handle_exception: * @@ -540,10 +523,7 @@ handle_signal_exception (gpointer obj) * This works around a gcc 4.5 bug: * https://bugs.launchpad.net/ubuntu/+source/gcc-4.5/+bug/721531 */ -#if defined(__GNUC__) -__attribute__((noinline)) -#endif -static gpointer +static MONO_NEVER_INLINE gpointer get_handle_signal_exception_addr (void) { return handle_signal_exception; @@ -568,7 +548,7 @@ mono_arch_handle_exception (void *ctx, gpointer obj) guint64 sp = UCONTEXT_REG_SP (sigctx); /* Pass the ctx parameter in TLS */ - mono_arch_sigctx_to_monoctx (sigctx, &jit_tls->ex_ctx); + mono_sigctx_to_monoctx (sigctx, &jit_tls->ex_ctx); /* The others in registers */ UCONTEXT_REG_R0 (sigctx) = (gsize)obj; @@ -591,13 +571,13 @@ mono_arch_handle_exception (void *ctx, gpointer obj) MonoContext mctx; gboolean result; - mono_arch_sigctx_to_monoctx (ctx, &mctx); + mono_sigctx_to_monoctx (ctx, &mctx); result = mono_handle_exception (&mctx, obj); /* restore the context so that returning from the signal handler will invoke * the catch clause */ - mono_arch_monoctx_to_sigctx (&mctx, ctx); + mono_monoctx_to_sigctx (&mctx, ctx); return result; #endif }