From 3e909c13d4bd1fc52679eb7cd43d9a5ea476916b Mon Sep 17 00:00:00 2001 From: Jeffrey Walton Date: Fri, 30 Nov 2018 08:23:35 -0500 Subject: [PATCH] Add IBM XLC init priority support --- config.h | 21 +++++++-------------- cpu.cpp | 4 ++++ integer.cpp | 13 ++++++++++--- ppc_power9.cpp | 4 ---- 4 files changed, 21 insertions(+), 21 deletions(-) diff --git a/config.h b/config.h index 333c0bcd..a25b6481 100644 --- a/config.h +++ b/config.h @@ -373,6 +373,8 @@ NAMESPACE_END #define CRYPTOPP_SECTION_INIT __attribute__((section ("__DATA,__data"))) #elif (defined(__ELF__) && (CRYPTOPP_GCC_VERSION >= 40300)) #define CRYPTOPP_SECTION_INIT __attribute__((section ("nocommon"))) +#elif defined(__ELF__) && (defined(__xlC__) || defined(__ibmxl__)) + #define CRYPTOPP_SECTION_INIT __attribute__((section ("nocommon"))) #else #define CRYPTOPP_SECTION_INIT #endif @@ -858,7 +860,7 @@ NAMESPACE_END #if defined(_MSC_VER) # define CRYPTOPP_NOINLINE_DOTDOTDOT # define CRYPTOPP_NOINLINE __declspec(noinline) -#elif defined(__xlc__) || defined(__xlC__) +#elif defined(__xlc__) || defined(__xlC__) || defined(__ibmxl__) # define CRYPTOPP_NOINLINE_DOTDOTDOT ... # define CRYPTOPP_NOINLINE __attribute__((noinline)) #elif defined(__GNUC__) @@ -904,10 +906,8 @@ NAMESPACE_END // CRYPTOPP_USER_PRIORITY is for other libraries and user code that is using Crypto++ // and managing C++ static object creation. It is guaranteed not to conflict with // values used by (or would be used by) the Crypto++ library. -#if defined(CRYPTOPP_INIT_PRIORITY) && (CRYPTOPP_INIT_PRIORITY > 0) -# define CRYPTOPP_USER_PRIORITY (CRYPTOPP_INIT_PRIORITY + 101) -#else -# define CRYPTOPP_USER_PRIORITY 350 +#ifndef CRYPTOPP_USER_PRIORITY +# define CRYPTOPP_USER_PRIORITY (CRYPTOPP_INIT_PRIORITY+101) #endif // Most platforms allow us to specify when to create C++ objects. Apple and Sun do not. @@ -916,6 +916,8 @@ NAMESPACE_END # define HAVE_GCC_INIT_PRIORITY 1 # elif (CRYPTOPP_MSC_VERSION >= 1310) # define HAVE_MSC_INIT_PRIORITY 1 +# elif defined(__xlc__) || defined(__xlC__) || defined(__ibmxl__) +# define HAVE_XLC_INIT_PRIORITY 1 # endif #endif // CRYPTOPP_INIT_PRIORITY, NO_OS_DEPENDENCE, Apple, Sun @@ -1050,15 +1052,6 @@ NAMESPACE_END # define CRYPTOPP_DEPRECATED(msg) #endif -// ************** Instrumentation *************** - -// GCC does not support; see http://gcc.gnu.org/bugzilla/show_bug.cgi?id=78204 -#if (CRYPTOPP_LLVM_CLANG_VERSION >= 30700) || (CRYPTOPP_APPLE_CLANG_VERSION >= 70000) -# define CRYPTOPP_NO_SANITIZE(x) __attribute__((no_sanitize(x))) -#else -# define CRYPTOPP_NO_SANITIZE(x) -#endif - // ***************** C++11 related ******************** // Visual Studio began at VS2010, http://msdn.microsoft.com/en-us/library/hh567368%28v=vs.110%29.aspx diff --git a/cpu.cpp b/cpu.cpp index 8d2ca24b..6d51e892 100644 --- a/cpu.cpp +++ b/cpu.cpp @@ -1069,6 +1069,10 @@ public: #pragma init_seg(".CRT$XCU") const InitCpu s_init; #pragma warning(default: 4075) +#elif HAVE_XLC_INIT_PRIORITY + // XLC needs constant, not a define + #pragma priority(270) + const InitCpu s_init; #else const InitCpu s_init; #endif diff --git a/integer.cpp b/integer.cpp index 58665ddd..cf04c962 100644 --- a/integer.cpp +++ b/integer.cpp @@ -4826,6 +4826,13 @@ public: const Integer g_one(1L); const Integer g_two(2L); #pragma warning(default: 4075) +#elif HAVE_XLC_INIT_PRIORITY + // XLC needs constant, not a define + #pragma priority(280) + const InitInteger s_init; + const Integer g_zero(0L); + const Integer g_one(1L); + const Integer g_two(2L); #else const InitInteger s_init; #endif @@ -4834,7 +4841,7 @@ public: const Integer &Integer::Zero() { -#if defined(HAVE_GCC_INIT_PRIORITY) || defined(HAVE_MSC_INIT_PRIORITY) +#if defined(HAVE_GCC_INIT_PRIORITY) || defined(HAVE_MSC_INIT_PRIORITY) || defined(HAVE_XLC_INIT_PRIORITY) return g_zero; #elif defined(CRYPTOPP_CXX11_DYNAMIC_INIT) static const Integer s_zero(0L); @@ -4846,7 +4853,7 @@ const Integer &Integer::Zero() const Integer &Integer::One() { -#if defined(HAVE_GCC_INIT_PRIORITY) || defined(HAVE_MSC_INIT_PRIORITY) +#if defined(HAVE_GCC_INIT_PRIORITY) || defined(HAVE_MSC_INIT_PRIORITY) || defined(HAVE_XLC_INIT_PRIORITY) return g_one; #elif defined(CRYPTOPP_CXX11_DYNAMIC_INIT) static const Integer s_one(1L); @@ -4858,7 +4865,7 @@ const Integer &Integer::One() const Integer &Integer::Two() { -#if defined(HAVE_GCC_INIT_PRIORITY) || defined(HAVE_MSC_INIT_PRIORITY) +#if defined(HAVE_GCC_INIT_PRIORITY) || defined(HAVE_MSC_INIT_PRIORITY) || defined(HAVE_XLC_INIT_PRIORITY) return g_two; #elif defined(CRYPTOPP_CXX11_DYNAMIC_INIT) static const Integer s_two(2L); diff --git a/ppc_power9.cpp b/ppc_power9.cpp index f4fbd371..02d08588 100644 --- a/ppc_power9.cpp +++ b/ppc_power9.cpp @@ -51,8 +51,6 @@ bool CPU_ProbePower9() { #if defined(CRYPTOPP_NO_CPU_FEATURE_PROBES) return false; -#elif defined(__xlC__) && defined(__linux__) - return false; #elif defined(CRYPTOPP_POWER9_AVAILABLE) # if defined(CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY) // longjmp and clobber warnings. Volatile is required. @@ -100,8 +98,6 @@ bool CPU_ProbeDARN() { #if defined(CRYPTOPP_NO_CPU_FEATURE_PROBES) return false; -#elif defined(__xlC__) && defined(__linux__) - return false; #else # if defined(CRYPTOPP_GNU_STYLE_INLINE_ASSEMBLY) // longjmp and clobber warnings. Volatile is required.