]> granicus.if.org Git - gc/commitdiff
2005-06-17 Zoltan Varga <vargaz@freemail.hu>
authorZoltan Varga <vargaz@gmail.com>
Fri, 17 Jun 2005 19:14:47 +0000 (19:14 +0000)
committerguest <ivmai@mail.ru>
Fri, 29 Jul 2011 11:25:00 +0000 (15:25 +0400)
* pthread_support.c: Workaround gcc-3.3 compiler bug.

svn path=/trunk/mono/; revision=46167

ChangeLog
pthread_support.c

index e8ddf85d0e3c5e2d2bdf1fa05740e4d9da66803d..941013c3ac47462d49ee7235bf88945571bfe8e9 100644 (file)
--- a/ChangeLog
+++ b/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.
index c39474db537e13a21dced98d6160405ef48bc1e1..33101ccdcf5d1da3dba81db298a55f5a93af8c2b 100644 (file)
@@ -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    */