【问题标题】:exposing internal c++ function to llvm jit'd c++将内部 c++ 函数暴露给 llvm jit'd c++
【发布时间】: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(),它会建议我使用 externGuyaddGlobalMapping 似乎对我不起作用。我不确定我在这里缺少什么。我还在我的编译命令中添加了-fPIC,就像我在另一个问题中看到的那样 - 老实说,我不确定它是否有帮助,但尝试没有任何害处。

【问题讨论】:

    标签: c++ function scripting llvm jit


    【解决方案1】:

    我终于让它工作了。我的怀疑是可能创建函数,以及在脚本中定义它导致函数名称的声明可能超过 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-21
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-08
      • 2015-10-26
      相关资源
      最近更新 更多