summary refs log tree commit diff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2013-10-03 21:51:32 +0000
committerJoseph Myers <joseph@codesourcery.com>2013-10-03 21:51:32 +0000
commit975569d0d953fb8940d23af83ce9f9765b2b07ae (patch)
tree51ada8cd6216f789ed6775eeedb5d0c2a72af202
parentbc543b02c78ead13ea558a00b51f83079cbabda9 (diff)
downloadglibc-975569d0d953fb8940d23af83ce9f9765b2b07ae.tar.gz
glibc-975569d0d953fb8940d23af83ce9f9765b2b07ae.tar.xz
glibc-975569d0d953fb8940d23af83ce9f9765b2b07ae.zip
Remove locale file dependence on int32_t alignment.
-rw-r--r--ChangeLog10
-rw-r--r--locale/localeinfo.h10
-rw-r--r--locale/programs/ld-collate.c38
-rw-r--r--locale/weight.h16
4 files changed, 42 insertions, 32 deletions
diff --git a/ChangeLog b/ChangeLog
index e08ff75153..a038c92d3e 100644
--- 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]
diff --git a/locale/localeinfo.h b/locale/localeinfo.h
index 3142726605..8d2c1665c2 100644
--- a/locale/localeinfo.h
+++ b/locale/localeinfo.h
@@ -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
 {
diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c
index e610389b0c..31e2d05859 100644
--- a/locale/programs/ld-collate.c
+++ b/locale/programs/ld-collate.c
@@ -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.  */
diff --git a/locale/weight.h b/locale/weight.h
index 645eda2fe9..b097aaca0b 100644
--- a/locale/weight.h
+++ b/locale/weight.h
@@ -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;
 		}