Move some compiler-specific macros to qcompilerdetection.h

Task-number: QTBUG-99313
Change-Id: Ia381fc0242090ee08ae734421274dcef15709778
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
This commit is contained in:
Sona Kurazyan 2022-08-11 15:15:18 +02:00
parent 042290d0fb
commit 986fea9058
2 changed files with 74 additions and 68 deletions

View File

@ -14,6 +14,8 @@
#ifndef QCOMPILERDETECTION_H
#define QCOMPILERDETECTION_H
#include <QtCore/qprocessordetection.h>
/*
The compiler, must be one of: (Q_CC_x)
@ -1203,4 +1205,76 @@ static_assert(!std::is_convertible_v<std::nullptr_t, bool>,
"Compile your code with -fPIC (and not with -fPIE)."
#endif
#ifdef Q_PROCESSOR_X86_32
# if defined(Q_CC_GNU)
# define QT_FASTCALL __attribute__((regparm(3)))
# elif defined(Q_CC_MSVC)
# define QT_FASTCALL __fastcall
# else
# define QT_FASTCALL
# endif
#else
# define QT_FASTCALL
#endif
// enable gcc warnings for printf-style functions
#if defined(Q_CC_GNU) && !defined(__INSURE__)
# if defined(Q_CC_MINGW) && !defined(Q_CC_CLANG)
# define Q_ATTRIBUTE_FORMAT_PRINTF(A, B) \
__attribute__((format(gnu_printf, (A), (B))))
# else
# define Q_ATTRIBUTE_FORMAT_PRINTF(A, B) \
__attribute__((format(printf, (A), (B))))
# endif
#else
# define Q_ATTRIBUTE_FORMAT_PRINTF(A, B)
#endif
#ifdef Q_CC_MSVC
# define Q_NEVER_INLINE __declspec(noinline)
# define Q_ALWAYS_INLINE __forceinline
#elif defined(Q_CC_GNU)
# define Q_NEVER_INLINE __attribute__((noinline))
# define Q_ALWAYS_INLINE inline __attribute__((always_inline))
#else
# define Q_NEVER_INLINE
# define Q_ALWAYS_INLINE inline
#endif
//defines the type for the WNDPROC on windows
//the alignment needs to be forced for sse2 to not crash with mingw
#if defined(Q_OS_WIN)
# if defined(Q_CC_MINGW) && defined(Q_PROCESSOR_X86_32)
# define QT_ENSURE_STACK_ALIGNED_FOR_SSE __attribute__ ((force_align_arg_pointer))
# else
# define QT_ENSURE_STACK_ALIGNED_FOR_SSE
# endif
# define QT_WIN_CALLBACK CALLBACK QT_ENSURE_STACK_ALIGNED_FOR_SSE
#endif
#ifdef __cpp_conditional_explicit
#define Q_IMPLICIT explicit(false)
#else
#define Q_IMPLICIT
#endif
#if defined(__cplusplus)
#ifdef __cpp_constinit
# if defined(Q_CC_MSVC) && !defined(Q_CC_CLANG)
// https://developercommunity.visualstudio.com/t/C:-constinit-for-an-optional-fails-if-/1406069
# define Q_CONSTINIT
# else
# define Q_CONSTINIT constinit
# endif
#elif defined(__has_cpp_attribute) && __has_cpp_attribute(clang::require_constant_initialization)
# define Q_CONSTINIT [[clang::require_constant_initialization]]
#elif defined(Q_CC_GNU_ONLY) && Q_CC_GNU >= 1000
# define Q_CONSTINIT __constinit
#else
# define Q_CONSTINIT
#endif
#endif // __cplusplus
#endif // QCOMPILERDETECTION_H

View File

@ -186,53 +186,6 @@ Q_CORE_EXPORT Q_DECL_CONST_FUNCTION const char *qVersion(void) Q_DECL_NOEXCEPT;
# define QT_ASCII_CAST_WARN
#endif
#ifdef Q_PROCESSOR_X86_32
# if defined(Q_CC_GNU)
# define QT_FASTCALL __attribute__((regparm(3)))
# elif defined(Q_CC_MSVC)
# define QT_FASTCALL __fastcall
# else
# define QT_FASTCALL
# endif
#else
# define QT_FASTCALL
#endif
// enable gcc warnings for printf-style functions
#if defined(Q_CC_GNU) && !defined(__INSURE__)
# if defined(Q_CC_MINGW) && !defined(Q_CC_CLANG)
# define Q_ATTRIBUTE_FORMAT_PRINTF(A, B) \
__attribute__((format(gnu_printf, (A), (B))))
# else
# define Q_ATTRIBUTE_FORMAT_PRINTF(A, B) \
__attribute__((format(printf, (A), (B))))
# endif
#else
# define Q_ATTRIBUTE_FORMAT_PRINTF(A, B)
#endif
#ifdef Q_CC_MSVC
# define Q_NEVER_INLINE __declspec(noinline)
# define Q_ALWAYS_INLINE __forceinline
#elif defined(Q_CC_GNU)
# define Q_NEVER_INLINE __attribute__((noinline))
# define Q_ALWAYS_INLINE inline __attribute__((always_inline))
#else
# define Q_NEVER_INLINE
# define Q_ALWAYS_INLINE inline
#endif
//defines the type for the WNDPROC on windows
//the alignment needs to be forced for sse2 to not crash with mingw
#if defined(Q_OS_WIN)
# if defined(Q_CC_MINGW) && defined(Q_PROCESSOR_X86_32)
# define QT_ENSURE_STACK_ALIGNED_FOR_SSE __attribute__ ((force_align_arg_pointer))
# else
# define QT_ENSURE_STACK_ALIGNED_FOR_SSE
# endif
# define QT_WIN_CALLBACK CALLBACK QT_ENSURE_STACK_ALIGNED_FOR_SSE
#endif
/*
Utility macros and inline functions
*/
@ -502,27 +455,6 @@ constexpr std::underlying_type_t<Enum> qToUnderlying(Enum e) noexcept
return static_cast<std::underlying_type_t<Enum>>(e);
}
#ifdef __cpp_conditional_explicit
#define Q_IMPLICIT explicit(false)
#else
#define Q_IMPLICIT
#endif
#ifdef __cpp_constinit
# if defined(Q_CC_MSVC) && !defined(Q_CC_CLANG)
// https://developercommunity.visualstudio.com/t/C:-constinit-for-an-optional-fails-if-/1406069
# define Q_CONSTINIT
# else
# define Q_CONSTINIT constinit
# endif
#elif defined(__has_cpp_attribute) && __has_cpp_attribute(clang::require_constant_initialization)
# define Q_CONSTINIT [[clang::require_constant_initialization]]
#elif defined(Q_CC_GNU_ONLY) && Q_CC_GNU >= 1000
# define Q_CONSTINIT __constinit
#else
# define Q_CONSTINIT
#endif
template <typename T> inline T *qGetPtrHelper(T *ptr) noexcept { return ptr; }
template <typename Ptr> inline auto qGetPtrHelper(Ptr &ptr) noexcept -> decltype(ptr.get())
{ static_assert(noexcept(ptr.get()), "Smart d pointers for Q_DECLARE_PRIVATE must have noexcept get()"); return ptr.get(); }