From 352eef717dc2e686b28164a8f0f982db4fd24cd7 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 21 Aug 2002 22:55:27 +0000 Subject: [PATCH] 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 ++++++++++++++++++----- lib/Bytecode/Reader/Reader.cpp | 3 +- lib/Bytecode/Reader/ReaderInternals.h | 3 +- 3 files changed, 34 insertions(+), 10 deletions(-) diff --git a/lib/Bytecode/Reader/InstructionReader.cpp b/lib/Bytecode/Reader/InstructionReader.cpp index 979b3944bc2..1f1485e2f2e 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) diff --git a/lib/Bytecode/Reader/Reader.cpp b/lib/Bytecode/Reader/Reader.cpp index bbffb1760ee..dd75d7f26f8 100644 --- a/lib/Bytecode/Reader/Reader.cpp +++ b/lib/Bytecode/Reader/Reader.cpp @@ -168,7 +168,8 @@ bool BytecodeParser::ParseBasicBlock(const uchar *&Buf, const uchar *EndBuf, 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 fdaf13d13c1..c156f515b88 100644 --- a/lib/Bytecode/Reader/ReaderInternals.h +++ b/lib/Bytecode/Reader/ReaderInternals.h @@ -94,7 +94,8 @@ private: 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,