IBM XL C / C ++预处理程序宏发生了什么?

时间:2018-07-31 01:20:17

标签: macros c-preprocessor powerpc xlc

我正在使用compile farm(这是一台Linux ppc64-le机器)上的GCC112进行工作。我正在测试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

1 个答案:

答案 0 :(得分:1)

用于Linux V13.1.6的IBM XL C / C ++默认情况下未定义__xlc____xlC__,但是您可以使编译器使用-qxlcompatmacros来定义它们。您也许可以使用它定义的其他宏,例如__ibmxl__;有关更多信息,请参见this Knowledge Center page

我知道最近应XL的其他用户之一的要求,GCC编译场管理员已升级到13.1.6,但是我相信用于Linux的IBM XL C / C ++(对于小端序发行版)始终具有相同的行为。

用于Linux的IBM XL C / C ++(用于大端发行版)和用于AIX的IBM XL C / C ++的行为不同,并且默认情况下定义了__xlc____xlC__