From 85581ff1bb8b28141ec1823b7371efa5a14551bb Mon Sep 17 00:00:00 2001 From: Vlad Brezae Date: Mon, 9 Nov 2015 22:12:28 +0200 Subject: [PATCH] [aot] Don't hardcode the nursery size in aot write barriers It can be passed at runtime in the nursery-size option of MONO_GC_PARAMS environment variable. Fixes #35414 --- mono/cil/opcode.def | 1 + mono/metadata/sgen-mono.c | 9 ++++++--- mono/mini/aot-compiler.c | 8 ++++++++ mono/mini/aot-runtime.c | 3 +++ mono/mini/method-to-ir.c | 17 +++++++++++++++++ mono/mini/mini-runtime.c | 10 ++++++++++ mono/mini/patch-info.h | 1 + 7 files changed, 46 insertions(+), 3 deletions(-) diff --git a/mono/cil/opcode.def b/mono/cil/opcode.def index 037b5ef83fe..96f53eb9eef 100644 --- a/mono/cil/opcode.def +++ b/mono/cil/opcode.def @@ -315,6 +315,7 @@ OPDEF(CEE_MONO_JIT_ICALL_ADDR, "mono_jit_icall_addr", Pop0, PushI, InlineI, X, 2 OPDEF(CEE_MONO_LDPTR_INT_REQ_FLAG, "mono_ldptr_int_req_flag", Pop0, PushI, InlineNone, X, 2, 0xF0, 0x14, NEXT) OPDEF(CEE_MONO_LDPTR_CARD_TABLE, "mono_ldptr_card_table", Pop0, PushI, InlineNone, X, 2, 0xF0, 0x15, NEXT) OPDEF(CEE_MONO_LDPTR_NURSERY_START, "mono_ldptr_nursery_start", Pop0, PushI, InlineNone, X, 2, 0xF0, 0x16, NEXT) +OPDEF(CEE_MONO_LDPTR_NURSERY_BITS, "mono_ldptr_nursery_bits", Pop0, PushI, InlineNone, X, 2, 0xF0, 0x17, NEXT) #ifndef OPALIAS #define _MONO_CIL_OPALIAS_DEFINED_ #define OPALIAS(a,s,r) diff --git a/mono/metadata/sgen-mono.c b/mono/metadata/sgen-mono.c index c9d2236216a..00de77ead91 100644 --- a/mono/metadata/sgen-mono.c +++ b/mono/metadata/sgen-mono.c @@ -220,12 +220,14 @@ emit_nursery_check (MonoMethodBuilder *mb, int *nursery_check_return_labels, gbo */ mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); mono_mb_emit_byte (mb, CEE_MONO_LDPTR_NURSERY_START); - mono_mb_emit_icon (mb, DEFAULT_NURSERY_BITS); + mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); + mono_mb_emit_byte (mb, CEE_MONO_LDPTR_NURSERY_BITS); mono_mb_emit_byte (mb, CEE_SHR_UN); mono_mb_emit_stloc (mb, shifted_nursery_start); mono_mb_emit_ldarg (mb, 0); - mono_mb_emit_icon (mb, DEFAULT_NURSERY_BITS); + mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); + mono_mb_emit_byte (mb, CEE_MONO_LDPTR_NURSERY_BITS); mono_mb_emit_byte (mb, CEE_SHR_UN); mono_mb_emit_ldloc (mb, shifted_nursery_start); nursery_check_return_labels [0] = mono_mb_emit_branch (mb, CEE_BEQ); @@ -234,7 +236,8 @@ emit_nursery_check (MonoMethodBuilder *mb, int *nursery_check_return_labels, gbo // if (!ptr_in_nursery (*ptr)) return; mono_mb_emit_ldarg (mb, 0); mono_mb_emit_byte (mb, CEE_LDIND_I); - mono_mb_emit_icon (mb, DEFAULT_NURSERY_BITS); + mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX); + mono_mb_emit_byte (mb, CEE_MONO_LDPTR_NURSERY_BITS); mono_mb_emit_byte (mb, CEE_SHR_UN); mono_mb_emit_ldloc (mb, shifted_nursery_start); nursery_check_return_labels [1] = mono_mb_emit_branch (mb, CEE_BNE_UN); diff --git a/mono/mini/aot-compiler.c b/mono/mini/aot-compiler.c index 509b9ef5897..220d89d4e5f 100644 --- a/mono/mini/aot-compiler.c +++ b/mono/mini/aot-compiler.c @@ -5172,6 +5172,7 @@ encode_patch (MonoAotCompile *acfg, MonoJumpInfo *patch_info, guint8 *buf, guint case MONO_PATCH_INFO_JIT_TLS_ID: case MONO_PATCH_INFO_GC_CARD_TABLE_ADDR: case MONO_PATCH_INFO_GC_NURSERY_START: + case MONO_PATCH_INFO_GC_NURSERY_BITS: break; case MONO_PATCH_INFO_CASTCLASS_CACHE: encode_value (patch_info->data.index, p, &p); @@ -5444,6 +5445,7 @@ emit_method_info (MonoAotCompile *acfg, MonoCompile *cfg) if (patch_info->type == MONO_PATCH_INFO_GC_CARD_TABLE_ADDR || patch_info->type == MONO_PATCH_INFO_GC_NURSERY_START || + patch_info->type == MONO_PATCH_INFO_GC_NURSERY_BITS || patch_info->type == MONO_PATCH_INFO_AOT_MODULE) { /* Stored in a GOT slot initialized at module load time */ patch_info->type = MONO_PATCH_INFO_NONE; @@ -7047,6 +7049,7 @@ compile_method (MonoAotCompile *acfg, MonoMethod *method) case MONO_PATCH_INFO_NONE: case MONO_PATCH_INFO_GC_CARD_TABLE_ADDR: case MONO_PATCH_INFO_GC_NURSERY_START: + case MONO_PATCH_INFO_GC_NURSERY_BITS: break; case MONO_PATCH_INFO_IMAGE: /* The assembly is stored in GOT slot 0 */ @@ -9521,6 +9524,11 @@ add_preinit_got_slots (MonoAotCompile *acfg) get_got_offset (acfg, FALSE, ji); get_got_offset (acfg, TRUE, ji); + ji = mono_mempool_alloc0 (acfg->mempool, sizeof (MonoJumpInfo)); + ji->type = MONO_PATCH_INFO_GC_NURSERY_BITS; + get_got_offset (acfg, FALSE, ji); + get_got_offset (acfg, TRUE, ji); + for (i = 0; i < sizeof (preinited_jit_icalls) / sizeof (char*); ++i) { ji = mono_mempool_alloc0 (acfg->mempool, sizeof (MonoAotCompile)); ji->type = MONO_PATCH_INFO_INTERNAL_METHOD; diff --git a/mono/mini/aot-runtime.c b/mono/mini/aot-runtime.c index 1bd466e2986..63f6e1f713f 100644 --- a/mono/mini/aot-runtime.c +++ b/mono/mini/aot-runtime.c @@ -1800,6 +1800,8 @@ init_amodule_got (MonoAotModule *amodule) amodule->shared_got [i] = NULL; } else if (ji->type == MONO_PATCH_INFO_GC_NURSERY_START && !mono_gc_is_moving ()) { amodule->shared_got [i] = NULL; + } else if (ji->type == MONO_PATCH_INFO_GC_NURSERY_BITS && !mono_gc_is_moving ()) { + amodule->shared_got [i] = NULL; } else if (ji->type == MONO_PATCH_INFO_IMAGE) { amodule->shared_got [i] = amodule->assembly->image; } else if (ji->type == MONO_PATCH_INFO_MSCORLIB_GOT_ADDR) { @@ -3425,6 +3427,7 @@ decode_patch (MonoAotModule *aot_module, MonoMemPool *mp, MonoJumpInfo *ji, guin case MONO_PATCH_INFO_INTERRUPTION_REQUEST_FLAG: case MONO_PATCH_INFO_GC_CARD_TABLE_ADDR: case MONO_PATCH_INFO_GC_NURSERY_START: + case MONO_PATCH_INFO_GC_NURSERY_BITS: case MONO_PATCH_INFO_JIT_TLS_ID: break; case MONO_PATCH_INFO_CASTCLASS_CACHE: diff --git a/mono/mini/method-to-ir.c b/mono/mini/method-to-ir.c index 29943e66929..eca54d9159f 100644 --- a/mono/mini/method-to-ir.c +++ b/mono/mini/method-to-ir.c @@ -12171,6 +12171,23 @@ mono_method_to_ir (MonoCompile *cfg, MonoMethod *method, MonoBasicBlock *start_b inline_costs += 10 * num_calls++; break; } + case CEE_MONO_LDPTR_NURSERY_BITS: { + int shift_bits; + size_t size; + CHECK_STACK_OVF (1); + + if (cfg->compile_aot) { + EMIT_NEW_AOTCONST (cfg, ins, MONO_PATCH_INFO_GC_NURSERY_BITS, NULL); + } else { + mono_gc_get_nursery (&shift_bits, &size); + EMIT_NEW_PCONST (cfg, ins, (gpointer)(mgreg_t)shift_bits); + } + + *sp++ = ins; + ip += 2; + inline_costs += 10 * num_calls++; + break; + } case CEE_MONO_LDPTR_INT_REQ_FLAG: { CHECK_STACK_OVF (1); diff --git a/mono/mini/mini-runtime.c b/mono/mini/mini-runtime.c index 35cd3c32040..d073a2c1db6 100644 --- a/mono/mini/mini-runtime.c +++ b/mono/mini/mini-runtime.c @@ -1235,6 +1235,7 @@ mono_patch_info_hash (gconstpointer data) case MONO_PATCH_INFO_MSCORLIB_GOT_ADDR: case MONO_PATCH_INFO_GC_CARD_TABLE_ADDR: case MONO_PATCH_INFO_GC_NURSERY_START: + case MONO_PATCH_INFO_GC_NURSERY_BITS: case MONO_PATCH_INFO_JIT_TLS_ID: case MONO_PATCH_INFO_GOT_OFFSET: case MONO_PATCH_INFO_GC_SAFE_POINT_FLAG: @@ -1662,6 +1663,15 @@ mono_resolve_patch_target (MonoMethod *method, MonoDomain *domain, guint8 *code, target = mono_gc_get_nursery (&shift_bits, &size); break; } + case MONO_PATCH_INFO_GC_NURSERY_BITS: { + int shift_bits; + size_t size; + + mono_gc_get_nursery (&shift_bits, &size); + + target = (gpointer)(mgreg_t)shift_bits; + break; + } case MONO_PATCH_INFO_CASTCLASS_CACHE: { target = mono_domain_alloc0 (domain, sizeof (gpointer)); break; diff --git a/mono/mini/patch-info.h b/mono/mini/patch-info.h index 8b77c438721..ca4ea9fd7d3 100644 --- a/mono/mini/patch-info.h +++ b/mono/mini/patch-info.h @@ -58,3 +58,4 @@ PATCH_INFO(GC_SAFE_POINT_FLAG, "gc_safe_point_flag") PATCH_INFO(NONE, "none") PATCH_INFO(AOT_MODULE, "aot_module") PATCH_INFO(AOT_JIT_INFO, "aot_jit_info") +PATCH_INFO(GC_NURSERY_BITS, "gc_nursery_bits") -- 2.25.1