2017-01-31 15 views

答えて

1

コンパクトな方法が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型のポインタへの引数の型のポインタを比較することができます。

1

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 
     } 
    } 
関連する問題