【发布时间】:2015-11-25 00:18:14
【问题描述】:
我现在正在尝试使用 llvm。我想使用可以编译为 llvm 位码的语言来编写脚本。到目前为止,我已经设法加载了一个 llvm 位码模块并从我的“内部”c++ 代码中调用了一个在其中定义的函数。接下来我尝试将 c++ 函数从我的内部代码公开到 jit 代码 - 到目前为止,除了 SEGFAULT 之外,我没有得到任何东西。
我的代码如下。我试图在我的执行引擎中创建一个函数和一个全局映射,指向一个我想调用的函数。
extern "C" void externGuy()
{
cout << "I'm the extern guy" << endl;
}
void ExposeFunction()
{
std::vector<Type*> NoArgs(0);
FunctionType* FT = FunctionType::get(Type::getVoidTy(getGlobalContext()), NoArgs, false);
Function* fnc = Function::Create(FT, Function::ExternalLinkage, "externGuy", StartModule);
JIT->addGlobalMapping(fnc, (void*)externGuy);
}
// ... Create module, create execution engine
ExposeFunction();
是模块从bitcode文件加载后无法添加功能的问题吗?
更新: 我已经重构了我的代码,使它看起来像这样:
// ... Create module, create execution engine
std::vector<Type*> NoArgs(0);
FunctionType* FT = FunctionType::get(Type::getVoidTy(getGlobalContext()), NoArgs, false);
Function* fnc = Function::Create(FT, Function::ExternalLinkage, "externGuy", m);
fnc->dump();
JIT->addGlobalMapping(fnc, (void*)externGuy);
所以我得到的不是段错误:
Program used external function 'externGuy' which could not be resolved
此外,dump() 打印的结果:
declare void @externGuy1()
如果我将我的 c++ 脚本位代码更改为调用 externGuy1() 而不是 externGuy(),它会建议我使用 externGuy。 addGlobalMapping 似乎对我不起作用。我不确定我在这里缺少什么。我还在我的编译命令中添加了-fPIC,就像我在另一个问题中看到的那样 - 老实说,我不确定它是否有帮助,但尝试没有任何害处。
【问题讨论】:
标签: c++ function scripting llvm jit