在一些LLVM教程中,我看到将C函数绑定到基于LLVM的自定义语言相当容易.LLVM向程序员提供指向该函数的指针,然后该函数可以与LLVM生成的代码混合在一起.
用C++库执行此操作的最佳方法是什么.假设我有一个相当复杂的库,比如Qt或Boost,我想绑定到我的自定义语言.我是否需要创建存根库(如Python或Lua要求),或者LLVM是否提供某种外部函数接口(FFI)?
Joh*_*itb 13
在我的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();
}
Run Code Online (Sandbox Code Playgroud)
并创建适当的声明和映射.然后你可以使用call这些函数,传递一个适当的对齐和大小的内存区域QString(可能是alloca'ed)和i8*指向C字符串数据进行初始化.
| 归档时间: |
|
| 查看次数: |
1917 次 |
| 最近记录: |