- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我想创建一个外部函数调用,这个函数正在获取参数作为 int
和 const char*
(特别是 BASICBLOCK NAME,而不是自定义字符串)(或 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 表示值。由于 Type 和 Value 属于不同的类层次结构,因此 llvm::Value *args[] 无法使用 llvm::Type 层次结构的子类进行初始化。你可能想要做的是改变
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 类型的指针。
关于c++ - LLVM : How to set a CreateCall argument to BasicBlock name?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54279398/
我正在尝试从 llvm 中间代码中删除未使用的 block 。 首先,我通过从入口 basicblock 开始并从它们的终止符指令添加所有 basicblock 后继者来构建可访问的 basicblo
我阅读了 LoopInfoBase(BlockT, LoopT) 上的llvm页面,并了解它包含所有顶级循环的信息。它还在类模板中定义了迭代器(和反向迭代器等)。 我不太了解迭代器正在迭代什么?例如,
我正在使用 LLVM 编写编译器前端。如果我创建一个 BasicBlock ,添加一些说明,最后设置插入点,一切正常。但是当我调用 SetInsertPoint然后添加一些这样的指令: Fun
获取 BasicBlock 的前辈的最简单方法是什么?在 LLVM 框架中? 我看过DepthFirstIterator和 idf_iterator ,但实际上我需要对控制流图进行广度优先搜索。 我觉
假设我有一个 llvm::Instruction* inst,如何获取指向其 basicblock 的指针?我在LLVM API中搜索并没有发现像inst.getBasicBlock()这样的接口(i
假设我有一个带标签的 BasicBlock,例如 entry。 现在,我想在此 BasicBlock 中插入一个“子”标签,而不会将 block 分成两部分。 在汇编中,它看起来像: entry: .
我想创建一个外部函数调用,这个函数正在获取参数作为 int 和 const char*(特别是 BASICBLOCK NAME,而不是自定义字符串)(或 std::string 可能没问题)。 但我不
我正在编写一个 LLVM pass,用于分析和修改生成的 IR 代码。有没有办法识别后边,我的意思是知道 BasicBlock 的后继者是否实际上在路径中的某个位置。 最佳答案 是的,有。 首先,请注
假设 IR 代码如下所示: define void @_Z1mbb(i1 zeroext %r, i1 zeroext %y) nounwind { entry: %r.addr = alloca
Does LLVM support for branch instructions with a variable BasicBlock target? 更具体地说,假设我将所有无条件 br 指令转换
我正在尝试通过这样做从 torchvision.models.resnet 导入类 BasicBlock from torchvision.models.resnet import * 它没有给出任何
我是一名优秀的程序员,十分优秀!