Метод isPointerTy
не различает guish между разными типами, он просто сообщает true
или false
, является ли тип указателем.
Один из способов решить вашу проблема заключается в том, чтобы изучить его базовый тип, указатель тип (тип, на который указывает указатель).
Вот как вы можете это сделать:
Type *returnType = CI->getCalledFunction()->getReturnType();
if (PointerType *pointerType = dyn_cast<PointerType>(returnType)) {
llvm::Type *pointeeType = pointerType->getElementType();
/// the pointee type now holds one of i8, i16, i32, or i64
if (IntegerType *intType = dyn_cast<IntegerType>(pointeeType)) {
outs() << intType->getBitWidth() << "\n";
}
}
Второй строка пытается преобразовать общий Type *
в более специальный PointerType *
. dyn_cast
возвращает либо действительный указатель, либо nullptr
, если returnType
не является PointerType
.
Затем вы получаете доступ к типу указателя (через getElementType
) и можете делать дальнейшие проверки. В вашем примере все базовые типы - IntegerType
s, способ отличить guish их - проверить их битовую ширину.
Думаю, это должно помочь :)