about summary refs log tree commit diff
path: root/include/libc-internal.h
diff options
context:
space:
mode:
authorMike Frysinger <vapier@gentoo.org>2013-05-28 18:25:54 -0400
committerMike Frysinger <vapier@gentoo.org>2013-06-24 20:25:15 -0400
commitd605071ebf1fbbba5998a349540d4ad4e667f65e (patch)
treefb6bc1f6065883fc61fd05f253e4b1b4bcc20682 /include/libc-internal.h
parente1f0b2cfa14b058ab033431b70428ccda8ec6ed0 (diff)
downloadglibc-d605071ebf1fbbba5998a349540d4ad4e667f65e.tar.gz
glibc-d605071ebf1fbbba5998a349540d4ad4e667f65e.tar.xz
glibc-d605071ebf1fbbba5998a349540d4ad4e667f65e.zip
libc-internal.h: add ALIGN helper macros
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>
Diffstat (limited to 'include/libc-internal.h')
-rw-r--r--include/libc-internal.h20
1 files changed, 20 insertions, 0 deletions
diff --git a/include/libc-internal.h b/include/libc-internal.h
index 0c0fa024a7..78f82da58a 100644
--- a/include/libc-internal.h
+++ b/include/libc-internal.h
@@ -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  */