Получить размер типа LLVM/типа разыменования

Этот вопрос очень похож на этот, но я не совсем уверен, как получить размер в следующей ситуации:

У меня есть тип указателя, например. i32*.

Теперь я хотел бы получить размер типа «указанный на», поэтому i32 (он же 4).

Прямо сейчас я использую следующий код, который, кажется, работает, но я не уверен, что он действительно правильный:

Value *get_size(Type *t, IRBuilder<>& irb)
{
    Value *sizePtr = irb.CreateGEP(t->getContainedType(0),
            irb.CreateIntToPtr(ConstantInt::get(irb.getInt8Ty(), 0), t),
            ConstantInt::get(irb.getInt8Ty(), 1));

    return irb.CreatePtrToInt(sizePtr, irb.getInt64Ty());
}

(примечание: тип t, который передается функции, всегда будет типом указателя)


person mame98    schedule 26.08.2019    source источник