Remove locale file dependence on int32_t alignment.
authorJoseph Myers <joseph@codesourcery.com>
Thu, 3 Oct 2013 21:51:32 +0000 (21:51 +0000)
committerJoseph Myers <joseph@codesourcery.com>
Thu, 3 Oct 2013 21:51:32 +0000 (21:51 +0000)
ChangeLog
locale/localeinfo.h
locale/programs/ld-collate.c
locale/weight.h

index e08ff75..a038c92 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2013-10-03  Joseph Myers  <joseph@codesourcery.com>
+
+       * locale/localeinfo.h (LOCFILE_ALIGN): New macro.
+       (LOCFILE_ALIGN_MASK): Likewise.
+       (LOCFILE_ALIGN_UP): Likewise.
+       (LOCFILE_ALIGNED_P): Likewise.
+       * locale/programs/ld-collate.c (collate_output): Use the new
+       macros instead of __alignof__ (int32_t).
+       * locale/weight.h (findidx): Likewise.
+
 2013-10-03  Ondřej Bílka  <neleai@seznam.cz>
 
        [BZ #431]
index 3142726..8d2c166 100644 (file)
@@ -87,6 +87,16 @@ struct __locale_data
   values __flexarr;    /* Items, usually pointers into `filedata'.  */
 };
 
+/* This alignment is used for 32-bit integers in locale files, both
+   those that are explicitly int32_t or uint32_t and those that are
+   wchar_t, regardless of the (possibly smaller) alignment required
+   for such integers on a particular host.  */
+#define LOCFILE_ALIGN          sizeof (int32_t)
+#define LOCFILE_ALIGN_MASK     (LOCFILE_ALIGN - 1)
+#define LOCFILE_ALIGN_UP(x)    (((x) + LOCFILE_ALIGN - 1)      \
+                                & ~LOCFILE_ALIGN_MASK)
+#define LOCFILE_ALIGNED_P(x)   (((x) & LOCFILE_ALIGN_MASK) == 0)
+
 /* We know three kinds of collation sorting rules.  */
 enum coll_sort_rule
 {
index e610389..31e2d05 100644 (file)
@@ -2154,11 +2154,11 @@ collate_output (struct localedef_t *locale, const struct charmap_t *charmap,
        ++i;
       }
   /* And align the output.  */
-  i = (nrules * i) % __alignof__ (int32_t);
+  i = (nrules * i) % LOCFILE_ALIGN;
   if (i > 0)
     do
       obstack_1grow (&weightpool, '\0');
-    while (++i < __alignof__ (int32_t));
+    while (++i < LOCFILE_ALIGN);
 
   add_locale_raw_obstack (&file, &weightpool);
 
@@ -2204,8 +2204,7 @@ collate_output (struct localedef_t *locale, const struct charmap_t *charmap,
        struct element_t *runp = collate->mbheads[ch];
        struct element_t *lastp;
 
-       assert ((obstack_object_size (&extrapool)
-                & (__alignof__ (int32_t) - 1)) == 0);
+       assert (LOCFILE_ALIGNED_P (obstack_object_size (&extrapool)));
 
        tablemb[ch] = -obstack_object_size (&extrapool);
 
@@ -2230,11 +2229,9 @@ collate_output (struct localedef_t *locale, const struct charmap_t *charmap,
                struct element_t *curp;
 
                /* Compute how much space we will need.  */
-               added = ((sizeof (int32_t) + 1 + 2 * (runp->nmbs - 1)
-                         + __alignof__ (int32_t) - 1)
-                        & ~(__alignof__ (int32_t) - 1));
-               assert ((obstack_object_size (&extrapool)
-                        & (__alignof__ (int32_t) - 1)) == 0);
+               added = LOCFILE_ALIGN_UP (sizeof (int32_t) + 1
+                                         + 2 * (runp->nmbs - 1));
+               assert (LOCFILE_ALIGNED_P (obstack_object_size (&extrapool)));
                obstack_make_room (&extrapool, added);
 
                /* More than one consecutive entry.  We mark this by having
@@ -2291,11 +2288,9 @@ collate_output (struct localedef_t *locale, const struct charmap_t *charmap,
                /* Output the weight info.  */
                weightidx = output_weight (&weightpool, collate, runp);
 
-               added = ((sizeof (int32_t) + 1 + runp->nmbs - 1
-                         + __alignof__ (int32_t) - 1)
-                        & ~(__alignof__ (int32_t) - 1));
-               assert ((obstack_object_size (&extrapool)
-                        & (__alignof__ (int32_t) - 1)) == 0);
+               added = LOCFILE_ALIGN_UP (sizeof (int32_t) + 1
+                                         + runp->nmbs - 1);
+               assert (LOCFILE_ALIGNED_P (obstack_object_size (&extrapool)));
                obstack_make_room (&extrapool, added);
 
                obstack_int32_grow_fast (&extrapool, weightidx);
@@ -2307,8 +2302,7 @@ collate_output (struct localedef_t *locale, const struct charmap_t *charmap,
              }
 
            /* Add alignment bytes if necessary.  */
-           while ((obstack_object_size (&extrapool)
-                   & (__alignof__ (int32_t) - 1)) != 0)
+           while (!LOCFILE_ALIGNED_P (obstack_object_size (&extrapool)))
              obstack_1grow_fast (&extrapool, '\0');
 
            /* Next entry.  */
@@ -2317,15 +2311,13 @@ collate_output (struct localedef_t *locale, const struct charmap_t *charmap,
          }
        while (runp != NULL);
 
-       assert ((obstack_object_size (&extrapool)
-                & (__alignof__ (int32_t) - 1)) == 0);
+       assert (LOCFILE_ALIGNED_P (obstack_object_size (&extrapool)));
 
        /* If the final entry in the list is not a single character we
           add an UNDEFINED entry here.  */
        if (lastp->nmbs != 1)
          {
-           int added = ((sizeof (int32_t) + 1 + 1 + __alignof__ (int32_t) - 1)
-                        & ~(__alignof__ (int32_t) - 1));
+           int added = LOCFILE_ALIGN_UP (sizeof (int32_t) + 1 + 1);
            obstack_make_room (&extrapool, added);
 
            obstack_int32_grow_fast (&extrapool, 0);
@@ -2335,15 +2327,13 @@ collate_output (struct localedef_t *locale, const struct charmap_t *charmap,
            obstack_1grow_fast (&extrapool, 0);
 
            /* Add alignment bytes if necessary.  */
-           while ((obstack_object_size (&extrapool)
-                   & (__alignof__ (int32_t) - 1)) != 0)
+           while (!LOCFILE_ALIGNED_P (obstack_object_size (&extrapool)))
              obstack_1grow_fast (&extrapool, '\0');
          }
       }
 
   /* Add padding to the tables if necessary.  */
-  while ((obstack_object_size (&weightpool) & (__alignof__ (int32_t) - 1))
-        != 0)
+  while (!LOCFILE_ALIGNED_P (obstack_object_size (&weightpool)))
     obstack_1grow (&weightpool, 0);
 
   /* Now add the four tables.  */
index 645eda2..b097aac 100644 (file)
@@ -69,8 +69,8 @@ findidx (const unsigned char **cpp, size_t len)
 
          /* Up to the next entry.  */
          cp += nhere;
-         if ((1 + nhere) % __alignof__ (int32_t) != 0)
-           cp += __alignof__ (int32_t) - (1 + nhere) % __alignof__ (int32_t);
+         if (!LOCFILE_ALIGNED_P (1 + nhere))
+           cp += LOCFILE_ALIGN - (1 + nhere) % LOCFILE_ALIGN;
        }
       else
        {
@@ -89,9 +89,9 @@ findidx (const unsigned char **cpp, size_t len)
                {
                  /* Cannot be in this range.  */
                  cp += 2 * nhere;
-                 if ((1 + 2 * nhere) % __alignof__ (int32_t) != 0)
-                   cp += (__alignof__ (int32_t)
-                          - (1 + 2 * nhere) % __alignof__ (int32_t));
+                 if (!LOCFILE_ALIGNED_P (1 + 2 * nhere))
+                   cp += (LOCFILE_ALIGN
+                          - (1 + 2 * nhere) % LOCFILE_ALIGN);
                  continue;
                }
 
@@ -104,9 +104,9 @@ findidx (const unsigned char **cpp, size_t len)
                {
                  /* Cannot be in this range.  */
                  cp += 2 * nhere;
-                 if ((1 + 2 * nhere) % __alignof__ (int32_t) != 0)
-                   cp += (__alignof__ (int32_t)
-                          - (1 + 2 * nhere) % __alignof__ (int32_t));
+                 if (!LOCFILE_ALIGNED_P (1 + 2 * nhere))
+                   cp += (LOCFILE_ALIGN
+                          - (1 + 2 * nhere) % LOCFILE_ALIGN);
                  continue;
                }