From: Zoltan Varga Date: Fri, 17 Jun 2005 19:14:47 +0000 (+0000) Subject: 2005-06-17 Zoltan Varga X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=165d337db66ee4a46e067ac950773c3ccaa08eb2;p=gc 2005-06-17 Zoltan Varga * pthread_support.c: Workaround gcc-3.3 compiler bug. svn path=/trunk/mono/; revision=46167 --- diff --git a/ChangeLog b/ChangeLog index e8ddf85d..941013c3 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2005-06-17 Zoltan Varga + + * pthread_support.c: Workaround gcc-3.3 compiler bug. + 2005-05-26 Sebastien Pouliot * libgc.vcproj: Project file for libgc. diff --git a/pthread_support.c b/pthread_support.c index c39474db..33101ccd 100644 --- a/pthread_support.c +++ b/pthread_support.c @@ -514,6 +514,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)); @@ -523,6 +544,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 */