Compiler construction 分段错误-访问从LLVM IR代码传递的数组元素 我有一个程序,当我用C++运行时,它工作得很好,但是,当我从LLVM IR代码中调用它时,它就不起作用。 函数(library/library.cpp)

Compiler construction 分段错误-访问从LLVM IR代码传递的数组元素 我有一个程序,当我用C++运行时,它工作得很好,但是,当我从LLVM IR代码中调用它时,它就不起作用。 函数(library/library.cpp),compiler-construction,llvm,clang++,llvm-ir,Compiler Construction,Llvm,Clang++,Llvm Ir,我没有包括完整的程序,以节省空间,但如果它是有用的只是问,我会更新的问题 错误(内置) 我使用以下命令编译代码: clang++ library/library.cpp out.ll -o built 信息 这项工作: std::cout << A[0] << std::endl; // 0x1 std::cout您用错误的签名声明了您的函数: 首先,函数返回指向double的指针,而不是double数组。这是很明显的,因为C++代码从字面上说“代码>双*作为返回类型

我没有包括完整的程序,以节省空间,但如果它是有用的只是问,我会更新的问题

错误(内置) 我使用以下命令编译代码:

clang++ library/library.cpp out.ll -o built
信息 这项工作:

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

std::cout您用错误的签名声明了您的函数:

首先,函数返回指向double的指针,而不是double数组。这是很明显的,因为C++代码从字面上说“代码>双*<代码>作为返回类型。

不太明显的问题是,参数的类型是“指向双精度数组的指针”,而不是“指向双精度数组的数组”。这是因为C和C++不支持数组类型的函数参数,但很难确定,仍然接受参数列表中数组类型的语法,而只是将其视为声明指针。因此,在参数列表中(并且仅在那里)使用
double A[3][3]
编写
double(*A)[3]
是一种更容易混淆的方法

因此,总而言之,您的声明应该是:

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

因此,您还应该将调用代码更改为使用正确类型的指针调用
@DOT

谢谢,这非常有用。使用LLVM获取指向数组double的指针和数组double的指针的最佳方法是什么?@pudibility
getelementptr
带有两个零(假设您实际上从指向数组数组的指针开始,如果它在变量中,您会这样做)。谢谢,我将尝试:)
clang++ library/library.cpp out.ll -o built
std::cout << A[0] << std::endl; // 0x1
std::cout << A[0][0] << std::endl;
declare double* @DOT([3 x double]*, [3 x double]*)