X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fexceptions-x86.c;h=87a67abd930f3d4ee33149018d6a2ed89ca38fb1;hb=1f5d985270df9390f9cb558656763ea428c14e2c;hp=bfd42414e0bf535b9080d175f45b1de5d342f569;hpb=addc8c1b857b98065af41976874f29533c5277d9;p=mono.git diff --git a/mono/mini/exceptions-x86.c b/mono/mini/exceptions-x86.c index bfd42414e0b..87a67abd930 100644 --- a/mono/mini/exceptions-x86.c +++ b/mono/mini/exceptions-x86.c @@ -12,6 +12,9 @@ #include #include #include +#ifdef HAVE_UCONTEXT_H +#include +#endif #include #include @@ -20,7 +23,7 @@ #include #include #include -#include +#include #include #include @@ -109,6 +112,9 @@ mono_win32_get_handle_stackoverflow (void) /* return */ x86_ret (code); + mono_arch_flush_icache (start, code - start); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_EXCEPTION_HANDLING, NULL); + return start; } @@ -157,7 +163,7 @@ win32_handle_stack_overflow (EXCEPTION_POINTERS* ep, struct sigcontext *sctx) do { MonoContext new_ctx; - mono_arch_find_jit_info (domain, jit_tls, &rji, &ctx, &new_ctx, &lmf, NULL, &frame); + mono_arch_unwind_frame (domain, jit_tls, &rji, &ctx, &new_ctx, &lmf, NULL, &frame); if (!frame.ji) { g_warning ("Exception inside function without unwind info"); g_assert_not_reached (); @@ -354,6 +360,9 @@ mono_arch_get_restore_context (MonoTrampInfo **info, gboolean aot) g_slist_free (unwind_ops); } + mono_arch_flush_icache (start, code - start); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_EXCEPTION_HANDLING, NULL); + return start; } @@ -431,6 +440,9 @@ mono_arch_get_call_filter (MonoTrampInfo **info, gboolean aot) g_slist_free (unwind_ops); } + mono_arch_flush_icache (start, code - start); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_EXCEPTION_HANDLING, NULL); + g_assert ((code - start) < kMaxCodeSize); return start; } @@ -463,8 +475,10 @@ mono_x86_throw_exception (mgreg_t *regs, MonoObject *exc, if (mono_object_isinst (exc, mono_defaults.exception_class)) { MonoException *mono_ex = (MonoException*)exc; - if (!rethrow) + if (!rethrow) { mono_ex->stack_trace = NULL; + mono_ex->trace_ips = NULL; + } } /* adjust eip so that it point into the call instruction */ @@ -550,8 +564,7 @@ get_throw_trampoline (const char *name, gboolean rethrow, gboolean llvm, gboolea * <- esp (unaligned on apple) */ - mono_add_unwind_op_def_cfa (unwind_ops, (guint8*)NULL, (guint8*)NULL, X86_ESP, 4); - mono_add_unwind_op_offset (unwind_ops, (guint8*)NULL, (guint8*)NULL, X86_NREG, -4); + unwind_ops = mono_arch_get_cie_program (); /* Alloc frame */ x86_alu_reg_imm (code, X86_SUB, X86_ESP, stack_size); @@ -653,6 +666,9 @@ get_throw_trampoline (const char *name, gboolean rethrow, gboolean llvm, gboolea g_slist_free (unwind_ops); } + mono_arch_flush_icache (start, code - start); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_EXCEPTION_HANDLING, NULL); + return start; } @@ -700,13 +716,14 @@ void mono_arch_exceptions_init (void) { guint8 *tramp; + MonoTrampInfo *tinfo; /* * If we're running WoW64, we need to set the usermode exception policy * for SEHs to behave. This requires hotfix http://support.microsoft.com/kb/976038 * or (eventually) Windows 7 SP1. */ -#ifdef HOST_WIN32 +#ifdef TARGET_WIN32 DWORD flags; FARPROC getter; FARPROC setter; @@ -728,31 +745,37 @@ mono_arch_exceptions_init (void) } /* LLVM needs different throw trampolines */ - tramp = get_throw_trampoline ("llvm_throw_exception_trampoline", FALSE, TRUE, FALSE, FALSE, FALSE, NULL, FALSE); + tramp = get_throw_trampoline ("llvm_throw_exception_trampoline", FALSE, TRUE, FALSE, FALSE, FALSE, &tinfo, FALSE); mono_register_jit_icall (tramp, "llvm_throw_exception_trampoline", NULL, TRUE); + mono_tramp_info_register (tinfo, NULL); - tramp = get_throw_trampoline ("llvm_rethrow_exception_trampoline", FALSE, TRUE, FALSE, FALSE, FALSE, NULL, FALSE); + tramp = get_throw_trampoline ("llvm_rethrow_exception_trampoline", TRUE, TRUE, FALSE, FALSE, FALSE, &tinfo, FALSE); mono_register_jit_icall (tramp, "llvm_rethrow_exception_trampoline", NULL, TRUE); + mono_tramp_info_register (tinfo, NULL); - tramp = get_throw_trampoline ("llvm_throw_corlib_exception_trampoline", FALSE, TRUE, TRUE, FALSE, FALSE, NULL, FALSE); + tramp = get_throw_trampoline ("llvm_throw_corlib_exception_trampoline", FALSE, TRUE, TRUE, FALSE, FALSE, &tinfo, FALSE); mono_register_jit_icall (tramp, "llvm_throw_corlib_exception_trampoline", NULL, TRUE); + mono_tramp_info_register (tinfo, NULL); - tramp = get_throw_trampoline ("llvm_throw_corlib_exception_abs_trampoline", FALSE, TRUE, TRUE, TRUE, FALSE, NULL, FALSE); + tramp = get_throw_trampoline ("llvm_throw_corlib_exception_abs_trampoline", FALSE, TRUE, TRUE, TRUE, FALSE, &tinfo, FALSE); mono_register_jit_icall (tramp, "llvm_throw_corlib_exception_abs_trampoline", NULL, TRUE); + mono_tramp_info_register (tinfo, NULL); - tramp = get_throw_trampoline ("llvm_resume_unwind_trampoline", FALSE, FALSE, FALSE, FALSE, TRUE, NULL, FALSE); + tramp = get_throw_trampoline ("llvm_resume_unwind_trampoline", FALSE, FALSE, FALSE, FALSE, TRUE, &tinfo, FALSE); mono_register_jit_icall (tramp, "llvm_resume_unwind_trampoline", NULL, TRUE); + mono_tramp_info_register (tinfo, NULL); - signal_exception_trampoline = mono_x86_get_signal_exception_trampoline (NULL, FALSE); + signal_exception_trampoline = mono_x86_get_signal_exception_trampoline (&tinfo, FALSE); + mono_tramp_info_register (tinfo, NULL); } /* - * mono_arch_find_jit_info: + * mono_arch_unwind_frame: * * See exceptions-amd64.c for docs. */ gboolean -mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, +mono_arch_unwind_frame (MonoDomain *domain, MonoJitTlsData *jit_tls, MonoJitInfo *ji, MonoContext *ctx, MonoContext *new_ctx, MonoLMF **lmf, mgreg_t **save_locations, @@ -771,7 +794,10 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, guint32 unwind_info_len; guint8 *unwind_info; - frame->type = FRAME_TYPE_MANAGED; + if (ji->is_trampoline) + frame->type = FRAME_TYPE_TRAMPOLINE; + else + frame->type = FRAME_TYPE_MANAGED; unwind_info = mono_jinfo_get_unwind_info (ji, &unwind_info_len); @@ -867,7 +893,7 @@ mono_arch_find_jit_info (MonoDomain *domain, MonoJitTlsData *jit_tls, gpointer mono_arch_ip_from_context (void *sigctx) { -#if defined(__native_client__) +#if defined(__native_client__) || defined(HOST_WATCHOS) printf("WARNING: mono_arch_ip_from_context() called!\n"); return (NULL); #elif defined(MONO_ARCH_USE_SIGACTION) @@ -914,11 +940,12 @@ mono_x86_get_signal_exception_trampoline (MonoTrampInfo **info, gboolean aot) start = code = mono_global_codeman_reserve (128); + /* FIXME no unwind before we push ip */ /* Caller ip */ x86_push_reg (code, X86_ECX); - mono_add_unwind_op_def_cfa (unwind_ops, (guint8*)NULL, (guint8*)NULL, X86_ESP, 4); - mono_add_unwind_op_offset (unwind_ops, (guint8*)NULL, (guint8*)NULL, X86_NREG, -4); + mono_add_unwind_op_def_cfa (unwind_ops, code, start, X86_ESP, 4); + mono_add_unwind_op_offset (unwind_ops, code, start, X86_NREG, -4); /* Fix the alignment to be what apple expects */ stack_size = 12; @@ -943,6 +970,9 @@ mono_x86_get_signal_exception_trampoline (MonoTrampInfo **info, gboolean aot) g_slist_free (unwind_ops); } + mono_arch_flush_icache (start, code - start); + mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_EXCEPTION_HANDLING, NULL); + return start; }