You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LLVM中如何获取StoreInst指令操作对应的结构体名称?

解决方法

你当前拿到的存储地址是getelementptr指令返回的结构体成员指针,类型自然是成员对应的i32*,要获取所属结构体类型,需要回溯GEP指令的基址操作数:

  1. 首先判断StoreInst的指针操作数是否为GEP指令实例
  2. 提取GEP指令的基址指针,剥离指针类型后即可得到对应的结构体类型
  3. 适配多轮指针强转的场景,可以调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 07:24:01