如何确定llvm:Type是否为i8 *类型?

时间:2017-01-31 08:38:43

标签: llvm llvm-ir

如何确定llvm:Type是否为i8*类型?我遍历函数F的参数,并想确定参数是否为i8*类型。

for(auto& arg : F.getArgumentList()) {
    arg.getType()->???

}

2 个答案:

答案 0 :(得分: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
        }
    }

答案 1 :(得分: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
...