diff options
author | Zoltan Varga <vargaz@gmail.com> | 2005-06-17 23:14:47 +0400 |
---|---|---|
committer | Zoltan Varga <vargaz@gmail.com> | 2005-06-17 23:14:47 +0400 |
commit | 7f084c663490d244236523f972c8e115f28f1534 (patch) | |
tree | 0070495a3c275722d6238dd2255a22250e7f924c /libgc | |
parent | f6116a5acb8bfbb5c319f2f73eaa506902ce29f2 (diff) |
2005-06-17 Zoltan Varga <vargaz@freemail.hu>
* pthread_support.c: Workaround gcc-3.3 compiler bug.
svn path=/trunk/mono/; revision=46167
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 */ |