From patchwork Fri May 13 13:26:15 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zack Weinberg X-Patchwork-Id: 12232 Received: (qmail 105654 invoked by alias); 13 May 2016 13:26:28 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 105599 invoked by uid 89); 13 May 2016 13:26:27 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-2.3 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy=maj, 2.8, claims, HContent-Transfer-Encoding:8bit X-HELO: l2mail1.panix.com From: Zack Weinberg To: libc-alpha@sourceware.org Subject: [PATCH 3/4] Add utility macros for clang detection, and deprecation with messages. Date: Fri, 13 May 2016 09:26:15 -0400 Message-Id: In-Reply-To: References: MIME-Version: 1.0 In-Reply-To: References: Add three new macros 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 patch #4. ChangeLog: * 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 +++++++++++++++---- misc/sys/cdefs.h | 22 +++++++++++++++++++++- 2 files changed, 36 insertions(+), 5 deletions(-) diff --git a/include/features.h b/include/features.h index 9514d35..0374022 100644 --- a/include/features.h +++ b/include/features.h @@ -125,13 +125,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)) @@ -139,6 +139,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 their 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 + /* _BSD_SOURCE and _SVID_SOURCE are deprecated aliases for _DEFAULT_SOURCE. If _DEFAULT_SOURCE is present we do not issue a warning; the expectation is that the source is being diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h index 7fd4154..e193df8 100644 --- a/misc/sys/cdefs.h +++ b/misc/sys/cdefs.h @@ -77,6 +77,15 @@ #endif /* GCC. */ +/* Compilers that are not clang may object to + #if defined __clang__ && __has_extension(...) + even though they do not need to evaluate the right-hand side of the &&. */ +#if defined __clang__ && defined __has_extension +# define __glibc_clang_has_extension(ext) __has_extension (ext) +#else +# define __glibc_clang_has_extension(ext) 0 +#endif + /* These two macros are not used in glibc anymore. They are kept here only because some other projects expect the macros to be defined. */ #define __P(args) args @@ -249,13 +258,24 @@ # define __attribute_noinline__ /* Ignore */ #endif -/* gcc allows marking deprecated functions. */ +/* Since version 3.2, gcc allows marking deprecated functions. */ #if __GNUC_PREREQ (3,2) # define __attribute_deprecated__ __attribute__ ((__deprecated__)) #else # define __attribute_deprecated__ /* Ignore */ #endif +/* Since version 4.5, gcc also allows one to specify the message printed + when a deprecated function is used. clang claims to be gcc 4.2, but + may also support this feature. */ +#if __GNUC_PREREQ (4,5) || \ + __glibc_clang_has_extension (__attribute_deprecated_with_message__) +# define __attribute_deprecated_msg__(msg) \ + __attribute__ ((__deprecated__ (msg))) +#else +# define __attribute_deprecated_msg__(msg) __attribute_deprecated__ +#endif + /* At some point during the gcc 2.8 development the `format_arg' attribute for functions was introduced. We don't want to use it unconditionally (although this would be possible) since it generates warnings.