diff options
author | Zoltan Varga <vargaz@gmail.com> | 2005-06-19 13:59:53 +0400 |
---|---|---|
committer | Zoltan Varga <vargaz@gmail.com> | 2005-06-19 13:59:53 +0400 |
commit | 6f3a534e4a5bb50f0cd525ed13ac51d4f59c8551 (patch) | |
tree | 88d6957fd582a3828fbe1e5f2a916392707bdb1e /libgc | |
parent | 9db345025775b25e4bc2eac793c409353d91626b (diff) |
Merge from HEAD.
svn path=/branches/mono-1-1-8/mono/; revision=46213
Diffstat (limited to 'libgc')
-rw-r--r-- | libgc/ChangeLog | 4 | ||||
-rw-r--r-- | libgc/pthread_support.c | 23 |
2 files changed, 27 insertions, 0 deletions
diff --git a/libgc/ChangeLog b/libgc/ChangeLog index a4bcb86cca1..10b6c9f5da2 100644 --- a/libgc/ChangeLog +++ b/libgc/ChangeLog @@ -1,3 +1,7 @@ +2005-06-17 Zoltan Varga <vargaz@freemail.hu> + + * pthread_support.c: Workaround gcc-3.3 compiler bug. + 2005-05-26 Sebastien Pouliot <sebastien@ximian.com> * libgc.vcproj: Project file for libgc. diff --git a/libgc/pthread_support.c b/libgc/pthread_support.c index 8b47b4d3db8..5486d686e43 100644 --- a/libgc/pthread_support.c +++ b/libgc/pthread_support.c @@ -556,6 +556,27 @@ GC_bool GC_thr_initialized = FALSE; volatile GC_thread GC_threads[THREAD_TABLE_SZ]; +/* + * gcc-3.3.6 miscompiles the &GC_thread_key+sizeof(&GC_thread_key) expression so + * put it into a separate function. + */ +# ifdef __GNUC__ +static __attribute__((noinline)) unsigned char* get_gc_thread_key_addr GC_PROTO((void)) +{ + return (unsigned char*)&GC_thread_key; +} + +void GC_push_thread_structures GC_PROTO((void)) +{ + GC_push_all((ptr_t)(GC_threads), (ptr_t)(GC_threads)+sizeof(GC_threads)); +# if defined(THREAD_LOCAL_ALLOC) && !defined(DBG_HDRS_ALL) + GC_push_all((ptr_t)get_gc_thread_key_addr(), + (ptr_t)(get_gc_thread_key_addr())+sizeof(&GC_thread_key)); +# endif +} + +#else + void GC_push_thread_structures GC_PROTO((void)) { GC_push_all((ptr_t)(GC_threads), (ptr_t)(GC_threads)+sizeof(GC_threads)); @@ -565,6 +586,8 @@ void GC_push_thread_structures GC_PROTO((void)) # endif } +#endif + #ifdef THREAD_LOCAL_ALLOC /* We must explicitly mark ptrfree and gcj free lists, since the free */ /* list links wouldn't otherwise be found. We also set them in the */ |