Mercurial > hg > octave-lojdl > gnulib-hg
changeset 17403:621e5ff3aca8
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.
author | Paul Eggert <eggert@cs.ucla.edu> |
---|---|
date | Wed, 15 May 2013 00:15:45 -0700 |
parents | 9a6c1c655351 |
children | 832be175c090 |
files | ChangeLog lib/malloca.c |
diffstat | 2 files changed, 15 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,9 @@ 2013-05-15 Paul Eggert <eggert@cs.ucla.edu> + 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.
--- a/lib/malloca.c +++ b/lib/malloca.c @@ -53,7 +53,7 @@ /* 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 @@ 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 @@ 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. */