我想创建一个外部函数调用,并且该函数正在获取int
和const char*
(特别是基本块名称,而不是自定义字符串)作为参数(或使用std::string
也可以)。
但是我不知道将函数参数设置为const char*
还是std::string
。我唯一意识到的是 string 在LLVM中被视为Int8PtrTy
。
LLVMContext &ctx = F->getContext();
Constant *countfunc = F->getParent()->getOrInsertFunction(
"bbexectr", Type::getVoidTy(ctx), Type::getInt32Ty(ctx), Type::getInt8PtrTy(ctx));
for (Function::iterator ibb = ifn->begin(); ibb != ifn->end(); ++ibb)
{
BasicBlock *B = &*ibb;
IRBuilder<> builder(B);
builder.SetInsertPoint(B->getTerminator());
std::string str = B->getName().str();
const char* strVal = str.c_str();
Value *args[] = {builder.getInt32(index), builder.getInt8PtrTy(*strVal)};
builder.CreateCall(countfunc, args);
我尝试了上层代码,但它给了我如下错误消息。
error: cannot convert ‘llvm::PointerType*’ to ‘llvm::Value*’ in initialization
Value *args[] = {builder.getInt32(index), builder.getInt8PtrTy(*strVal)};
有什么办法可以解决该错误,还是有更好的方法将函数参数设置为基本块名称?
答案 0 :(得分:3)
LLVM中的类型和值不同。 llvm :: Type代表类型,而llvm :: Value代表值。由于Type和Value属于不同的类层次结构,因此无法使用llvm :: Type层次结构的子类来初始化llvm :: Value * args []。您可能想做的就是更改
Value *args[] = {builder.getInt32(index), builder.getInt8PtrTy(*strVal)};
收件人
llvm::Value *strVal = builder.CreateGlobalStringPtr(str.c_str());
llvm::Value *args[] = {builder.getInt32(index), strVal};
CreateGlobalStringPtr()将创建一个全局字符串,并返回一个Int8PtrTy类型的指针。