Add pointer indexing support
authorChris Lattner <sabre@nondot.org>
Fri, 14 Dec 2001 16:30:09 +0000 (16:30 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 14 Dec 2001 16:30:09 +0000 (16:30 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1460 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Bytecode/Reader/InstructionReader.cpp

index 47d9e820e278f9588cabdefe2509ef185948b693..b498ac90c1a0b082fb3fd4cd3a7205500c5474ad 100644 (file)
@@ -350,8 +350,7 @@ bool BytecodeParser::ParseInstruction(const uchar *&Buf, const uchar *EndBuf,
   case Instruction::GetElementPtr: {
     vector<Value*> Idx;
     if (!isa<PointerType>(Raw.Ty)) return failure(true);
-    const CompositeType *TopTy =
-      dyn_cast<CompositeType>(cast<PointerType>(Raw.Ty)->getElementType());
+    const CompositeType *TopTy = dyn_cast<CompositeType>(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<CompositeType>(ETy);
       if (!ElTy) return failure(true);
 
@@ -404,8 +403,7 @@ bool BytecodeParser::ParseInstruction(const uchar *&Buf, const uchar *EndBuf,
   case Instruction::Store: {
     vector<Value*> Idx;
     if (!isa<PointerType>(Raw.Ty)) return failure(true);
-    const CompositeType *TopTy =
-      dyn_cast<CompositeType>(cast<PointerType>(Raw.Ty)->getElementType());
+    const CompositeType *TopTy = dyn_cast<CompositeType>(Raw.Ty);
 
     switch (Raw.NumOperands) {
     case 0: 
@@ -418,13 +416,18 @@ bool BytecodeParser::ParseInstruction(const uchar *&Buf, const uchar *EndBuf,
       break;
     default:
       vector<unsigned> &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<CompositeType>(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<CompositeType>(ETy);
       }
+      if (i != E)
+        return failure(true);  // didn't use up all of the indices!
+
       delete Raw.VarArgs; 
       break;
     }