gpt4 book ai didi

c++ - LLVM 自动 C++ 链接

转载 作者:可可西里 更新时间:2023-11-01 16:30:37 26 4
gpt4 key购买 nike

在一些 LLVM 教程中,我看到可以相当容易地将 C 函数绑定(bind)到基于 LLVM 的自定义语言中。 LLVM 为程序员提供了一个指向函数的指针,然后可以将其与 LLVM 生成的代码混合。

使用 C++ 库执行此操作的最佳方法是什么。假设我有一个相当复杂的库,如 Qt 或 Boost,我想将其绑定(bind)到我的自定义语言。我是否需要创建 stub 库(如 Python 或 Lua 需要),或者 LLVM 是否提供某种外部函数接口(interface) (FFI)?

最佳答案

在我的 LLVM 代码中,我为此创建了 extern "C" 包装函数,并将 LLVM 函数声明插入到模块中以便调用它们。然后,让 LLVM 了解函数的一个好方法是不要让它使用 dlopen 并在执行二进制文件中搜索函数名称(这很麻烦,因为函数名称需要位于 .dynsym 部分,它也很慢),但要手动进行映射,使用 ExecutionEngine::addGlobalMapping .

只需获取该声明的 llvm::Function* 和 C++ 中由 &functionname 转换为 void* 的函数地址> 并将这两件事传递给 LLVM。执行您的东西的 JIT 将知道在哪里可以找到该函数。

例如,如果你想包装QString,你可以创建几个函数来创建、销毁和调用此类对象的函数

extern "C" void createQString(void *p, char const*v) {
new (p) QString(v); // placement-new
}

extern "C" int32_t countQString(void *p) {
QString *q = static_cast<QString*>(p);
return q->count();
}

extern "C" void destroyQString(void *p) {
QString *q = static_cast<QString*>(p);
q->~QString();
}

并创建适当的声明和映射。然后你可以调用这些函数,传递一个为QString(可能是alloca'ed)和一个适当对齐和大小的内存区域i8* 指向初始化的C字符串数据。

关于c++ - LLVM 自动 C++ 链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3551733/

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