LLVM:如何将 CreateCall 参数设置为 BasicBlock 名称?
LLVM : How to set a CreateCall argument to BasicBlock name?
我想创建一个外部函数调用,这个函数正在获取参数 int
和 const char*
(特别是 BASICBLOCK 名称,而不是自定义字符串)(或者 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)};
有什么方法可以解决这个错误,或者有没有更好的方法将函数参数设置为basicblock name???
LLVM 中的类型和值不同。 llvm::Type 表示类型,llvm::Value 表示值。由于类型和值属于不同的 class 层次结构,因此 llvm::Value *args[] 无法使用 llvm::Type 层次结构的子 class 进行初始化。您可能想要做的是改变
Value *args[] = {builder.getInt32(index), builder.getInt8PtrTy(*strVal)};
至
llvm::Value *strVal = builder.CreateGlobalStringPtr(str.c_str());
llvm::Value *args[] = {builder.getInt32(index), strVal};
CreateGlobalStringPtr() 将创建一个全局字符串和 return Int8PtrTy 类型的指针。
我想创建一个外部函数调用,这个函数正在获取参数 int
和 const char*
(特别是 BASICBLOCK 名称,而不是自定义字符串)(或者 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)};
有什么方法可以解决这个错误,或者有没有更好的方法将函数参数设置为basicblock name???
LLVM 中的类型和值不同。 llvm::Type 表示类型,llvm::Value 表示值。由于类型和值属于不同的 class 层次结构,因此 llvm::Value *args[] 无法使用 llvm::Type 层次结构的子 class 进行初始化。您可能想要做的是改变
Value *args[] = {builder.getInt32(index), builder.getInt8PtrTy(*strVal)};
至
llvm::Value *strVal = builder.CreateGlobalStringPtr(str.c_str());
llvm::Value *args[] = {builder.getInt32(index), strVal};
CreateGlobalStringPtr() 将创建一个全局字符串和 return Int8PtrTy 类型的指针。