libc-internal.h: add ALIGN helper macros
authorMike Frysinger <vapier@gentoo.org>
Tue, 28 May 2013 22:25:54 +0000 (18:25 -0400)
committerMike Frysinger <vapier@gentoo.org>
Tue, 25 Jun 2013 00:25:15 +0000 (20:25 -0400)
Rather than open coding the masks, add helper macros to do the magic.
This makes code easier to read.

Signed-off-by: Mike Frysinger <vapier@gentoo.org>
ChangeLog
include/libc-internal.h

index fd5a70d..18e41e8 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2013-06-24  Mike Frysinger  <vapier@gentoo.org>
+
+       * include/libc-internal.h (ALIGN_DOWN): New helper macro.
+       (ALIGN_UP): Likewise.
+       (PTR_ALIGN_DOWN): Likewise.
+       (PTR_ALIGN_UP): Likewise.
+
 2013-06-24  Ryan S. Arnold  <rsa@linux.vnet.ibm.com>
 
        * sysdeps/powerpc/dl-procinfo.c (_dl_powerpc_platforms): Add "power8"
index 0c0fa02..78f82da 100644 (file)
@@ -50,4 +50,24 @@ extern void __init_misc (int, char **, char **);
 /* Cast an integer or a pointer VAL to integer with proper type.  */
 # define cast_to_integer(val) ((__integer_if_pointer_type (val)) (val))
 
+/* Align a value by rounding down to closest size.
+   e.g. Using size of 4096, we get this behavior:
+       {4095, 4096, 4097} = {0, 4096, 4096}.  */
+#define ALIGN_DOWN(base, size) ((base) & -((__typeof__ (base)) (size)))
+
+/* Align a value by rounding up to closest size.
+   e.g. Using size of 4096, we get this behavior:
+       {4095, 4096, 4097} = {4096, 4096, 8192}.
+
+  Note: The size argument has side effects (expanded multiple times).  */
+#define ALIGN_UP(base, size)   ALIGN_DOWN ((base) + (size) - 1, (size))
+
+/* Same as ALIGN_DOWN(), but automatically casts when base is a pointer.  */
+#define PTR_ALIGN_DOWN(base, size) \
+  ((__typeof__ (base)) ALIGN_DOWN ((uintptr_t) (base), (size)))
+
+/* Same as ALIGN_UP(), but automatically casts when base is a pointer.  */
+#define PTR_ALIGN_UP(base, size) \
+  ((__typeof__ (base)) ALIGN_UP ((uintptr_t) (base), (size)))
+
 #endif /* _LIBC_INTERNAL  */