Macros IBM XL C/C++;预处理器宏?
我正在从一台Linux ppc64 le机器上开发GCC112。我正在测试IBMXLC/C++并捕获一些使用POWER8的AES代码的编译失败。该准则在过去几年中一直有效。失败是新的 编译失败是:Macros IBM XL C/C++;预处理器宏?,macros,c-preprocessor,powerpc,xlc,Macros,C Preprocessor,Powerpc,Xlc,我正在从一台Linux ppc64 le机器上开发GCC112。我正在测试IBMXLC/C++并捕获一些使用POWER8的AES代码的编译失败。该准则在过去几年中一直有效。失败是新的 编译失败是: $ CXX=xlC make aes-simd.o xlC -DNDEBUG -g2 -O3 -qrtti -qpic -qarch=pwr8 -qaltivec -c aes-simd.cpp In file included from aes-simd.cpp:29: ./ppc-simd.h:4
$ CXX=xlC make aes-simd.o
xlC -DNDEBUG -g2 -O3 -qrtti -qpic -qarch=pwr8 -qaltivec -c aes-simd.cpp
In file included from aes-simd.cpp:29:
./ppc-simd.h:443:16: error: use of undeclared identifier
'__builtin_crypto_vcipher'; did you mean '__builtin_vec_vcipher'?
return (T1)__builtin_crypto_vcipher((uint64x2_p)state, (uint64x2_p)key);
\uuuu内置加密vcipher
是一个GCC内置密码。进入该路径的唯一方法是,如果未定义\uuuuxlc\uuuu
和\uuuxlc\uuuuu
:
template <class T1, class T2>
inline T1 VectorEncrypt(const T1& state, const T2& key)
{
#if defined(__xlc__) || defined(__xlC__)
return (T1)__vcipher((uint8x16_p)state, (uint8x16_p)key);
#elif defined(__GNUC__)
return (T1)__builtin_crypto_vcipher((uint64x2_p)state, (uint64x2_p)key);
#else
_ASSERT(0);
#endif
}
看起来几乎所有的预处理器宏都消失了。\uuuxlc\u BUILTIN\u VAARG\uuuu
的单个宏不正确
IBM XL C/C++预处理器宏发生了什么事,如何将它们取回
默认情况下,IBM XL C/C++for Linux V13.1.6不定义
\uxlc\uuuuu
或\uuxlc\uuuuu
,但您可以让编译器使用-qxlcompatmacros
来定义它们。您可以使用它定义的其他宏,如\uuuuuiBMXL\uuuuuuu
;有关更多信息,请参阅
我知道GCC编译场管理员最近应XL的一位其他用户的请求升级到了13.1.6,但我相信IBM XL C/C++for Linux(用于little endian发行版)一直都有这种行为
IBM XL C/C++Linux版(适用于big-endian发行版)和IBM XL C/C++AIX版的行为不同,默认情况下定义
\uuuuuuxlc\uuuu
或\uuuxlc\uuuuu
。谢谢@Nicole。我应该知道这是LLVM和他们假装是另一个编译器但未能使用程序的愚蠢伎俩。
$ xlC -qshowmacros -qarch=pwr8 -qaltivec -E aes-simd.cpp | grep -i xlc
#define __XLC_BUILTIN_VAARG__ 1
$ xlC -qversion
IBM XL C/C++ for Linux, V13.1.6 (Community Edition)
Version: 13.01.0006.0001
/opt/ibm/xlC/13.1.6/bin/.orig/xlC