public inbox for newlib-cvs@sourceware.org
help / color / mirror / Atom feed
* [newlib-cygwin] Expose clang's alignment builtins and use them for roundup2/rounddown2
@ 2022-07-11  9:53 Sebastian Huber
  0 siblings, 0 replies; 2+ messages in thread
From: Sebastian Huber @ 2022-07-11  9:53 UTC (permalink / raw)
  To: newlib-cvs

https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=68109f904bff0208e3e30e47adc4eb430d5d4c8c

commit 68109f904bff0208e3e30e47adc4eb430d5d4c8c
Author: Alex Richardson <arichardson@FreeBSD.org>
Date:   Wed Feb 3 15:27:17 2021 +0000

    Expose clang's alignment builtins and use them for roundup2/rounddown2
    
    This makes roundup2/rounddown2 type- and const-preserving and allows
    using it on pointer types without casting to uintptr_t first. Not
    performing pointer-to-integer conversions also helps the compiler's
    optimization passes and can therefore result in better code generation.
    When using it with integer values there should be no change other than
    the compiler checking that the alignment value is a valid power-of-two.
    
    I originally implemented these builtins for CHERI a few years ago and
    they have been very useful for CheriBSD. However, they are also useful
    for non-CHERI code so I was able to upstream them for Clang 10.0.
    
    Rationale from the clang documentation:
    Clang provides builtins to support checking and adjusting alignment
    of pointers and integers. These builtins can be used to avoid relying
    on implementation-defined behavior of arithmetic on integers derived
    from pointers. Additionally, these builtins retain type information
    and, unlike bitwise arithmetic, they can perform semantic checking on
    the alignment value.
    
    There is also a feature request for GCC, so GCC may also support it in
    the future: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98641
    
    Reviewed By:    brooks, jhb, imp
    Differential Revision: https://reviews.freebsd.org/D28332

Diff:
---
 newlib/libc/include/sys/cdefs.h | 19 +++++++++++++++++++
 1 file changed, 19 insertions(+)

diff --git a/newlib/libc/include/sys/cdefs.h b/newlib/libc/include/sys/cdefs.h
index e6a31bd51..7dff2c8d8 100644
--- a/newlib/libc/include/sys/cdefs.h
+++ b/newlib/libc/include/sys/cdefs.h
@@ -716,4 +716,23 @@
 #define	__guarded_by(x)		__lock_annotate(guarded_by(x))
 #define	__pt_guarded_by(x)	__lock_annotate(pt_guarded_by(x))
 
+/* Alignment builtins for better type checking and improved code generation. */
+/* Provide fallback versions for other compilers (GCC/Clang < 10): */
+#if !__has_builtin(__builtin_is_aligned)
+#define __builtin_is_aligned(x, align)	\
+	(((__uintptr_t)x & ((align) - 1)) == 0)
+#endif
+#if !__has_builtin(__builtin_align_up)
+#define __builtin_align_up(x, align)	\
+	((__typeof__(x))(((__uintptr_t)(x)+((align)-1))&(~((align)-1))))
+#endif
+#if !__has_builtin(__builtin_align_down)
+#define __builtin_align_down(x, align)	\
+	((__typeof__(x))((x)&(~((align)-1))))
+#endif
+
+#define __align_up(x, y) __builtin_align_up(x, y)
+#define __align_down(x, y) __builtin_align_down(x, y)
+#define __is_aligned(x, y) __builtin_is_aligned(x, y)
+
 #endif /* !_SYS_CDEFS_H_ */


^ permalink raw reply	[flat|nested] 2+ messages in thread

* [newlib-cygwin] Expose clang's alignment builtins and use them for roundup2/rounddown2
@ 2022-07-11 11:53 Sebastian Huber
  0 siblings, 0 replies; 2+ messages in thread
From: Sebastian Huber @ 2022-07-11 11:53 UTC (permalink / raw)
  To: newlib-cvs

https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=8054ce555fdcd5fe9c2ad75cff6cd80218c9d0b1

commit 8054ce555fdcd5fe9c2ad75cff6cd80218c9d0b1
Author: Alex Richardson <arichardson@FreeBSD.org>
Date:   Wed Feb 3 15:27:17 2021 +0000

    Expose clang's alignment builtins and use them for roundup2/rounddown2
    
    This makes roundup2/rounddown2 type- and const-preserving and allows
    using it on pointer types without casting to uintptr_t first. Not
    performing pointer-to-integer conversions also helps the compiler's
    optimization passes and can therefore result in better code generation.
    When using it with integer values there should be no change other than
    the compiler checking that the alignment value is a valid power-of-two.
    
    I originally implemented these builtins for CHERI a few years ago and
    they have been very useful for CheriBSD. However, they are also useful
    for non-CHERI code so I was able to upstream them for Clang 10.0.
    
    Rationale from the clang documentation:
    Clang provides builtins to support checking and adjusting alignment
    of pointers and integers. These builtins can be used to avoid relying
    on implementation-defined behavior of arithmetic on integers derived
    from pointers. Additionally, these builtins retain type information
    and, unlike bitwise arithmetic, they can perform semantic checking on
    the alignment value.
    
    There is also a feature request for GCC, so GCC may also support it in
    the future: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98641
    
    Reviewed By:    brooks, jhb, imp
    Differential Revision: https://reviews.freebsd.org/D28332

Diff:
---
 newlib/libc/sys/rtems/include/sys/param.h | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/newlib/libc/sys/rtems/include/sys/param.h b/newlib/libc/sys/rtems/include/sys/param.h
index 925f0fc44..2e44057dd 100644
--- a/newlib/libc/sys/rtems/include/sys/param.h
+++ b/newlib/libc/sys/rtems/include/sys/param.h
@@ -233,9 +233,9 @@
 #endif
 #define	nitems(x)	(sizeof((x)) / sizeof((x)[0]))
 #define	rounddown(x, y)	(((x)/(y))*(y))
-#define	rounddown2(x, y) ((x)&(~((y)-1)))          /* if y is power of two */
+#define	rounddown2(x, y) __align_down(x, y) /* if y is power of two */
 #define	roundup(x, y)	((((x)+((y)-1))/(y))*(y))  /* to any y */
-#define	roundup2(x, y)	(((x)+((y)-1))&(~((y)-1))) /* if y is powers of two */
+#define	roundup2(x, y)	__align_up(x, y) /* if y is powers of two */
 #define powerof2(x)	((((x)-1)&(x))==0)
 
 /* Macros for min/max. */


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-07-11 11:53 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-11  9:53 [newlib-cygwin] Expose clang's alignment builtins and use them for roundup2/rounddown2 Sebastian Huber
2022-07-11 11:53 Sebastian Huber

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).