Add pointer indexing support


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1460 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Bytecode/Reader/InstructionReader.cpp b/lib/Bytecode/Reader/InstructionReader.cpp
index 47d9e82..b498ac9 100644
--- a/lib/Bytecode/Reader/InstructionReader.cpp
+++ b/lib/Bytecode/Reader/InstructionReader.cpp
@@ -350,8 +350,7 @@
   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 @@
       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 @@
   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 @@
       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;
     }