我尝试在LLVM IR中检测加载/存储指令并跟踪它们的内存地址,因此我需要插入检测功能来记录加载/存储指令的地址。
当我尝试创建recordLoad / Store函数时,我遇到了类型转换问题:
首先,我创建指针类型,“ VoidPtrType ”
Type Int64Type = IntegerType::getInt64Ty(M.getContext());
Type* VoidPtrType = PointerType::getUnqual(Int64Type);
然后,我为已检测的函数创建参数:
// ldstInst is a load/store instruction
Value* Args[] = {
ConstantInt::get(Int64Type, uint64_t(lsIDpass->getlsID(inst))),
ConstantInt::get(VoidPtrType, uint64_t(ldstInst->getPointerOperand())),
ConstantInt::get(Int64Type, uint64_t(DL->getTypeStoreSize(VTy)))
};
但是,当我运行程序时,我无法传递“ ConstantInt :: get(VoidPtrType,uint64_t(ldstInst-> getPointerOperand()))”,错误消息如下:
Assertion failed: isa<X>(Val) && "cast<Ty>() argument of incompatible type!"
有人能提供任何提示吗?
谢谢, 亨利
答案 0 :(得分:1)
问题是VoidPtrType
不属于IntegerType
(相反,它是PointerType
)。我相信你需要使用inttoptr
强制转换来创建一个常量指针。
虽然,我不确定你的设计。你真的想在编译程序中使用指向LLVM操作数的指针吗?它只在编译时存在?