[aot] Don't hardcode the nursery size in aot write barriers
authorVlad Brezae <brezaevlad@gmail.com>
Mon, 9 Nov 2015 20:12:28 +0000 (22:12 +0200)
committerVlad Brezae <brezaevlad@gmail.com>
Mon, 9 Nov 2015 23:16:48 +0000 (01:16 +0200)
It can be passed at runtime in the nursery-size option of MONO_GC_PARAMS environment variable.

Fixes #35414

mono/cil/opcode.def
mono/metadata/sgen-mono.c
mono/mini/aot-compiler.c
mono/mini/aot-runtime.c
mono/mini/method-to-ir.c
mono/mini/mini-runtime.c
mono/mini/patch-info.h

index 037b5ef83feed1b970a367676abc3df93d6def2e..96f53eb9eef0f626ddd7f0f7f10c99026961f063 100644 (file)
@@ -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)
index c9d2236216af740bc4212c802cf4c2554eed95e4..00de77ead91397c4f58c217dccd27b36e66f1380 100644 (file)
@@ -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);
index 509b9ef5897907c1af9e4d1a55cb741432157157..220d89d4e5f87788399821b42083998540e2b8b5 100644 (file)
@@ -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;
index 1bd466e298688657350bad9ad181b1ac80fb076b..63f6e1f713f84648ae33628e5db5fd12e6b0c5ca 100644 (file)
@@ -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:
index 29943e669299e8b6716b5a3d0682f0888d043bf0..eca54d9159f3411809b0edb1778fdf17a429dc84 100644 (file)
@@ -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);
 
index 35cd3c32040e6b60621b68a615ef98dc6a3ac001..d073a2c1db6d4b4157b664eea19cccf1330e77c6 100644 (file)
@@ -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;
index 8b77c438721b0280a37688ba279136d663308bd3..ca4ea9fd7d3641675a7f3ef6dd8591bbec0591f6 100644 (file)
@@ -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")