malloca: port --enable-gcc-warnings to clang
authorPaul Eggert <eggert@cs.ucla.edu>
Wed, 15 May 2013 07:15:45 +0000 (00:15 -0700)
committerPaul Eggert <eggert@cs.ucla.edu>
Wed, 15 May 2013 07:33:38 +0000 (00:33 -0700)
* lib/malloca.c (struct header): New member 'magic', to avoid casts.
(mmalloca): Avoid casts from looser to stricter-aligned pointers.

ChangeLog
lib/malloca.c

index b69e4d5..508458e 100644 (file)
--- 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.
 
index 8c5df2c..53ecb81 100644 (file)
@@ -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.  */