我如何尝试将 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).
我有一个 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).