如何用LLVM做c语言程序,使用LLVM JIT代码对程序进行编码以调用C代码

我的项目有一个C库,我希望允许用户通过某种编程语言使用JIT来调用所述库中的函数.为简单起见,假设库具有以下类:

class item {

public:

item();

item( int );

~item();

// ...

};

class item_iterator {

public:

virtual ~item_iterator();

virtual bool next( item *result ) = 0;

};

class singleton_iterator : public item_iterator {

public:

singleton_iterator( item const &i );

// ...

};

我知道LLVM对C一无所知,调用C函数的一种方法是将它们包装在C thunk中:

extern "C" {

void thunk_item_M_new( item *addr ) {

new( addr ) item;

}

void thunk_singleton_iterator_M_new( singleton_iterator *addr, item *i ) {

new( addr ) singleton_iterator( *i );

}

bool thunk_iterator_M_next( item_iterator *that, item *result ) {

return that->next( result );

}

} // extern "C"

第一个问题是如何从LLVM分配项目.我知道如何创建StructTypes并为它们添加字段,但我不想要与C类布局并行 – 这很乏味且容易出错.

我得到的想法只是添加一个char [sizeof(T)]作为C类类型的StructType的唯一字段:

StructType *const llvm_item_type = StructType::create( llvm_ctx, "item" );

vector llvm_struct_types;

llvm_struct_types.push_back( ArrayType::get( IntegerType::get( llvm_ctx, 8 ), sizeof( item ) ) );

llvm_item_type->setBody( llvm_struct_types, false );

PointerType *const llvm_item_ptr_type = PointerType::getUnqual( llvm_item_type );

我认为,因为它是一个StructType,对齐方式是正确的,sizeof(item)的大小是正确的.那会有用吗?有没有更好的办法?

第二个问题是,与C类层次结构不同,StructType之间没有继承关系.如果我创建一个接受llvm_iterator_type但尝试使用llvm_singleton_iterator_type构建Function对象的Function,则LLVM verifyModule()函数会向我抱怨:

调用参数类型与函数签名不匹配!

那么我以为我只是在任何地方使用void *:

Type *const llvm_void_type = Type::getVoidTy( llvm_ctx );

PointerType *const llvm_void_ptr_type = PointerType::getUnqual( llvm_void_type );

但是,verifyModule()仍然向我抱怨,因为显然,LLVM中没有自动转换为void *类型.我怎么解决这个问题?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值