是否可以将llvm::FunctionType转换为C/C++原始函数指针

Possible convert a llvm::FunctionType to C/C++ raw function pointer?

本文关键字:C++ 原始 指针 函数 转换 llvm FunctionType 是否      更新时间:2023-10-16

我们可以将llvm::FunctionType的对象转换为C/C++风格的函数原始指针吗?

C/C++风格的函数原始指针示例:uint64_t (*funPtr)(uint64_t* args);

llvm::Function表示为一个抽象语法树。不能调用它,就像不能调用数组、列表或任何其他数据结构一样。

相反,您需要利用LLVM的ExecutionEngine功能来调用llvm::Functions。在内部,引擎会将其编译为本机可执行代码,并向该代码返回void*(我不记得API的详细信息,但类似的内容(。然后,您将能够将此指针强制转换为函数指针,并最终使用它来调用函数。

我不能100%确定llvm的功能,但n4659中的文本可能会有所帮助:

有条件地支持将函数指针转换为对象指针类型,反之亦然。这种转换的含义是由实现定义的,但如果实现支持双向转换,则将一种类型的prvalue转换为另一种类型并返回(可能具有不同的cv限定(将产生原始指针值。

我很确定函数指针与常规指针不同,因此这些转换是有问题的。我认为他们在这个堆栈溢出问题中详细讨论了这个问题。