LLVM中如何获取StoreInst指令操作对应的结构体名称?
解决方法
你当前拿到的存储地址是getelementptr指令返回的结构体成员指针,类型自然是成员对应的i32*,要获取所属结构体类型,需要回溯GEP指令的基址操作数:
- 首先判断StoreInst的指针操作数是否为GEP指令实例
- 提取GEP指令的基址指针,剥离指针类型后即可得到对应的结构体类型
- 适配多轮指针强转的场景,可以调用
stripPointerCasts()消除冗余的bitcast/addrspacecast等指令干扰
修改后的参考代码如下:
for(BasicBlock &B : F) { for(Instruction &I : B) { StoreInst * store = nullptr; builder->SetInsertPoint(&I); if((store = dyn_cast<StoreInst>(&I)) != nullptr) { Value * address = store->getPointerOperand(); // 回溯GEP指令,同时消除指针强转干扰 if (auto *gep = dyn_cast<GetElementPtrInst>(address->stripPointerCasts())) { // 取GEP的基址类型,剥离一层指针得到结构体类型 Type *basePtrType = gep->getPointerOperand()->getType(); if (auto *structType = dyn_cast<StructType>(basePtrType->getPointerElementType())) { if (structType->getStructName() == "struct._Datatype") { // 匹配到目标结构体,执行你的逻辑 } } } } } }
补充说明
- 如果需要监控所有对该结构体的访问,包括直接取结构体指针强转后访问的场景,你可以额外判断指针操作数
stripPointerCasts()后的类型是否直接为目标结构体指针类型,覆盖非GEP直接访问的场景 - LLVM 12+版本中
getPointerElementType()被标记为废弃,你可以改用getPointeeType()方法获取指针指向的类型
内容的提问来源于stack exchange,提问作者Ahriy
相关产品推荐
相关产品推荐

