基于Kaleidoscope和Kaleidoscope with MCJIT教程,我有代码来创建模块和函数,并使用MCJIT调用它。该函数需要原型:
auto ft = llvm::FunctionType::get(llvm::Type::getInt32Ty(Context), argTypes, false);
但是,该示例仅涵盖Double作为参数和返回值(上面使用int)。要做任何高级的事情,你需要传递类和容器之类的东西。
如何在模块中使用现有的C ++类?
当然,您可以链接到您想要的任何库,但是您需要声明函数原型才能使用它们。如果库API有类,你如何声明它们?
我想要的是这样的:
auto ft = llvm::FunctionType::get(llvm::Type::getStructTy("class.std::string"), argTypes, false);
其中class.std :: string已从string.h导入。
LLVM API仅具有基本类型。您可以定义结构来表示类,但这很难手动(而不是可移植)。
一种方法可能是将类编译为bitcode并将其读入模块,但我想尽可能避免使用临时文件。此外,我不知道如何从模块中提取类型,但它应该是可能的。我在我的一个类的头文件上尝试了这个(我将头文件重命名为cpp文件,否则clang会生成.gch预编译头)并且结果只是一个常量......也许它被优化了?我在cpp文件上尝试了它,它产生了36000行代码......
然后我找到了this page。我应该使用Clang API而不是使用LLVM API,因为作为编译器,Clang可以将代码编译到模块中。然后我可以将LLVM API与导入的模块一起使用。这是正确的方法吗?任何工作源代码都受到赞赏,因为它只需要让函数调用工作(教程已经过时且文档很少)。