X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini-s390x.c;h=e593e3b350102a00c7a020e36042b5fbdce771ed;hb=032a79f8a2ba11382cb8c027bd5c979acd0c4a6a;hp=1c775f80341a30a556350c99fc5193f9b58b5b14;hpb=0217438747001f40a4a49d6ab3ffb92866bb2fe4;p=mono.git diff --git a/mono/mini/mini-s390x.c b/mono/mini/mini-s390x.c index 1c775f80341..e593e3b3501 100644 --- a/mono/mini/mini-s390x.c +++ b/mono/mini/mini-s390x.c @@ -246,8 +246,8 @@ if (ins->inst_target_bb->native_offset) { \ #define JUMP_SIZE 6 #define ENABLE_WRONG_METHOD_CHECK 0 -#define mono_mini_arch_lock() mono_mutex_lock (&mini_arch_mutex) -#define mono_mini_arch_unlock() mono_mutex_unlock (&mini_arch_mutex) +#define mono_mini_arch_lock() mono_os_mutex_lock (&mini_arch_mutex) +#define mono_mini_arch_unlock() mono_os_mutex_unlock (&mini_arch_mutex) /*========================= End of Defines =========================*/ @@ -275,6 +275,7 @@ if (ins->inst_target_bb->native_offset) { \ #include "jit-icalls.h" #include "ir-emit.h" #include "trace.h" +#include "mini-gc.h" /*========================= End of Includes ========================*/ @@ -577,6 +578,7 @@ emit_unwind_regs(MonoCompile *cfg, guint8 *code, int start, int end, long offset for (i = start; i < end; i++) { mono_emit_unwind_op_offset (cfg, code, i, offset); + mini_gc_set_slot_type_from_cfa (cfg, offset, SLOT_NOREF); offset += sizeof(gulong); } } @@ -1310,7 +1312,8 @@ mono_arch_init (void) { guint8 *code; - mono_mutex_init_recursive (&mini_arch_mutex); + mono_set_partial_sharing_supported (FALSE); + mono_os_mutex_init_recursive (&mini_arch_mutex); ss_trigger_page = mono_valloc (NULL, mono_pagesize (), MONO_MMAP_READ); bp_trigger_page = mono_valloc (NULL, mono_pagesize (), MONO_MMAP_READ); @@ -1341,7 +1344,7 @@ mono_arch_cleanup (void) mono_vfree (ss_trigger_page, mono_pagesize ()); if (bp_trigger_page) mono_vfree (bp_trigger_page, mono_pagesize ()); - mono_mutex_destroy (&mini_arch_mutex); + mono_os_mutex_destroy (&mini_arch_mutex); } /*========================= End of Function ========================*/ @@ -2544,10 +2547,12 @@ mono_arch_emit_outarg_vt (MonoCompile *cfg, MonoInst *ins, MonoInst *src) mono_call_inst_add_outarg_reg (cfg, call, dreg, ainfo->reg, TRUE); } else { + MonoError error; MonoMethodHeader *header; int srcReg; - header = mono_method_get_header (cfg->method); + header = mono_method_get_header_checked (cfg->method, &error); + mono_error_assert_ok (&error); /* FIXME don't swallow the error */ if ((cfg->flags & MONO_CFG_HAS_ALLOCA) || header->num_clauses) srcReg = s390_r11; else @@ -4599,7 +4604,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) s390_tcdb (code, ins->sreg1, 0, s390_r13, 0); s390_jz (code, 0); CODEPTR(code, o); mono_add_patch_info (cfg, code - cfg->native_code, - MONO_PATCH_INFO_EXC, "ArithmeticException"); + MONO_PATCH_INFO_EXC, "OverflowException"); s390_brasl (code, s390_r14,0); PTRSLOT(code, o); } @@ -5384,13 +5389,15 @@ mono_arch_patch_code (MonoCompile *cfg, MonoMethod *method, MonoDomain *domain, guint8 *code, MonoJumpInfo *ji, gboolean run_cctors) { MonoJumpInfo *patch_info; + MonoError error; for (patch_info = ji; patch_info; patch_info = patch_info->next) { unsigned char *ip = patch_info->ip.i + code; gconstpointer target = NULL; target = mono_resolve_patch_target (method, domain, code, - patch_info, run_cctors); + patch_info, run_cctors, &error); + mono_error_raise_exception (&error); /* FIXME: don't raise here */ switch (patch_info->type) { case MONO_PATCH_INFO_IP: @@ -5404,9 +5411,6 @@ mono_arch_patch_code (MonoCompile *cfg, MonoMethod *method, MonoDomain *domain, case MONO_PATCH_INFO_INTERNAL_METHOD: case MONO_PATCH_INFO_JIT_ICALL_ADDR: case MONO_PATCH_INFO_RGCTX_FETCH: - case MONO_PATCH_INFO_MONITOR_ENTER: - case MONO_PATCH_INFO_MONITOR_ENTER_V4: - case MONO_PATCH_INFO_MONITOR_EXIT: case MONO_PATCH_INFO_ABS: { S390_EMIT_CALL (ip, target); continue; @@ -5573,7 +5577,8 @@ mono_arch_emit_prolog (MonoCompile *cfg) CallInfo *cinfo; int tracing = 0, argsClobbered = 0, - lmfOffset; + lmfOffset, + fpOffset; cfg->code_size = 512; @@ -5592,6 +5597,7 @@ mono_arch_emit_prolog (MonoCompile *cfg) emit_unwind_regs(cfg, code, s390_r6, s390_r14, S390_REG_SAVE_OFFSET); s390_stmg (code, s390_r6, s390_r14, STK_BASE, S390_REG_SAVE_OFFSET); mono_emit_unwind_op_offset (cfg, code, s390_r14, S390_RET_ADDR_OFFSET); + mini_gc_set_slot_type_from_cfa (cfg, S390_RET_ADDR_OFFSET, SLOT_NOREF); if (cfg->arch.bkchain_reg != -1) s390_lgr (code, cfg->arch.bkchain_reg, STK_BASE); @@ -5778,6 +5784,12 @@ mono_arch_emit_prolog (MonoCompile *cfg) s390_stmg (code, s390_r2, s390_r6, s390_r13, G_STRUCT_OFFSET(MonoLMF, pregs[0])); + mini_gc_set_slot_type_from_fp (cfg, lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, pregs[0]), SLOT_NOREF); + mini_gc_set_slot_type_from_fp (cfg, lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, pregs[1]), SLOT_NOREF); + mini_gc_set_slot_type_from_fp (cfg, lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, pregs[2]), SLOT_NOREF); + mini_gc_set_slot_type_from_fp (cfg, lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, pregs[3]), SLOT_NOREF); + mini_gc_set_slot_type_from_fp (cfg, lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, pregs[4]), SLOT_NOREF); + /*---------------------------------------------------------------*/ /* On return from this call r2 have the address of the &lmf */ /*---------------------------------------------------------------*/ @@ -5801,6 +5813,7 @@ mono_arch_emit_prolog (MonoCompile *cfg) /*---------------------------------------------------------------*/ s390_stg (code, s390_r2, 0, s390_r13, G_STRUCT_OFFSET(MonoLMF, lmf_addr)); + mini_gc_set_slot_type_from_fp (cfg, lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, lmf_addr), SLOT_NOREF); /*---------------------------------------------------------------*/ /* Get current lmf */ @@ -5817,6 +5830,7 @@ mono_arch_emit_prolog (MonoCompile *cfg) /*---------------------------------------------------------------*/ s390_stg (code, s390_r0, 0, s390_r13, G_STRUCT_OFFSET(MonoLMF, previous_lmf)); + mini_gc_set_slot_type_from_fp (cfg, lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, previous_lmf), SLOT_NOREF); /*---------------------------------------------------------------*/ /* save method info */ @@ -5824,6 +5838,7 @@ mono_arch_emit_prolog (MonoCompile *cfg) S390_SET (code, s390_r1, method); s390_stg (code, s390_r1, 0, s390_r13, G_STRUCT_OFFSET(MonoLMF, method)); + mini_gc_set_slot_type_from_fp (cfg, lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, method), SLOT_NOREF); /*---------------------------------------------------------------*/ /* save the current IP */ @@ -5831,15 +5846,32 @@ mono_arch_emit_prolog (MonoCompile *cfg) s390_stg (code, STK_BASE, 0, s390_r13, G_STRUCT_OFFSET(MonoLMF, ebp)); s390_basr (code, s390_r1, 0); s390_stg (code, s390_r1, 0, s390_r13, G_STRUCT_OFFSET(MonoLMF, eip)); + mini_gc_set_slot_type_from_fp (cfg, lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, ebp), SLOT_NOREF); + mini_gc_set_slot_type_from_fp (cfg, lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, eip), SLOT_NOREF); /*---------------------------------------------------------------*/ /* Save general and floating point registers */ /*---------------------------------------------------------------*/ s390_stmg (code, s390_r2, s390_r12, s390_r13, G_STRUCT_OFFSET(MonoLMF, gregs[2])); + mini_gc_set_slot_type_from_fp (cfg, lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, gregs[0]), SLOT_NOREF); + mini_gc_set_slot_type_from_fp (cfg, lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, gregs[1]), SLOT_NOREF); + mini_gc_set_slot_type_from_fp (cfg, lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, gregs[2]), SLOT_NOREF); + mini_gc_set_slot_type_from_fp (cfg, lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, gregs[3]), SLOT_NOREF); + mini_gc_set_slot_type_from_fp (cfg, lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, gregs[4]), SLOT_NOREF); + mini_gc_set_slot_type_from_fp (cfg, lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, gregs[5]), SLOT_NOREF); + mini_gc_set_slot_type_from_fp (cfg, lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, gregs[6]), SLOT_NOREF); + mini_gc_set_slot_type_from_fp (cfg, lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, gregs[7]), SLOT_NOREF); + mini_gc_set_slot_type_from_fp (cfg, lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, gregs[8]), SLOT_NOREF); + mini_gc_set_slot_type_from_fp (cfg, lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, gregs[9]), SLOT_NOREF); + mini_gc_set_slot_type_from_fp (cfg, lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, gregs[10]), SLOT_NOREF); + + fpOffset = lmfOffset + MONO_STRUCT_OFFSET (MonoLMF, fregs[0]); for (i = 0; i < 16; i++) { s390_std (code, i, 0, s390_r13, G_STRUCT_OFFSET(MonoLMF, fregs[i])); + mini_gc_set_slot_type_from_fp (cfg, fpOffset, SLOT_NOREF); + fpOffset += sizeof(double); } /*---------------------------------------------------------------*/ @@ -6047,10 +6079,9 @@ mono_arch_emit_exceptions (MonoCompile *cfg) /*-----------------------------------------------------*/ s390_patch_rel (ip + 2, (guint64) S390_RELATIVE(code,ip)); - exc_class = mono_class_from_name (mono_defaults.corlib, + exc_class = mono_class_load_from_name (mono_defaults.corlib, "System", patch_info->data.name); - g_assert (exc_class); throw_ip = patch_info->ip.i; for (iExc = 0; iExc < nThrows; ++iExc)