Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/libgc
diff options
context:
space:
mode:
authorZoltan Varga <vargaz@gmail.com>2005-06-19 13:59:53 +0400
committerZoltan Varga <vargaz@gmail.com>2005-06-19 13:59:53 +0400
commit6f3a534e4a5bb50f0cd525ed13ac51d4f59c8551 (patch)
tree88d6957fd582a3828fbe1e5f2a916392707bdb1e /libgc
parent9db345025775b25e4bc2eac793c409353d91626b (diff)
Merge from HEAD.
svn path=/branches/mono-1-1-8/mono/; revision=46213
Diffstat (limited to 'libgc')
-rw-r--r--libgc/ChangeLog4
-rw-r--r--libgc/pthread_support.c23
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 */