В LLVM есть llvm::dyn_cast<T>
, который будет использовать внутренние конструкции LLVM для динамического приведения из одного типа в другой, если они действительно являются допустимыми приведениями - если вы используете неправильный тип T
, он вернетnullptr
.
Так что-то вроде:
llvm::Value *v = ... some code here ...
...
llvm::LoadInst* li = llvm::dyn_cast<llvm::LoadInst>(v);
if (!li) { ... not a LoadInst, do whatever you should do here ... }
else { ... use li ... }
Естественно, если вы уже ДЕЙСТВИТЕЛЬНО знаете, что v
- это LoadInst
, вам не нужно проверять - ноassert(li && "Expected a LoadInst");
поймает, если вы когда-нибудь ошиблись.
Обратите внимание, что вы не используете T*
для llvm::dyn_cast<T>
, как вы бы использовали для стандарта C +++ dynamic_cast
.
Этот комментарий в коде для llvm::Value
объясняет, что по этой причине не существует vtable (http://www.llvm.org/doxygen/Value_8h_source.html#l00207)
/// Value's destructor should be virtual by design, but that would require
/// that Value and all of its subclasses have a vtable that effectively
/// duplicates the information in the value ID. As a size optimization, the
/// destructor has been protected, and the caller should manually call
/// deleteValue.
~Value(); // Use deleteValue() to delete a generic Value.