参数类型对此链接类型的函数无效

时间:2017-09-08 20:54:07

标签: c built-in xlc altivec

我正在使用IBM的XL C编译器在AIX上工作。我发现编译错误,我不确定如何继续:

$ xlc -g3 -O0 -qarch=pwr8 -qaltivec fips197-p8.c -o fips197-p8.exe
"fips197-p8.c", line 59.16: 1506-754 (W) The parameter type is not valid for a function of this linkage type.

相关的源代码如下所示。完整的源代码可在fips197-p8.c获得。源代码是Power 8 __cipher__vcipherlast的测试驱动程序。它有一个主要功能和几个C功能。实际上是Power 8 AES的最小完整工作示例。

$ cat -n fips197-p8.c
...

11  #if defined(__xlc__) || defined(__xlC__)
12  // #include <builtins.h>
13  #include <altivec.h>
14  typedef vector unsigned char uint8x16_p8;
15  typedef vector unsigned int uint64x2_p8;
16  #else
17  #include <altivec.h>
18  typedef vector unsigned char uint8x16_p8;
19  typedef vector unsigned long long uint64x2_p8;
20  #endif
...

52  uint8x16_p8 Load8x16(const uint8_t src[16])
53  {
54  #if defined(__xlc__) || defined(__xlC__)
55          /* IBM XL C/C++ compiler */
56  # if defined(__LITTLE_ENDIAN__)
57          return vec_xl_be(0, src);
58  # else
59          return vec_xl(0, src);
60  # endif
61  #else
62          /* GCC, Clang, etc */
63
64  #endif
65  }

编译器版本如下所示。我们无法控制编译器,所以这就是我们所拥有的:

$ xlc -qversion
IBM XL C/C++ for AIX, V13.1.3 (5725-C72, 5765-J07)
Version: 13.01.0003.0000

vec_xl在小端上很好。对于big-endian来说,vec_xl给了我们麻烦。

问题是什么,我该如何解决?

1 个答案:

答案 0 :(得分:2)

所以有点猜测(由OP评论确认,因为它起作用)让我认为这个神秘的&amp;模糊&#34;参数类型对此链接类型的函数无效。&#34;消息(谷歌首次匹配是这个问题!)可能是限定符问题。

由于你的合同是

uint8x16_p8 Load8x16(const uint8_t src[16])

有可能,鉴于选项&amp;当前的endianness,编译器/原型认为vec_xl_be期望非const 参数为src

因此传递const会违反合同(这是xlc找到的最好的方式,可以告诉你)

所以要么改为

uint8x16_p8 Load8x16(uint8_t src[16])

(存在为所有呼叫者丢弃常量约束的风险)

或通过非const转换删除const(就像我们在原型缺少const时那样,但实际上数据未在函数中修改):

vec_xl_be(0,(uint8_t*)src);