gpt4 book ai didi

c++ - 使用 LLVM JIT 代码对程序进行编码以调用 C++ 代码

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:47:45 26 4
gpt4 key购买 nike

我的项目有一个 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 分配一个 item。我知道如何创建 StructType 并向它们添加字段,但我不想并行使用 C++ 类布局——那既乏味又容易出错。

我的想法是简单地将 char[sizeof(T)] 添加为 C++ 类类型的 StructType 的唯一字段:

StructType *const llvm_item_type = StructType::create( llvm_ctx, "item" );
vector<Type*> 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_typeFunction 但尝试使用 llvm_singleton_iterator_type 构建一个 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* 类型。我该如何解决这个问题?

最佳答案

事实证明,使用 char[sizeof(T)] 是一种使 StructType 成为正确大小的合理方法——至少有其他人来自LLVM 邮件列表就是这样做的。

至于“调用参数类型与函数签名不匹配!”错误,一个解决方案就是让所有 thunk 使用 void* 并在内部使用 static_cast。将参数传递给 thunk 时,使用 CreateBitCast() IRBuilder 函数(因为 casts-tovoid 在 LLVM 中不是自动的)。

关于c++ - 使用 LLVM JIT 代码对程序进行编码以调用 C++ 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9712346/

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