我如何尝试将 Value* 转换为子类?

How do I try to cast a Value* to a subclass?

我有一个 Value* 列表,我知道其中一些是 PHINode*。

我可以 dynamic_cast<PHINode*>(value) 并检查它是否转换为 PHINode*,但我依稀记得有更好的方法。

看了很多遍,这两个问题间接回答了我的问题

  • How is LLVM isa<> implemented?
  • Value* to Instruction*/LoadInst* casting

llvm 显然有一个内置的类型检查系统。有参考页 here。它是这样工作的

if(isa<PHINode>(value)){
    PHINode* phi = cast<PHINode>(value);
}
if(PHINode* phi = dyn_cast<PHINode>(value)){//alternatively
    ...
}

而且您似乎不需要指定它是一个指针,所以它不是 isa<PHINode*>

最后,事实证明,dynamic_cast 将无法工作,因为他们实现了自己的 RTTI

The LLVM source-base makes extensive use of a custom form of RTTI. These templates have many similarities to the C++ dynamic_cast<> operator, but they don’t have some drawbacks (primarily stemming from the fact that dynamic_cast<> only works on classes that have a v-table).