gpt4 book ai didi

c++ - 将内部 c++ 函数暴露给 llvm jit'd c++

转载 作者:太空宇宙 更新时间:2023-11-04 11:29:56 27 4
gpt4 key购买 nike

我现在正在尝试使用 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 ,就像我在另一个问题中看到的那样 - 老实说,我不确定它是否有帮助,但尝试没有坏处。

最佳答案

我终于让它工作了。我怀疑创建函数以及在脚本中定义它可能会导致函数名称的声明不止 1 个,而映射只是无法正常工作。我所做的是在脚本中定义函数,然后使用 getFunction 来代替映射。在函数输出上使用 dump() 方法:

declare void @externGuy() #1

这就是为什么我认为这与映射最初不起作用有关。我还记得 Kaleidoscope 教程说 getPointerToFunction 会在调用时执行 JIT 编译(如果尚未完成),所以我认为我必须在此调用之前进行映射。

所以总的来说,为了让这一切正常工作,它如下:

// Get the function and map it
Function* extrn = m->getFunction("externGuy");
extrn->dump();
JIT->addGlobalMapping(extrn, (void*)&::externGuy);
// Get a pointer to the jit compiled function
Function* mane = m->getFunction("hello");
void* fptr = JIT->getPointerToFunction(mane);
// Make a call to the jit compiled function which contains a call to externGuy
void (*FP)() = (void(*)())(intptr_t)fptr;
FP();

关于c++ - 将内部 c++ 函数暴露给 llvm jit'd c++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25172258/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com