在llvm pass中将Value *转换为PointerType时出错

时间:2014-10-27 07:01:02

标签: instrumentation llvm-ir

我尝试在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!"

有人能提供任何提示吗?

谢谢, 亨利

1 个答案:

答案 0 :(得分:1)

问题是VoidPtrType不属于IntegerType(相反,它是PointerType)。我相信你需要使用inttoptr强制转换来创建一个常量指针。

虽然,我不确定你的设计。你真的想在编译程序中使用指向LLVM操作数的指针吗?它只在编译时存在?