From f6e4c90b3a65b5b25557d0852b69a21b1cd48067 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 15 May 2013 00:15:45 -0700 Subject: [PATCH] malloca: port --enable-gcc-warnings to clang * lib/malloca.c (struct header): New member 'magic', to avoid casts. (mmalloca): Avoid casts from looser to stricter-aligned pointers. --- ChangeLog | 4 ++++ lib/malloca.c | 19 +++++++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/ChangeLog b/ChangeLog index b69e4d5b77..508458ee3c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2013-05-15 Paul Eggert + malloca: port --enable-gcc-warnings to clang + * lib/malloca.c (struct header): New member 'magic', to avoid casts. + (mmalloca): Avoid casts from looser to stricter-aligned pointers. + inttostr: port --enable-gcc-warnings to clang * lib/anytostr.c [__clang__]: Ignore -Wtautological-compare. diff --git a/lib/malloca.c b/lib/malloca.c index 8c5df2ce13..53ecb81226 100644 --- a/lib/malloca.c +++ b/lib/malloca.c @@ -53,7 +53,7 @@ struct preliminary_header { void *next; char room[MAGIC_SIZE]; }; /* But the header's size must be a multiple of sa_alignment_max. */ #define HEADER_SIZE \ (((sizeof (struct preliminary_header) + sa_alignment_max - 1) / sa_alignment_max) * sa_alignment_max) -struct header { void *next; char room[HEADER_SIZE - sizeof (struct preliminary_header) + MAGIC_SIZE]; }; +struct header { void *next; char room[HEADER_SIZE - sizeof (struct preliminary_header)]; int magic; }; verify (HEADER_SIZE == sizeof (struct header)); /* We make the hash table quite big, so that during lookups the probability of empty hash buckets is quite high. There is no need to make the hash @@ -74,20 +74,21 @@ mmalloca (size_t n) if (nplus >= n) { - char *p = (char *) malloc (nplus); + void *p = malloc (nplus); if (p != NULL) { size_t slot; + struct header *h = p; - p += HEADER_SIZE; + p = h + 1; /* Put a magic number into the indicator word. */ - ((int *) p)[-1] = MAGIC_NUMBER; + h->magic = MAGIC_NUMBER; /* Enter p into the hash table. */ slot = (uintptr_t) p % HASH_TABLE_SIZE; - ((struct header *) (p - HEADER_SIZE))->next = mmalloca_results[slot]; + h->next = mmalloca_results[slot]; mmalloca_results[slot] = p; return p; @@ -123,15 +124,17 @@ freea (void *p) void **chain = &mmalloca_results[slot]; for (; *chain != NULL;) { + struct header *h = p; if (*chain == p) { /* Found it. Remove it from the hash table and free it. */ - char *p_begin = (char *) p - HEADER_SIZE; - *chain = ((struct header *) p_begin)->next; + struct header *p_begin = h - 1; + *chain = p_begin->next; free (p_begin); return; } - chain = &((struct header *) ((char *) *chain - HEADER_SIZE))->next; + h = *chain; + chain = &h[-1].next; } } /* At this point, we know it was not a mmalloca() result. */ -- 2.39.5