[BitcodeReader] Support GEP without indices

LLVM considers these to be legal, so make sure the bitcode reader
can read them. I broke this when implementing opaque pointer
auto upgrade support.
This commit is contained in:
Nikita Popov
2022-03-10 15:47:58 +01:00
parent 21a97a2ac1
commit 22f9159bed
2 changed files with 21 additions and 11 deletions

View File

@@ -4456,18 +4456,20 @@ Error BitcodeReader::parseFunctionBody(Function *F) {
I = GetElementPtrInst::Create(Ty, BasePtr, GEPIdx);
ResTypeID = TyID;
auto GTI = std::next(gep_type_begin(I));
for (Value *Idx : drop_begin(cast<GEPOperator>(I)->indices())) {
unsigned SubType = 0;
if (GTI.isStruct()) {
ConstantInt *IdxC =
Idx->getType()->isVectorTy()
? cast<ConstantInt>(cast<Constant>(Idx)->getSplatValue())
: cast<ConstantInt>(Idx);
SubType = IdxC->getZExtValue();
if (cast<GEPOperator>(I)->getNumIndices() != 0) {
auto GTI = std::next(gep_type_begin(I));
for (Value *Idx : drop_begin(cast<GEPOperator>(I)->indices())) {
unsigned SubType = 0;
if (GTI.isStruct()) {
ConstantInt *IdxC =
Idx->getType()->isVectorTy()
? cast<ConstantInt>(cast<Constant>(Idx)->getSplatValue())
: cast<ConstantInt>(Idx);
SubType = IdxC->getZExtValue();
}
ResTypeID = getContainedTypeID(ResTypeID, SubType);
++GTI;
}
ResTypeID = getContainedTypeID(ResTypeID, SubType);
++GTI;
}
// At this point ResTypeID is the result element type. We need a pointer