Imported Upstream version 4.6.0.165

Former-commit-id: d509131f71da404210981e7263b375675928eea7
This commit is contained in:
Xamarin Public Jenkins (auto-signing)
2016-08-25 10:13:16 +00:00
parent b95516a3dd
commit c911219690
458 changed files with 262 additions and 826 deletions

View File

@@ -131,11 +131,9 @@ DECL_OFFSET(MonoThreadsSync, nest)
#ifdef HAVE_SGEN_GC
DECL_OFFSET(SgenClientThreadInfo, in_critical_region)
#ifndef HAVE_KW_THREAD
DECL_OFFSET(SgenThreadInfo, tlab_next_addr)
DECL_OFFSET(SgenThreadInfo, tlab_next)
DECL_OFFSET(SgenThreadInfo, tlab_temp_end)
#endif
#endif
#endif //DISABLE METADATA OFFSETS

View File

@@ -994,32 +994,7 @@ static gboolean use_managed_allocator = TRUE;
#ifdef MANAGED_ALLOCATION
#ifdef HAVE_KW_THREAD
#define EMIT_TLS_ACCESS_VAR(_mb, _var) /* nothing to do */
#define EMIT_TLS_ACCESS_IN_CRITICAL_REGION_ADDR(mb, _var) \
do { \
mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX); \
mono_mb_emit_byte ((mb), CEE_MONO_TLS); \
mono_mb_emit_i4 ((mb), TLS_KEY_SGEN_IN_CRITICAL_REGION_ADDR); \
} while (0)
#define EMIT_TLS_ACCESS_NEXT_ADDR(mb, _var) do { \
mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX); \
mono_mb_emit_byte ((mb), CEE_MONO_TLS); \
mono_mb_emit_i4 ((mb), TLS_KEY_SGEN_TLAB_NEXT_ADDR); \
} while (0)
#define EMIT_TLS_ACCESS_TEMP_END(mb, _var) do { \
mono_mb_emit_byte ((mb), MONO_CUSTOM_PREFIX); \
mono_mb_emit_byte ((mb), CEE_MONO_TLS); \
mono_mb_emit_i4 ((mb), TLS_KEY_SGEN_TLAB_TEMP_END); \
} while (0)
#else
#if defined(TARGET_OSX) || defined(TARGET_WIN32) || defined(TARGET_ANDROID) || defined(TARGET_IOS)
#if defined(HAVE_KW_THREAD) || defined(TARGET_OSX) || defined(TARGET_WIN32) || defined(TARGET_ANDROID) || defined(TARGET_IOS)
// Cache the SgenThreadInfo pointer in a local 'var'.
#define EMIT_TLS_ACCESS_VAR(mb, var) \
@@ -1040,9 +1015,8 @@ static gboolean use_managed_allocator = TRUE;
#define EMIT_TLS_ACCESS_NEXT_ADDR(mb, var) do { \
mono_mb_emit_ldloc ((mb), (var)); \
mono_mb_emit_icon ((mb), MONO_STRUCT_OFFSET (SgenThreadInfo, tlab_next_addr)); \
mono_mb_emit_icon ((mb), MONO_STRUCT_OFFSET (SgenThreadInfo, tlab_next)); \
mono_mb_emit_byte ((mb), CEE_ADD); \
mono_mb_emit_byte ((mb), CEE_LDIND_I); \
} while (0)
#define EMIT_TLS_ACCESS_TEMP_END(mb, var) do { \
@@ -1057,7 +1031,6 @@ static gboolean use_managed_allocator = TRUE;
#define EMIT_TLS_ACCESS_NEXT_ADDR(mb, _var) do { g_error ("sgen is not supported when using --with-tls=pthread.\n"); } while (0)
#define EMIT_TLS_ACCESS_TEMP_END(mb, _var) do { g_error ("sgen is not supported when using --with-tls=pthread.\n"); } while (0)
#define EMIT_TLS_ACCESS_IN_CRITICAL_REGION_ADDR(mb, _var) do { g_error ("sgen is not supported when using --with-tls=pthread.\n"); } while (0)
#endif
#endif
@@ -1145,6 +1118,10 @@ create_allocator (int atype, ManagedAllocatorVariant variant)
goto done;
}
/*
* Tls access might call foreign code or code without jinfo. This can
* only happen if we are outside of the critical region.
*/
EMIT_TLS_ACCESS_VAR (mb, thread_var);
#ifdef MANAGED_ALLOCATOR_CAN_USE_CRITICAL_REGION
@@ -1507,10 +1484,10 @@ mono_gc_get_managed_allocator_by_type (int atype, ManagedAllocatorVariant varian
MonoMethod *res;
MonoMethod **cache;
if (!use_managed_allocator)
if (variant == MANAGED_ALLOCATOR_REGULAR && !use_managed_allocator)
return NULL;
if (!mono_runtime_has_tls_get ())
if (variant == MANAGED_ALLOCATOR_REGULAR && !mono_runtime_has_tls_get ())
return NULL;
switch (variant) {
@@ -2990,7 +2967,7 @@ mono_gc_base_init (void)
#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

View File

@@ -824,7 +824,7 @@ EXTRA_DIST = TestDriver.cs \
Makefile.am.in
version.h: Makefile
echo "#define FULL_VERSION \"Stable 4.6.0.150/d0fc1a6\"" > version.h
echo "#define FULL_VERSION \"Stable 4.6.0.165/23c6a4d\"" > version.h
# Utility target for patching libtool to speed up linking
patch-libtool:

View File

@@ -824,7 +824,7 @@ EXTRA_DIST = TestDriver.cs \
Makefile.am.in
version.h: Makefile
echo "#define FULL_VERSION \"Stable 4.6.0.150/d0fc1a6\"" > version.h
echo "#define FULL_VERSION \"Stable 4.6.0.165/23c6a4d\"" > version.h
# Utility target for patching libtool to speed up linking
patch-libtool:

View File

@@ -1 +1 @@
8661c97fc5b49dd62fa3c458b6a8636dacd3a88d
0a7bed95863ec573d057b5483fa32bf8b8784029

View File

@@ -1 +1 @@
5dc9da91ce53bbcc4a67ac0d7bf46f54bfa0119e
04d5b1fd041a94fe234652daf1ae896b2891ee66

View File

@@ -459,26 +459,26 @@ atomic_exchange_i8: dest:i src1:i src2:i len:32
atomic_cas_i4: dest:i src1:i src2:i src3:i len:32
atomic_cas_i8: dest:i src1:i src2:i src3:i len:32
memory_barrier: len:8 clob:a
atomic_load_i1: dest:i src1:b len:20
atomic_load_u1: dest:i src1:b len:20
atomic_load_i2: dest:i src1:b len:20
atomic_load_u2: dest:i src1:b len:20
atomic_load_i4: dest:i src1:b len:16
atomic_load_u4: dest:i src1:b len:16
atomic_load_i8: dest:i src1:b len:12
atomic_load_u8: dest:i src1:b len:12
atomic_load_r4: dest:f src1:b len:24
atomic_load_r8: dest:f src1:b len:20
atomic_store_i1: dest:b src1:i len:16
atomic_store_u1: dest:b src1:i len:16
atomic_store_i2: dest:b src1:i len:16
atomic_store_u2: dest:b src1:i len:16
atomic_store_i4: dest:b src1:i len:16
atomic_store_u4: dest:b src1:i len:16
atomic_store_i8: dest:b src1:i len:12
atomic_store_u8: dest:b src1:i len:12
atomic_store_r4: dest:b src1:f len:24
atomic_store_r8: dest:b src1:f len:20
atomic_load_i1: dest:i src1:b len:24
atomic_load_u1: dest:i src1:b len:24
atomic_load_i2: dest:i src1:b len:24
atomic_load_u2: dest:i src1:b len:24
atomic_load_i4: dest:i src1:b len:24
atomic_load_u4: dest:i src1:b len:24
atomic_load_i8: dest:i src1:b len:20
atomic_load_u8: dest:i src1:b len:20
atomic_load_r4: dest:f src1:b len:28
atomic_load_r8: dest:f src1:b len:24
atomic_store_i1: dest:b src1:i len:20
atomic_store_u1: dest:b src1:i len:20
atomic_store_i2: dest:b src1:i len:20
atomic_store_u2: dest:b src1:i len:20
atomic_store_i4: dest:b src1:i len:20
atomic_store_u4: dest:b src1:i len:20
atomic_store_i8: dest:b src1:i len:20
atomic_store_u8: dest:b src1:i len:20
atomic_store_r4: dest:b src1:f len:28
atomic_store_r8: dest:b src1:f len:24
generic_class_init: src1:a len:44 clob:c
gc_safe_point: src1:i len:12 clob:c

View File

@@ -1 +1 @@
cb75bdf7a74fda7899a813f97ceae60ad6f7c895
688594d96602b50770485925c92a521726edeea7

View File

@@ -1 +1 @@
237cbd1f9f0cd84a02cf9c448b35d3ee463f467d
a76acc17e46cbc10c09f1cf6671e933495786600

View File

@@ -1 +1 @@
b3f8d8b2972ec79b000a05ec29e18a238c4bb025
a26cd536b26205a3f69081a24c42314c0e520704

View File

@@ -1 +1 @@
#define FULL_VERSION "Stable 4.6.0.150/d0fc1a6"
#define FULL_VERSION "Stable 4.6.0.165/23c6a4d"

View File

@@ -57,27 +57,11 @@ static guint64 stat_bytes_alloced_los = 0;
* tlab_real_end points to the end of the TLAB.
*/
/*
* FIXME: What is faster, a TLS variable pointing to a structure, or separate TLS
* variables for next+temp_end ?
*/
#ifdef HAVE_KW_THREAD
static __thread char *tlab_start;
static __thread char *tlab_next;
static __thread char *tlab_temp_end;
static __thread char *tlab_real_end;
/* Used by the managed allocator/wbarrier */
static __thread char **tlab_next_addr MONO_ATTR_USED;
#ifndef SGEN_WITHOUT_MONO
static __thread volatile int *in_critical_region_addr MONO_ATTR_USED;
#endif
#endif
#ifdef HAVE_KW_THREAD
#define TLAB_START tlab_start
#define TLAB_NEXT tlab_next
#define TLAB_TEMP_END tlab_temp_end
#define TLAB_REAL_END tlab_real_end
#define TLAB_START (sgen_thread_info->tlab_start)
#define TLAB_NEXT (sgen_thread_info->tlab_next)
#define TLAB_TEMP_END (sgen_thread_info->tlab_temp_end)
#define TLAB_REAL_END (sgen_thread_info->tlab_real_end)
#else
#define TLAB_START (__thread_info__->tlab_start)
#define TLAB_NEXT (__thread_info__->tlab_next)
@@ -490,26 +474,6 @@ sgen_alloc_obj_mature (GCVTable vtable, size_t size)
return res;
}
void
sgen_init_tlab_info (SgenThreadInfo* info)
{
#ifndef HAVE_KW_THREAD
SgenThreadInfo *__thread_info__ = info;
#endif
info->tlab_start_addr = &TLAB_START;
info->tlab_next_addr = &TLAB_NEXT;
info->tlab_temp_end_addr = &TLAB_TEMP_END;
info->tlab_real_end_addr = &TLAB_REAL_END;
#ifdef HAVE_KW_THREAD
tlab_next_addr = &tlab_next;
#ifndef SGEN_WITHOUT_MONO
in_critical_region_addr = &info->client_info.in_critical_region;
#endif
#endif
}
/*
* Clear the thread local TLAB variables for all threads.
*/
@@ -518,30 +482,16 @@ sgen_clear_tlabs (void)
{
FOREACH_THREAD (info) {
/* A new TLAB will be allocated when the thread does its first allocation */
*info->tlab_start_addr = NULL;
*info->tlab_next_addr = NULL;
*info->tlab_temp_end_addr = NULL;
*info->tlab_real_end_addr = NULL;
info->tlab_start = NULL;
info->tlab_next = NULL;
info->tlab_temp_end = NULL;
info->tlab_real_end = NULL;
} FOREACH_THREAD_END
}
void
sgen_init_allocator (void)
{
#if defined(HAVE_KW_THREAD) && !defined(SGEN_WITHOUT_MONO)
int tlab_next_addr_offset = -1;
int tlab_temp_end_offset = -1;
int in_critical_region_addr_offset = -1;
MONO_THREAD_VAR_OFFSET (tlab_next_addr, tlab_next_addr_offset);
MONO_THREAD_VAR_OFFSET (tlab_temp_end, tlab_temp_end_offset);
MONO_THREAD_VAR_OFFSET (in_critical_region_addr, in_critical_region_addr_offset);
mono_tls_key_set_offset (TLS_KEY_SGEN_TLAB_NEXT_ADDR, tlab_next_addr_offset);
mono_tls_key_set_offset (TLS_KEY_SGEN_TLAB_TEMP_END, tlab_temp_end_offset);
mono_tls_key_set_offset (TLS_KEY_SGEN_IN_CRITICAL_REGION_ADDR, in_critical_region_addr_offset);
#endif
#ifdef HEAVY_STATISTICS
mono_counters_register ("# objects allocated", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_objects_alloced);
mono_counters_register ("bytes allocated", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_bytes_alloced);

View File

@@ -1 +1 @@
2a1cd09094a18072d2cc366ab4c686942eee3913
921c94696e63d97030b39de7cc7cb998792fc575

View File

@@ -382,17 +382,10 @@ void sgen_scan_area_with_callback (char *start, char *end, IterateObjectCallback
struct _SgenThreadInfo {
SgenClientThreadInfo client_info;
char **tlab_next_addr;
char **tlab_start_addr;
char **tlab_temp_end_addr;
char **tlab_real_end_addr;
#ifndef HAVE_KW_THREAD
char *tlab_start;
char *tlab_next;
char *tlab_temp_end;
char *tlab_real_end;
#endif
};
gboolean sgen_is_worker_thread (MonoNativeThreadId thread);
@@ -977,7 +970,6 @@ typedef enum {
ATYPE_NUM
} SgenAllocatorType;
void sgen_init_tlab_info (SgenThreadInfo* info);
void sgen_clear_tlabs (void);
GCObject* sgen_alloc_obj (GCVTable vtable, size_t size);

View File

@@ -23,12 +23,9 @@ typedef enum {
TLS_KEY_DOMAIN = 2,
TLS_KEY_LMF = 3,
TLS_KEY_SGEN_THREAD_INFO = 4,
TLS_KEY_SGEN_TLAB_NEXT_ADDR = 5,
TLS_KEY_SGEN_TLAB_TEMP_END = 6,
TLS_KEY_BOEHM_GC_THREAD = 7,
TLS_KEY_LMF_ADDR = 8,
TLS_KEY_SGEN_IN_CRITICAL_REGION_ADDR = 9,
TLS_KEY_NUM = 10
TLS_KEY_BOEHM_GC_THREAD = 5,
TLS_KEY_LMF_ADDR = 6,
TLS_KEY_NUM = 7
} MonoTlsKey;
#ifdef HOST_WIN32