1

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リトルエンディアンで問題ありません。vec_xlビッグエンディアンが問題を引き起こしているからです。

問題は何ですか?どうすれば修正できますか?

4

1 に答える 1

2

そのため、ちょっとした推測 (OP コメントで動作するので確認済み) から、この不可解であいまいな「パラメーターの型は、このリンケージ型の関数に対して有効ではありません」と考えるようになりました。メッセージ (google first match is this question!) は修飾子の問題である可能性があります。

あなたの契約は

uint8x16_p8 Load8x16(const uint8_t src[16])

オプションと現在のエンディアンを考えると、コンパイラ/プロトタイプは が非 constパラメータをvec_xl_be期待していると考えている可能性があります。src

したがって、a を渡すことconstは契約に違反します (これは、通知する最も良い方法xlcです)。

したがって、次のいずれかに変更します

uint8x16_p8 Load8x16(uint8_t src[16])

(すべての呼び出し元の定数制約を削除するリスクがあります)

constまたは非 const キャストで をドロップします (プロトタイプconstに が欠けている場合のように、データは実際には関数内で変更されません)。

vec_xl_be(0,(uint8_t*)src);
于 2017-09-09T07:52:02.233 に答える