c++ 如何修复:LLVM llc错误:Assert'瓦尔&&“伊萨〈>用于空指针”'失败

68de4m5k  于 2022-11-19  发布在  其他
关注(0)|答案(1)|浏览(91)

我 正在 基于 LLVM 7.0.0 的 项目 上 工作 , 我 将 llvm 版本 从 3.5 转移 到 7.0.0 , 我 已经 构建 了 项目 , 并且 没有 问题 , 但是 当 我 在 一 个 . bc 文件 上 运行 llc 时 , 这里 的 bug 让 我 困惑 , 我 在 互联 网 上 找到 了 所有 的 东西 , 但 没有 解决 方案 , 这里 是 堆栈 转储 消息 :
第 106 章 : 我 的 天 , 我 的 地 , 我 的 天 !在 这个 例子 中 , 我们 使用 了 一 个 静态 的 bool 函数 , 它 是 一 个 bool 类型 的 函数 , 它 是 一 个 bool 类型 的 函数 。从 = llvm : : 复合 类型 ] :Assert ' Val & & " isa 〈 〉 用于 空 指针 " ' 失败 。
此处 代码 中 存在 错误 :
第 一 个
然后 , 当 我 调试 程序 时 , 发现 以下 消息 :
获取 元素 指针 类型 迭代 器 . h :

// FIXME: Make this the iterator's operator*() after the 4.0 release.
   // operator*() had a different meaning in earlier releases, so we're
   // temporarily not giving this iterator an operator*() to avoid a subtle
   // semantics break.
   Type *getIndexedType() const {
     if (auto *T = CurTy.dyn_cast<Type *>())
       return T;
     return CurTy.get<StructType *>()->getTypeAtIndex(getOperand());
   }
  
   Value *getOperand() const { return const_cast<Value *>(&**OpIt); }
  
   generic_gep_type_iterator &operator++() { // Preincrement
     Type *Ty = getIndexedType();
     if (auto *ATy = dyn_cast<ArrayType>(Ty))
       CurTy = ATy->getElementType();
     else if (auto *VTy = dyn_cast<VectorType>(Ty))
       CurTy = VTy->getElementType();
     else
       CurTy = dyn_cast<StructType>(Ty);
     ++OpIt;
     return *this;
   }
  
   generic_gep_type_iterator operator++(int) { // Postincrement
     generic_gep_type_iterator tmp = *this;
     ++*this;
     return tmp;
   }

格式
"//修复 :在 4.0 版本 之后 , 使 此 为 迭代 器 的 operator * ( ) 。 " , 我 对 该 消息 希望 让 我 做 什么 感到 困惑 , 我 需要 在 该 位置 添加 或 修复 任何 内容 , 以便 有助于 修复 堆栈 转储 。
任何 建议 将 不胜 感激 , 非常 感谢 !

yhuiod9q

yhuiod9q1#

您正在:

if (auto *STy = dyn_cast<SequentialType>(Ty)) {
        CurTy = STy->getElementType();
        NumElements = STy->getNumElements();
      } else
        CurTy = dyn_cast<StructType>(Ty);

因此,如果dyn_cast失败,那么CurTy可能是nullptr,在下一个getIndexedType()上,您将获得Assert。

相关问题