From 1a57ab0c923f269d1d7c29dfe4634c0ae66d69ac Mon Sep 17 00:00:00 2001 From: Sachin Monga Date: Wed, 10 May 2023 13:59:21 -0400 Subject: Added Redirects to longdouble error functions [BZ #29033] This patch redirects the error functions to the appropriate longdouble variants which enables the compiler to optimize for the abi ieeelongdouble. Signed-off-by: Sachin Monga --- misc/bits/error-ldbl.h | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'misc/bits') diff --git a/misc/bits/error-ldbl.h b/misc/bits/error-ldbl.h index 599a7d6e06..bbc4956f68 100644 --- a/misc/bits/error-ldbl.h +++ b/misc/bits/error-ldbl.h @@ -20,5 +20,50 @@ # error "Never include directly; use instead." #endif +#if defined __extern_always_inline && defined __va_arg_pack +extern void __REDIRECT_LDBL (__error_alias, (int __status, int __errnum, + const char *__format, ...), error) + __attribute__ ((__format__ (__printf__, 3, 4))); +extern void __REDIRECT_LDBL (__error_noreturn, (int __status, int __errnum, + const char *__format, ...), error) + __attribute__ ((__noreturn__, __format__ (__printf__, 3, 4))); + + +/* If we know the function will never return make sure the compiler + realizes that, too. */ +__extern_always_inline void +error (int __status, int __errnum, const char *__format, ...) +{ + if (__builtin_constant_p (__status) && __status != 0) + __error_noreturn (__status, __errnum, __format, __va_arg_pack ()); + else + __error_alias (__status, __errnum, __format, __va_arg_pack ()); +} + + +extern void __REDIRECT_LDBL (__error_at_line_alias, (int __status, int __errnum, + const char *__fname, unsigned int __line, + const char *__format, ...), error_at_line) + __attribute__ ((__format__ (__printf__, 5, 6))); +extern void __REDIRECT_LDBL (__error_at_line_noreturn, (int __status, int __errnum, + const char *__fname, unsigned int __line, + const char *__format, ...), error_at_line) + __attribute__ ((__noreturn__, __format__ (__printf__, 5, 6))); + + +/* If we know the function will never return make sure the compiler + realizes that, too. */ +__extern_always_inline void +error_at_line (int __status, int __errnum, const char *__fname, + unsigned int __line, const char *__format, ...) +{ + if (__builtin_constant_p (__status) && __status != 0) + __error_at_line_noreturn (__status, __errnum, __fname, __line, __format, + __va_arg_pack ()); + else + __error_at_line_alias (__status, __errnum, __fname, __line, + __format, __va_arg_pack ()); +} +#endif __LDBL_REDIR_DECL (error) __LDBL_REDIR_DECL (error_at_line) -- cgit v1.2.3