IBM XL C/C++ 预处理器宏发生了什么变化?
What happened to IBM XL C/C++ preprocessor macros?
我正在 compile farm 的 GCC112 上工作,这是一台 Linux ppc64-le 机器。我正在测试 IBM XL C/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: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);
__builtin_crypto_vcipher
是 GCC 内置的。进入该路径的唯一方法是如果未定义 __xlc__
和 __xlC__
:
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
}
检查预处理器宏:
$ xlC -qshowmacros -qarch=pwr8 -qaltivec -E aes-simd.cpp | grep -i xlc
#define __XLC_BUILTIN_VAARG__ 1
看起来几乎所有的预处理器宏都消失了。 __XLC_BUILTIN_VAARG__
单个宏不正确
IBM XL C/C++ 预处理器宏发生了什么变化,如何取回它们?
$ 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
IBM XL C/C++ for Linux V13.1.6 默认不定义 __xlc__
或 __xlC__
,但您可以让编译器通过以下方式定义它们使用 -qxlcompatmacros
。您可以使用它定义的其他宏,例如 __ibmxl__
;有关详细信息,请参阅 this Knowledge Center page。
我知道 GCC 编译农场管理员最近应 XL 的其他用户之一的要求升级到 13.1.6,但我相信 IBM XL C/C++ Linux(对于小端分布)总是有同样的行为。
IBM XL C/C++ for Linux(对于大端分布)和 IBM XL C/C++ for AIX 行为不同,定义 __xlc__
或 [=默认为 11=]。
我正在 compile farm 的 GCC112 上工作,这是一台 Linux ppc64-le 机器。我正在测试 IBM XL C/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: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);
__builtin_crypto_vcipher
是 GCC 内置的。进入该路径的唯一方法是如果未定义 __xlc__
和 __xlC__
:
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
}
检查预处理器宏:
$ xlC -qshowmacros -qarch=pwr8 -qaltivec -E aes-simd.cpp | grep -i xlc
#define __XLC_BUILTIN_VAARG__ 1
看起来几乎所有的预处理器宏都消失了。 __XLC_BUILTIN_VAARG__
单个宏不正确
IBM XL C/C++ 预处理器宏发生了什么变化,如何取回它们?
$ 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
IBM XL C/C++ for Linux V13.1.6 默认不定义 __xlc__
或 __xlC__
,但您可以让编译器通过以下方式定义它们使用 -qxlcompatmacros
。您可以使用它定义的其他宏,例如 __ibmxl__
;有关详细信息,请参阅 this Knowledge Center page。
我知道 GCC 编译农场管理员最近应 XL 的其他用户之一的要求升级到 13.1.6,但我相信 IBM XL C/C++ Linux(对于小端分布)总是有同样的行为。
IBM XL C/C++ for Linux(对于大端分布)和 IBM XL C/C++ for AIX 行为不同,定义 __xlc__
或 [=默认为 11=]。