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

标签 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 的测试驱动程序。它有一个 main 和一些 C 函数。 Effectively 是 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 在小端上很好。 vec_xl 的 big-endian 给我们带来了麻烦。

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

最佳答案

所以一些猜测(由 OP 评论确认,因为它有效)让我认为这个神秘和晦涩的“参数类型对于这种链接类型的函数无效。”消息(谷歌第一场比赛是这个问题!)可能是一个限定符问题。

因为你的契约(Contract)是

uint8x16_p8 Load8x16(const uint8_t src[16])

有可能,给定选项和当前的字节顺序,编译器/原型(prototype)认为 vec_xl_be 需要一个非常量参数作为 src.

因此传递 const 违反了约定(这是 xlc 可以找到的通知您的最佳方式)

所以要么改成

uint8x16_p8 Load8x16(uint8_t src[16])

(存在为所有调用者放弃常量约束的风险)

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

vec_xl_be(0,(uint8_t*)src);

关于c - 参数类型对此链接类型的函数无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46124383/

相关文章:

c++ - C:将大数从字符串转换为以 n 为模的整数

python - 在 python 中子类化内置枚举

java - 在独立 Java 中将 XA 事务与 WebSphere MQ 结合使用

c - 从文件打印错误值

c - 如何在 bmp 图像上叠加文本或标记

javascript - 内置对象如何(例如 : 'Object' ) created in Javascript by any JS engine?

c++ - XLC++ 11.1 的奇怪问题

c++ - xlc: 模板类的 sizeof 不工作

c - 理解传递的这个参数

python - 直接从内置类型继承与其在 Python 中的包装类