c++ - 如何检查迭代器的相等性?

标签 c++ llvm intermediate-code

在我的 llvm 代码中,我尝试使用以下代码检查迭代器 InsertPos 是否指向基本 block 的最后一条指令。

  BasicBlock::iterator InsertPos = BB->begin();
  LLVMContext &Context = BB->getContext();

  while ( !( isa<CallInst>(InsertPos) || 
      ( InsertPos == BB->getTerminator() ) ) ) // <-- Error here
    ++InsertPos;

但是,clang 给了我以下错误。

Basic2.cpp:82:54: error: use of overloaded operator '==' is ambiguous (with operand types 'BasicBlock::iterator' (aka 'ilist_iterator<llvm::Instruction>')
      and 'llvm::TerminatorInst *')
  while ( !( isa<CallInst>(InsertPos) || ( InsertPos == BB->getTerminator() ) ) ) 
                                           ~~~~~~~~~ ^  ~~~~~~~~~~~~~~~~~~~
/home/hmushtaq/llvm/include/llvm/ADT/ilist.h:204:8: note: candidate function
  bool operator==(const ilist_iterator &RHS) const {
       ^
Basic2.cpp:82:54: note: built-in candidate operator==(class llvm::Instruction *, class llvm::Instruction *)
  while ( !( isa<CallInst>(InsertPos) || ( InsertPos == BB->getTerminator() ) ) ) 
                                                     ^
    Basic2.cpp:82:54: note: built-in candidate operator==(restrict class llvm::Instruction    *, restrict class llvm::Instruction *)
    Basic2.cpp:82:54: note: built-in candidate operator==(const restrict class llvm::Instruction *, const restrict class llvm::Instruction *)
    Basic2.cpp:82:54: note: built-in candidate operator==(volatile class llvm::Instruction *, volatile class llvm::Instruction *)
    Basic2.cpp:82:54: note: built-in candidate operator==(const volatile class llvm::Instruction *, const volatile class llvm::Instruction *)
    Basic2.cpp:82:54: note: built-in candidate operator==(volatile restrict class llvm::Instruction *, volatile restrict class llvm::Instruction *)
    Basic2.cpp:82:54: note: built-in candidate operator==(const class llvm::Instruction *, const class llvm::Instruction *)
    Basic2.cpp:82:54: note: built-in candidate operator==(const volatile restrict class llvm::Instruction *, const volatile restrict class llvm::Instruction *)

这样做的正确方法是什么?

最佳答案

BB->getTerminator() 返回一个指针 (TerminatorInst *),而 InsertPos 是一个迭代器 (BasicBlock::迭代器)。类型不匹配。

也许你可以尝试

&*InsertPos == BB->getTerminator()

您还可以使用the isTerminator() method检查指令是否是终止符。 .

InsertPos->isTerminator()

关于c++ - 如何检查迭代器的相等性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9431649/

相关文章:

C++ 将字符串转换为 time_t

c++ - 在 C++ 11 中使用 Homebrew 软件、gcc 和 llvm

language-agnostic - 回补是什么意思?

选择中间语言

c++ - 将只有一个类的实现文件(cpp文件)分离到单独的文件中

c++ - 为什么 "non-standard syntax; use ' &' to create a pointer to member"在 CTOR 中使用线程?

c++ - 在 C++ 中创建 "template"对象的机制

c++ - [错误]未分配正在释放的指针

windows - 如何在 Windows 中运行 llvm pass?

c - 插入 getelementptr 指令