This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[libmudflap] PR 28578
- From: "Frank Ch. Eigler" <fche at elastic dot org>
- To: gcc-patches at gcc dot gnu dot org
- Date: Fri, 10 Nov 2006 13:42:10 -0500
- Subject: [libmudflap] PR 28578
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