[libmudflap] PR 28578

Frank Ch. Eigler fche@elastic.org
Fri Nov 10 18:47:00 GMT 2006


Hi -

Committing:

+2006-11-10  Frank Ch. Eigler  <fche@redhat.com>
+
+	PR libmudflap/28578
+	* mf-hooks1.c (__mf_0fn_malloc): Make the bootstrap buffers
+	static but not function scope static.
+	(free): Skip deallocation attempts for objects placed into
+	bootstrap buffers.
+	* testsuite/libmudflap.cth/pass59-frag.c: New test.


Index: mf-hooks1.c
===================================================================
--- mf-hooks1.c	(revision 118629)
+++ mf-hooks1.c	(working copy)
@@ -75,21 +75,24 @@ Software Foundation, 51 Franklin Street,
 
 
 #if PIC
+
+enum { BS = 4096, NB=10 };
+static char __mf_0fn_bufs[NB][BS];
+static unsigned __mf_0fn_bufs_used[NB];
+
+
 /* A special bootstrap variant. */
 void *
 __mf_0fn_malloc (size_t c)
 {
-  enum foo { BS = 4096, NB=10 };
-  static char bufs[NB][BS];
-  static unsigned bufs_used[NB];
   unsigned i;
 
   for (i=0; i<NB; i++)
     {
-      if (! bufs_used[i] && c < BS)
+      if (! __mf_0fn_bufs_used[i] && c < BS)
 	{
-	  bufs_used[i] = 1;
-	  return & bufs[i][0];
+	  __mf_0fn_bufs_used[i] = 1;
+	  return & __mf_0fn_bufs[i][0];
 	}
     }
   return NULL;
@@ -246,6 +249,19 @@ WRAPPER(void, free, void *buf)
   if (UNLIKELY(buf == NULL))
     return;
 
+#if PIC
+  /* Check whether the given buffer might have come from a
+     __mf_0fn_malloc/calloc call that for whatever reason was not
+     redirected back to __mf_0fn_free.  If so, we just ignore the
+     call. */
+  if (UNLIKELY((uintptr_t) buf >= (uintptr_t) __mf_0fn_bufs &&
+               (uintptr_t) buf < ((uintptr_t) __mf_0fn_bufs + sizeof(__mf_0fn_bufs))))
+  {
+    VERBOSE_TRACE ("skipping free of boot (0fn) alloc buffer %p\n", buf);
+    return;
+  }
+#endif
+
   LOCKTH ();
   if (UNLIKELY(!freeq_initialized))
     {


Index: testsuite/libmudflap.cth/pass59-frag.c
===================================================================
--- testsuite/libmudflap.cth/pass59-frag.c	(revision 0)
+++ testsuite/libmudflap.cth/pass59-frag.c	(revision 0)
@@ -0,0 +1,39 @@
+#include <stdio.h>
+#include <pthread.h>
+
+/* PR 28578 */
+
+void* test_thread(void* arg)
+{
+  printf("Hello from thread!\n");
+  pthread_exit(NULL);
+  return 0;
+}
+
+int main()
+{
+  pthread_t thread;
+  int arg = 0;
+  pthread_create(&thread, NULL, test_thread, (void*)arg);
+  pthread_join(thread, NULL);
+  pthread_exit(NULL);
+  return 0;
+}
+
+/* { dg-output "Hello from thread!\n" } */
+
+#if 0
+
+/* Even this test case replicates the problem.  However, when built in
+   static mode, it blows up during __mf_init (?!?!?!) with a
+   pthread_mutex_lock deadlock error. */
+
+#include <stdio.h>
+#include <pthread.h>
+
+int main ()
+{
+      pthread_exit(NULL);
+      return 0;
+}
+#endif



More information about the Gcc-patches mailing list