Merge branch 'alexischr/nursery-canaries-managed-alloc'
authorAlexis Christoforides <alexis@thenull.net>
Tue, 22 Nov 2016 19:10:22 +0000 (14:10 -0500)
committerAlexis Christoforides <alexis@thenull.net>
Tue, 22 Nov 2016 19:12:53 +0000 (14:12 -0500)
1  2 
mono/metadata/sgen-mono.c
mono/sgen/sgen-gc.h

index 26e6a089b5dbb987e5d5cb6af8efc54b7c63eca1,a822dd057bb2874e60e3d006a1ddd0cb54228eec..6930b8e3f5e91caefd0ea61d76127238595da906
@@@ -1064,10 -1052,9 +1064,10 @@@ static gboolean use_managed_allocator 
   * that they are executed atomically via the restart mechanism.
   */
  static MonoMethod*
 -create_allocator (int atype, gboolean slowpath)
 +create_allocator (int atype, ManagedAllocatorVariant variant)
  {
-       int p_var, size_var, thread_var G_GNUC_UNUSED;
 -      int p_var, size_var, real_size_var;
++      int p_var, size_var, real_size_var, thread_var G_GNUC_UNUSED;
 +      gboolean slowpath = variant == MANAGED_ALLOCATOR_SLOW_PATH;
        guint32 slowpath_branch, max_size_branch;
        MonoMethodBuilder *mb;
        MonoMethod *res;
                g_assert_not_reached ();
        }
  
 +#ifdef MANAGED_ALLOCATOR_CAN_USE_CRITICAL_REGION
 +      EMIT_TLS_ACCESS_IN_CRITICAL_REGION_ADDR (mb, thread_var);
 +      mono_mb_emit_byte (mb, CEE_LDC_I4_1);
 +      mono_mb_emit_byte (mb, MONO_CUSTOM_PREFIX);
 +      mono_mb_emit_byte (mb, CEE_MONO_ATOMIC_STORE_I4);
 +      mono_mb_emit_i4 (mb, MONO_MEMORY_BARRIER_NONE);
 +#endif
 +
+       if (nursery_canaries_enabled ()) {
+               real_size_var = mono_mb_add_local (mb, &mono_defaults.int_class->byval_arg);
+               mono_mb_emit_ldloc (mb, size_var);
+               mono_mb_emit_stloc(mb, real_size_var);
+       }
+       else
+               real_size_var = size_var;
        /* size += ALLOC_ALIGN - 1; */
        mono_mb_emit_ldloc (mb, size_var);
        mono_mb_emit_icon (mb, SGEN_ALLOC_ALIGN - 1);
@@@ -3010,16 -2996,11 +3034,13 @@@ mono_gc_base_init (void
  
        sgen_gc_init ();
  
-       if (nursery_canaries_enabled ())
-               sgen_set_use_managed_allocator (FALSE);
  #if defined(HAVE_KW_THREAD)
        /* This can happen with using libmonosgen.so */
 -      if (mono_tls_key_get_offset (TLS_KEY_SGEN_TLAB_NEXT_ADDR) == -1)
 +      if (mono_tls_key_get_offset (TLS_KEY_SGEN_THREAD_INFO) == -1)
                sgen_set_use_managed_allocator (FALSE);
  #endif
 +
 +      gc_inited = TRUE;
  }
  
  void
Simple merge