noloader / cryptopp-cmake

CMake files for Crypto++ project
BSD 3-Clause "New" or "Revised" License
92 stars 67 forks source link

CheckCompilerOption is misdetecting PowerPC options #40

Closed noloader closed 5 years ago

noloader commented 5 years ago

Due to some bad interactions with Clang, GCC and XLC on PowerPC we needed to tighten up some slop in the way we detect PowerPC features. CheckCompilerOption is misdetecting features now because an empty main is not enough. For example, an empty main reports the following on a POWER7 machine with a compiler that lacks POWER8:

-- Performing Test PPC_ALTIVEC_FLAG
-- Performing Test PPC_ALTIVEC_FLAG - Success
-- Option -mcpu=power7 -maltivec
-- Performing Test PPC_POWER7_FLAG
-- Performing Test PPC_POWER7_FLAG - Success
-- Option -mcpu=power8 -maltivec
-- Performing Test PPC_POWER8_FLAG
-- Performing Test PPC_POWER8_FLAG - Success

However, when we go to use POWER8 with a builtin like vec_add then a compile error surfaces.

[ 10%] Building CXX object CMakeFiles/cryptopp-object.dir/blake2s_simd.cpp.o
/home/noloader/cryptopp/blake2b_simd.cpp: In function 'void CryptoPP::BLAKE2_Compress64_POWER8(const byte*, CryptoPP::BLAKE2b_State&)':
/home/noloader/cryptopp/blake2b_simd.cpp:1129:47: error: invalid parameter combination for AltiVec intrinsic
     #define vec_ror_32(x) vec_rl(x, ROR32_MASK)

Fortunately, we have some test programs stashed away in TestPrograms. In fact we can test for almost all features on every platform we support. In this case we can accurately detect the availability:

$ c++ -mcpu=power8 -maltivec TestPrograms/test_ppc_power8.cxx    TestPrograms/test_ppc_power8.cxx: In function 'int main(int, char**)':
TestPrograms/test_ppc_power8.cxx:5:15: error: invalid parameter combination for AltiVec intrinsic
  z=vec_add(z,z);

I think we should be able to cutover cleanly based on my experience with GNUmakefile using the test programs.

noloader commented 5 years ago

Also see CMake Issue 18813, CXX and CXXFLAGS used during feature tests are not accurate in CmakeList.txt.