diff --git a/lib/Bytecode/Reader/InstructionReader.cpp b/lib/Bytecode/Reader/InstructionReader.cpp index 47d9e820e27..b498ac90c1a 100644 --- a/lib/Bytecode/Reader/InstructionReader.cpp +++ b/lib/Bytecode/Reader/InstructionReader.cpp @@ -350,8 +350,7 @@ bool BytecodeParser::ParseInstruction(const uchar *&Buf, const uchar *EndBuf, case Instruction::GetElementPtr: { vector Idx; if (!isa(Raw.Ty)) return failure(true); - const CompositeType *TopTy = - dyn_cast(cast(Raw.Ty)->getElementType()); + const CompositeType *TopTy = dyn_cast(Raw.Ty); switch (Raw.NumOperands) { case 0: cerr << "Invalid load encountered!\n"; return failure(true); @@ -366,7 +365,7 @@ bool BytecodeParser::ParseInstruction(const uchar *&Buf, const uchar *EndBuf, Idx.push_back(V = getValue(TopTy->getIndexType(), Raw.Arg2)); if (!V) return failure(true); - const Type *ETy = MemAccessInst::getIndexedType(Raw.Ty, Idx, true); + const Type *ETy = MemAccessInst::getIndexedType(TopTy, Idx, true); const CompositeType *ElTy = dyn_cast_or_null(ETy); if (!ElTy) return failure(true); @@ -404,8 +403,7 @@ bool BytecodeParser::ParseInstruction(const uchar *&Buf, const uchar *EndBuf, case Instruction::Store: { vector Idx; if (!isa(Raw.Ty)) return failure(true); - const CompositeType *TopTy = - dyn_cast(cast(Raw.Ty)->getElementType()); + const CompositeType *TopTy = dyn_cast(Raw.Ty); switch (Raw.NumOperands) { case 0: @@ -418,13 +416,18 @@ bool BytecodeParser::ParseInstruction(const uchar *&Buf, const uchar *EndBuf, break; default: vector &args = *Raw.VarArgs; - for (unsigned i = 0, E = args.size(); i != E; ++i) { - const Type *ETy = MemAccessInst::getIndexedType(Raw.Ty, Idx, true); - const CompositeType *ElTy = dyn_cast_or_null(ETy); - if (!ElTy) return failure(true); + const CompositeType *ElTy = TopTy; + unsigned i, E; + for (i = 0, E = args.size(); ElTy && i != E; ++i) { Idx.push_back(V = getValue(ElTy->getIndexType(), args[i])); if (!V) return failure(true); + + const Type *ETy = MemAccessInst::getIndexedType(Raw.Ty, Idx, true); + ElTy = dyn_cast_or_null(ETy); } + if (i != E) + return failure(true); // didn't use up all of the indices! + delete Raw.VarArgs; break; }