Ошибка сегментации - доступ к элементам массива, переданным из кода IR LLVM - PullRequest
0 голосов
/ 25 мая 2018

У меня есть программа, которая отлично работает, когда я запускаю ее с использованием C ++, однако, когда я вызываю ее из моего кода LLVM IR, она не работает.

Функция (library / library.cpp)

extern "C" DLLEXPORT double *DOT(double A[3][3], double B[3][3]) {
  std::cout << A[0][0] << std::endl;
...
}

LLVM IR (out.ll)

declare [3 x double] @DOT([3 x [3 x double]], [3 x [3 x double]])
...
%a1 = load [3 x [3 x double]], [3 x [3 x double]]* %a
%b2 = load [3 x [3 x double]], [3 x [3 x double]]* %b
%calltmp = call [3 x double] @DOT([3 x [3 x double]] %a1, [3 x [3 x double]] %b2)

Я не включил полную программу для экономии места, но, если это полезно, просто спросите, и я обновлю вопрос.

Ошибка (встроенная)

[1]    3086 segmentation fault  ./built

Я использую следующую команду для компиляции кода:

clang++ library/library.cpp out.ll -o built

Информация

Это работает:

std::cout << A[0] << std::endl; // 0x1

Это не:

std::cout << A[0][0] << std::endl;

1 Ответ

0 голосов
/ 25 мая 2018

Вы объявили вашу функцию с неверной подписью:

Сначала ваша функция возвращает указатель на double, а не массив double.Это довольно ясно увидеть, так как код C ++ буквально говорит double * в качестве возвращаемого типа.

Менее очевидная проблема состоит в том, что типом ваших аргументов является «указатель на массив двойных», а не «массивмассив для удвоения ".Это связано с тем, что C и C ++ не поддерживают функциональные параметры типов массивов, но решили, что довольно странно, по-прежнему принимать синтаксис для типов массивов в списках параметров, а просто обрабатывать его так, как если бы он объявил указатель.Так что double A[3][3] в списке параметров (и только там) - это просто более запутанный способ записи double (*A)[3].

Итак, в заключение ваше объявление должно быть:

declare double* @DOT([3 x double]*, [3 x double]*)

Соответственно,Вам также следует изменить код вызова на номер @DOT с указателями правильного типа.

...