llvm:Typeがi8*
であるかどうかを判断する方法?私は関数F
の引数を反復し、引数の型がi8*
かどうかを調べたいとします。llvm:Typeがi8 *タイプであるかどうかを判断する方法?
for(auto& arg : F.getArgumentList()) {
arg.getType()->???
}
llvm:Typeがi8*
であるかどうかを判断する方法?私は関数F
の引数を反復し、引数の型がi8*
かどうかを調べたいとします。llvm:Typeがi8 *タイプであるかどうかを判断する方法?
for(auto& arg : F.getArgumentList()) {
arg.getType()->???
}
コンパクトな方法がllvm::dyn_cast
を実行することです:
... // using namespace llvm
if (PointerType *PT = dyn_cast<PointerType>(arg.getType()))
if (IntegerType *IT = dyn_cast<IntegerType>(PT->getPointerElementType()))
if (IT->getBitWidth() == 8)
// do stuff
...
。識別されていないタイプの構造体は、LLVM IRで構造的に一意であることに注意してください。
... //using namespace llvm
if (PointerType *PT = dyn_cast<PointerType>(arg.getType()))
if (PT == Type::getInt8PtrTy(ctx, PT->getPointerAddressSpace()))
// do stuff
...
:あなたはLLVMContext
のハンドルを持っている場合は、内蔵の8ビットのint型のポインタへの引数の型のポインタを比較することができます。
llvm :: isaを使用するか、llvm :: castなどの高レベルキャストを使用できます。
そうしないと、あなただけの昔ながらのC++を行うことができます。[テストされていません]
void Test(llvm::Function* f) {
for (auto& arg : f->getArgumentList()) {
llvm::Type* t = arg.getType();
if (t->isPointerTy()) {
llvm::Type* inner = t->getPointerElementType();
if (inner->isIntegerTy()) {
llvm::IntegerType* it = (llvm::IntegerType*) inner;
if (it->getBitWidth() == 8) {
// i8* --> do something
}
// another int pointer (int32* for example)
}
// another pointer type
}
// not pointer type
}
}