2017-01-31 3 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. Если у вас есть ручка на LLVMContext вы можете сравнить указатель типа аргумента к встроенным 8-битным Int указателя:

... //using namespace llvm 
if (PointerType *PT = dyn_cast<PointerType>(arg.getType())) 
    if (PT == Type::getInt8PtrTy(ctx, PT->getPointerAddressSpace())) 
     // do stuff 
... 

.

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 
     } 
    } 
Смежные вопросы