From b2b12b4a627761a409dd312076a0310777a96eb8 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 26 Nov 2001 16:54:55 +0000 Subject: [PATCH] Implement array indexing git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1337 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Bytecode/Reader/InstructionReader.cpp | 73 +++++++++++++++-------- 1 file changed, 47 insertions(+), 26 deletions(-) diff --git a/lib/Bytecode/Reader/InstructionReader.cpp b/lib/Bytecode/Reader/InstructionReader.cpp index d3b2bb0d091..c59d147c240 100644 --- a/lib/Bytecode/Reader/InstructionReader.cpp +++ b/lib/Bytecode/Reader/InstructionReader.cpp @@ -348,30 +348,44 @@ bool BytecodeParser::ParseInstruction(const uchar *&Buf, const uchar *EndBuf, case Instruction::Load: case Instruction::GetElementPtr: { - vector Idx; + vector Idx; + if (!isa(Raw.Ty)) return failure(true); + const CompositeType *TopTy = + dyn_cast(cast(Raw.Ty)->getValueType()); + switch (Raw.NumOperands) { case 0: cerr << "Invalid load encountered!\n"; return failure(true); case 1: break; - case 2: V = getValue(Type::UByteTy, Raw.Arg2); - if (!isa(V)) return failure(true); - Idx.push_back(cast(V)); - break; - case 3: V = getValue(Type::UByteTy, Raw.Arg2); - if (!isa(V)) return failure(true); - Idx.push_back(cast(V)); - V = getValue(Type::UByteTy, Raw.Arg3); - if (!isa(V)) return failure(true); - Idx.push_back(cast(V)); - break; + case 2: + if (!TopTy) return failure(true); + Idx.push_back(V = getValue(TopTy->getIndexType(), Raw.Arg2)); + if (!V) return failure(true); + break; + case 3: { + if (!TopTy) return failure(true); + Idx.push_back(V = getValue(TopTy->getIndexType(), Raw.Arg2)); + if (!V) return failure(true); + + const Type *ETy = MemAccessInst::getIndexedType(Raw.Ty, Idx, true); + const CompositeType *ElTy = dyn_cast_or_null(ETy); + if (!ElTy) return failure(true); + + Idx.push_back(V = getValue(ElTy->getIndexType(), Raw.Arg3)); + if (!V) return failure(true); + break; + } default: - V = getValue(Type::UByteTy, Raw.Arg2); - if (!isa(V)) return failure(true); - Idx.push_back(cast(V)); + if (!TopTy) return failure(true); + Idx.push_back(V = getValue(TopTy->getIndexType(), Raw.Arg2)); + if (!V) return failure(true); + vector &args = *Raw.VarArgs; for (unsigned i = 0, E = args.size(); i != E; ++i) { - V = getValue(Type::UByteTy, args[i]); - if (!isa(V)) return failure(true); - Idx.push_back(cast(V)); + const Type *ETy = MemAccessInst::getIndexedType(Raw.Ty, Idx, true); + const CompositeType *ElTy = dyn_cast_or_null(ETy); + if (!ElTy) return failure(true); + Idx.push_back(V = getValue(ElTy->getIndexType(), args[i])); + if (!V) return failure(true); } delete Raw.VarArgs; break; @@ -388,21 +402,28 @@ bool BytecodeParser::ParseInstruction(const uchar *&Buf, const uchar *EndBuf, return false; } case Instruction::Store: { - vector Idx; + vector Idx; + if (!isa(Raw.Ty)) return failure(true); + const CompositeType *TopTy = + dyn_cast(cast(Raw.Ty)->getValueType()); + switch (Raw.NumOperands) { case 0: case 1: cerr << "Invalid store encountered!\n"; return failure(true); case 2: break; - case 3: V = getValue(Type::UByteTy, Raw.Arg3); - if (!isa(V)) return failure(true); - Idx.push_back(cast(V)); - break; + case 3: + if (!TopTy) return failure(true); + Idx.push_back(V = getValue(TopTy->getIndexType(), Raw.Arg3)); + if (!V) return failure(true); + break; default: vector &args = *Raw.VarArgs; for (unsigned i = 0, E = args.size(); i != E; ++i) { - V = getValue(Type::UByteTy, args[i]); - if (!isa(V)) return failure(true); - Idx.push_back(cast(V)); + const Type *ETy = MemAccessInst::getIndexedType(Raw.Ty, Idx, true); + const CompositeType *ElTy = dyn_cast_or_null(ETy); + if (!ElTy) return failure(true); + Idx.push_back(V = getValue(ElTy->getIndexType(), args[i])); + if (!V) return failure(true); } delete Raw.VarArgs; break;