From 352eef717dc2e686b28164a8f0f982db4fd24cd7 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 21 Aug 2002 22:55:27 +0000 Subject: 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 --- lib/Bytecode/Reader/InstructionReader.cpp | 38 ++++++++++++++++++++++++------- 1 file changed, 30 insertions(+), 8 deletions(-) (limited to 'lib/Bytecode/Reader/InstructionReader.cpp') diff --git a/lib/Bytecode/Reader/InstructionReader.cpp b/lib/Bytecode/Reader/InstructionReader.cpp index 979b3944bc..1f1485e2f2 100644 --- a/lib/Bytecode/Reader/InstructionReader.cpp +++ b/lib/Bytecode/Reader/InstructionReader.cpp @@ -116,7 +116,8 @@ bool BytecodeParser::ParseRawInst(const uchar *&Buf, const uchar *EndBuf, 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 @@ bool BytecodeParser::ParseInstruction(const uchar *&Buf, const uchar *EndBuf, } 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(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 @@ bool BytecodeParser::ParseInstruction(const uchar *&Buf, const uchar *EndBuf, 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(Ptr)); + } + + const Type *ValTy = cast(Ptr->getType())->getElementType(); + Res = new StoreInst(getValue(ValTy, Raw.Arg1), Ptr); return false; } } // end switch(Raw.Opcode) -- cgit v1.2.3-18-g5258