Тип параметра недопустим для функции этого типа связи

Я работаю над AIX с помощью компилятора XL XL от IBM. Я ловлю ошибку компиляции, и я не уверен, что делать дальше:

$ 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, Исходный код тестового драйвера для Power8 __cipher а также __vcipherlast, У него есть основная и несколько Си-функций. Эффективно является минимальным полным рабочим примером для 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 хорошо на little-endian. vec_xl ибо big-endian доставляет нам неприятности.

В чем проблема, и как мне это исправить?

1 ответ

Решение

Поэтому небольшая догадка (подтвержденная комментариями OP, поскольку она работает) привела меня к мысли, что это загадочное и неясное "Тип параметра недопустим для функции этого типа связи". сообщение (Google первым совпадением является этот вопрос!) может быть проблемой квалификатора.

Так как ваш контракт

uint8x16_p8 Load8x16(const uint8_t src[16])

возможно, что, учитывая параметры и текущий порядок байтов, компилятор / прототип считает, что vec_xl_be ожидает неконстантный параметр как src,

Так проходя const нарушает договор (и это самый хороший способ xlc мог бы уведомить вас)

Так что либо поменяй на

uint8x16_p8 Load8x16(uint8_t src[16])

(с риском сброса постоянных ограничений для всех абонентов)

или бросьте const неконстантным исполнением (как мы делаем, когда прототип не хватает const, но данные на самом деле не изменены в функции):

vec_xl_be(0,(uint8_t*)src);
Другие вопросы по тегам