PATCH: Update libmudflap support for FreeBSD
Loren James Rittle
rittle@latour.labs.mot.com
Tue Sep 1 18:28:00 GMT 2009
In article <m2my5tukgn.fsf@igel.home>,
Andreas Schwab<schwab@linux-m68k.org> writes:
>> When mmap fails it returns -1, not 0.
I wrote:
> Thanks for the info. My local mmap(2) said the same (-1) but also
> defines MAP_FAILED for readability. I shall adjust the patch
> before commit.
OK, based on all the feedback, I finally committed to mainline, in two
parts, the patch below and credited Andreas as shown. It has been in
my bootstrap tree for the last N cycles (where N is well over 3).
Regards,
Loren
2009-09-01 Loren J. Rittle <ljrittle@acm.org>
* mf-runtime.c (__mf_init): Support FreeBSD.
Prime mutex which calls calloc upon first lock to avoid deadlock.
* mf-hooks1.c (__mf_0fn_mmap): Support FreeBSD.
Ignore red zone allocation request for initial thread's stack.
2009-09-01 Loren J. Rittle <ljrittle@acm.org>
Andreas Schwab <schwab@linux-m68k.org>
* testsuite/libmudflap.c/pass51-frag.c (MAP_FAILED): Define,
if not in system header; use it. On FreeBSD, must pass fd==-1
with MAP_ANON flag. Correct mmap error check.
* testsuite/libmudflap.c/fail40-frag.c: Ditto.
Index: libmudflap/mf-runtime.c
===================================================================
--- libmudflap/mf-runtime.c (revision 151276)
+++ libmudflap/mf-runtime.c (working copy)
@@ -695,6 +695,12 @@
if (LIKELY (__mf_starting_p == 0))
return;
+#if defined(__FreeBSD__) && defined(LIBMUDFLAPTH)
+ pthread_self();
+ LOCKTH ();
+ UNLOCKTH ();
+#endif /* Prime mutex which calls calloc upon first lock to avoid deadlock. */
+
/* This initial bootstrap phase requires that __mf_starting_p = 1. */
#ifdef PIC
__mf_resolve_dynamics ();
Index: libmudflap/mf-hooks1.c
===================================================================
--- libmudflap/mf-hooks1.c (revision 151276)
+++ libmudflap/mf-hooks1.c (working copy)
@@ -321,6 +321,11 @@
void *
__mf_0fn_mmap (void *start, size_t l, int prot, int f, int fd, off_t off)
{
+#if defined(__FreeBSD__)
+ if (f == 0x1000 && fd == -1 && prot == 0 && off == 0)
+ return 0;
+#endif /* Ignore red zone allocation request for initial thread's stack. */
+
return (void *) -1;
}
#endif
Index: libmudflap/testsuite/libmudflap.c/pass51-frag.c
===================================================================
--- libmudflap/testsuite/libmudflap.c/pass51-frag.c (revision 151276)
+++ libmudflap/testsuite/libmudflap.c/pass51-frag.c (working copy)
@@ -13,14 +13,17 @@
#ifndef MAP_ANONYMOUS
#define MAP_ANONYMOUS MAP_ANON
#endif
+#ifndef MAP_FAILED
+#define MAP_FAILED ((void *)-1)
+#endif
#ifdef HAVE_MMAP
void *p;
unsigned pg = getpagesize ();
int rc;
p = mmap (NULL, 4 * pg, PROT_READ|PROT_WRITE,
- MAP_PRIVATE|MAP_ANONYMOUS, 0, 0);
- if (p == NULL)
+ MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+ if (p == MAP_FAILED)
return 1;
memset (p, 0, 4*pg);
Index: libmudflap/testsuite/libmudflap.c/fail40-frag.c
===================================================================
--- libmudflap/testsuite/libmudflap.c/fail40-frag.c (revision 151276)
+++ libmudflap/testsuite/libmudflap.c/fail40-frag.c (working copy)
@@ -14,6 +14,9 @@
#ifndef MAP_ANONYMOUS
#define MAP_ANONYMOUS MAP_ANON
#endif
+#ifndef MAP_FAILED
+#define MAP_FAILED ((void *)-1)
+#endif
#ifdef HAVE_MMAP
volatile unsigned char *p;
unsigned num = getpagesize ();
@@ -23,8 +26,8 @@
/* Get a bit of usable address space. We really want an 2**N+1-sized object,
so the low/high addresses wrap when hashed into the lookup cache. So we
will manually unregister the entire mmap, then re-register a slice. */
- p = mmap (NULL, num, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, 0, 0);
- if (p == NULL)
+ p = mmap (NULL, num, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);
+ if (p == MAP_FAILED)
return 1;
/* Now unregister it, as if munmap was called. But don't actually munmap, so
we can write into the memory. */
More information about the Gcc-patches
mailing list