参数类型对此链接类型的函数无效
The parameter type is not valid for a function of this linkage type
我正在使用 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 评论确认,因为它有效)让我认为这个神秘和晦涩的 "The parameter type is not valid for a function of this linkage type." 消息(google 第一个匹配是这个问题!)可能是 限定符问题。
因为你的合同是
uint8x16_p8 Load8x16(const uint8_t src[16])
有可能,鉴于选项和当前的字节顺序,compiler/prototype 认为 vec_xl_be
期望 非常量 参数作为 src
.
因此传递 const
违反了合同(这是 xlc
可以找到的通知您的最佳方式)
所以要么改为
uint8x16_p8 Load8x16(uint8_t src[16])
(存在为所有呼叫者放弃常量约束的风险)
或者通过非常量转换删除 const
(就像我们在原型缺少 const
时所做的那样,但数据实际上并未在函数中修改):
vec_xl_be(0,(uint8_t*)src);
我正在使用 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 评论确认,因为它有效)让我认为这个神秘和晦涩的 "The parameter type is not valid for a function of this linkage type." 消息(google 第一个匹配是这个问题!)可能是 限定符问题。
因为你的合同是
uint8x16_p8 Load8x16(const uint8_t src[16])
有可能,鉴于选项和当前的字节顺序,compiler/prototype 认为 vec_xl_be
期望 非常量 参数作为 src
.
因此传递 const
违反了合同(这是 xlc
可以找到的通知您的最佳方式)
所以要么改为
uint8x16_p8 Load8x16(uint8_t src[16])
(存在为所有呼叫者放弃常量约束的风险)
或者通过非常量转换删除 const
(就像我们在原型缺少 const
时所做的那样,但数据实际上并未在函数中修改):
vec_xl_be(0,(uint8_t*)src);