Emit an obnoxious warning message for bytecode that includes load/store
instructions that use indexing.  Convert them transparently into a pair
of instructions.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3431 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Bytecode/Reader/InstructionReader.cpp b/lib/Bytecode/Reader/InstructionReader.cpp
index 979b394..1f1485e 100644
--- a/lib/Bytecode/Reader/InstructionReader.cpp
+++ b/lib/Bytecode/Reader/InstructionReader.cpp
@@ -116,7 +116,8 @@
 
 
 bool BytecodeParser::ParseInstruction(const uchar *&Buf, const uchar *EndBuf,
-				      Instruction *&Res) {
+				      Instruction *&Res,
+                                      BasicBlock *BB /*HACK*/) {
   RawInst Raw;
   if (ParseRawInst(Buf, EndBuf, Raw))
     return true;
@@ -388,9 +389,18 @@
     }
 
     if (Raw.Opcode == Instruction::Load) {
-      assert(MemAccessInst::getIndexedType(Raw.Ty, Idx) && 
-             "Bad indices for Load!");
-      Res = new LoadInst(getValue(Raw.Ty, Raw.Arg1), Idx);
+      Value *Src = getValue(Raw.Ty, Raw.Arg1);
+      if (!Idx.empty()) {
+        cerr << "WARNING: Bytecode contains load instruction with indices.  "
+             << "Replacing with getelementptr/load pair\n";
+        assert(MemAccessInst::getIndexedType(Raw.Ty, Idx) && 
+               "Bad indices for Load!");
+        Src = new GetElementPtrInst(Src, Idx);
+        // FIXME: Remove this compatibility code and the BB parameter to this
+        // method.
+        BB->getInstList().push_back(cast<Instruction>(Src));
+      }
+      Res = new LoadInst(Src);
     } else if (Raw.Opcode == Instruction::GetElementPtr)
       Res = new GetElementPtrInst(getValue(Raw.Ty, Raw.Arg1), Idx);
     else
@@ -429,10 +439,22 @@
       break;
     }
 
-    const Type *ElType = StoreInst::getIndexedType(Raw.Ty, Idx);
-    if (ElType == 0) return true;
-    Res = new StoreInst(getValue(ElType, Raw.Arg1), getValue(Raw.Ty, Raw.Arg2),
-			Idx);
+    Value *Ptr = getValue(Raw.Ty, Raw.Arg2);
+    if (!Idx.empty()) {
+      cerr << "WARNING: Bytecode contains load instruction with indices.  "
+           << "Replacing with getelementptr/load pair\n";
+
+      const Type *ElType = StoreInst::getIndexedType(Raw.Ty, Idx);
+      if (ElType == 0) return true;
+
+      Ptr = new GetElementPtrInst(Ptr, Idx);
+      // FIXME: Remove this compatibility code and the BB parameter to this
+      // method.
+      BB->getInstList().push_back(cast<Instruction>(Ptr));
+    }
+
+    const Type *ValTy = cast<PointerType>(Ptr->getType())->getElementType();
+    Res = new StoreInst(getValue(ValTy, Raw.Arg1), Ptr);
     return false;
   }
   }  // end switch(Raw.Opcode) 
diff --git a/lib/Bytecode/Reader/Reader.cpp b/lib/Bytecode/Reader/Reader.cpp
index bbffb17..dd75d7f 100644
--- a/lib/Bytecode/Reader/Reader.cpp
+++ b/lib/Bytecode/Reader/Reader.cpp
@@ -168,7 +168,8 @@
 
   while (Buf < EndBuf) {
     Instruction *Inst;
-    if (ParseInstruction(Buf, EndBuf, Inst)) {
+    if (ParseInstruction(Buf, EndBuf, Inst,
+                         /*HACK*/BB)) {
       delete BB;
       return true;
     }
diff --git a/lib/Bytecode/Reader/ReaderInternals.h b/lib/Bytecode/Reader/ReaderInternals.h
index fdaf13d..c156f51 100644
--- a/lib/Bytecode/Reader/ReaderInternals.h
+++ b/lib/Bytecode/Reader/ReaderInternals.h
@@ -94,7 +94,8 @@
   bool ParseSymbolTable   (const uchar *&Buf, const uchar *End, SymbolTable *);
   bool ParseMethod        (const uchar *&Buf, const uchar *End, Module *);
   bool ParseBasicBlock    (const uchar *&Buf, const uchar *End, BasicBlock *&);
-  bool ParseInstruction   (const uchar *&Buf, const uchar *End, Instruction *&);
+  bool ParseInstruction   (const uchar *&Buf, const uchar *End, Instruction *&,
+                           BasicBlock *BB /*HACK*/);
   bool ParseRawInst       (const uchar *&Buf, const uchar *End, RawInst &);
 
   bool ParseConstantPool(const uchar *&Buf, const uchar *EndBuf,