From cab4d74b01320670f57dcf356ff89256f4d2fc12 Mon Sep 17 00:00:00 2001 From: Zack Weinberg Date: Thu, 28 Apr 2016 11:07:58 -0400 Subject: Add utility macros for clang detection, and deprecation with messages. There are three new macros added to features.h and sys/cdefs.h: * __glibc_clang_prereq: just like __GNUC_PREREQ, but for clang. * __glibc_clang_has_extension: wraps clang's intrinsic __has_extension. Writing "#if defined __clang__ && __has_extension (...)" doesn't work, because compilers other than clang will object to the unknown macro __has_extension even though they don't need to evaluate it. Instead, write "#if __glibc_clang_has_extension (...)". * __attribute_deprecated_msg__(msg): like __attribute_deprecated__, but if possible, prints a message. The first two are used to define the third. The third will be used in subsequent patches. * include/features.h (__glibc_clang_prereq): New macro. * misc/sys/cdefs.h (__glibc_clang_has_extension) (__attribute_deprecated_msg__): New macros. --- include/features.h | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'include/features.h') diff --git a/include/features.h b/include/features.h index f2cd148fa4..554c5c888a 100644 --- a/include/features.h +++ b/include/features.h @@ -138,13 +138,13 @@ # define __KERNEL_STRICT_NAMES #endif -/* Convenience macros to test the versions of glibc and gcc. - Use them like this: +/* Convenience macro to test the version of gcc. + Use like this: #if __GNUC_PREREQ (2,8) ... code requiring gcc 2.8 or later ... #endif - Note - they won't work for gcc1 or glibc1, since the _MINOR macros - were not defined then. */ + Note: only works for GCC 2.0 and later, because __GNUC_MINOR__ was + added in 2.0. */ #if defined __GNUC__ && defined __GNUC_MINOR__ # define __GNUC_PREREQ(maj, min) \ ((__GNUC__ << 16) + __GNUC_MINOR__ >= ((maj) << 16) + (min)) @@ -152,6 +152,17 @@ # define __GNUC_PREREQ(maj, min) 0 #endif +/* Similarly for clang. Features added to GCC after version 4.2 may + or may not also be available in clang, and clang's definitions of + __GNUC(_MINOR)__ are fixed at 4 and 2 respectively. Not all such + features can be queried via __has_extension/__has_feature. */ +#if defined __clang_major__ && defined __clang_minor__ +# define __glibc_clang_prereq(maj, min) \ + ((__clang_major__ << 16) + __clang_minor__ >= ((maj) << 16) + (min)) +#else +# define __glibc_clang_prereq(maj, min) 0 +#endif + /* Whether to use feature set F. */ #define __GLIBC_USE(F) __GLIBC_USE_ ## F -- cgit 1.4.1