This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH 1/2 v5] libc-internal.h: add ALIGN helper macros
- From: Mike Frysinger <vapier at gentoo dot org>
- To: libc-alpha at sourceware dot org
- Date: Wed, 19 Jun 2013 12:44:07 -0400
- Subject: [PATCH 1/2 v5] libc-internal.h: add ALIGN helper macros
- References: <1369327649-906-1-git-send-email-vapier at gentoo dot org>
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>
2013-05-23 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.
---
v5
- add typeof casts to handle larger types correctly (like uint64_t base
with an int size)
- tweak style
include/libc-internal.h | 20 ++++++++++++++++++++
1 file changed, 20 insertions(+)
diff --git a/include/libc-internal.h b/include/libc-internal.h
index 0c0fa02..4b0cfe2 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) - 1))
+
+/* 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 */
--
1.8.2.1