diff options
author | Chris Lattner <sabre@nondot.org> | 2002-08-21 22:55:27 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2002-08-21 22:55:27 +0000 |
commit | 352eef717dc2e686b28164a8f0f982db4fd24cd7 (patch) | |
tree | 623a406f8d4657e269c8209a22da815b7a686034 | |
parent | 64339f681a0bc29c21164fc6ea600794a9f49e4b (diff) | |
download | external_llvm-352eef717dc2e686b28164a8f0f982db4fd24cd7.zip external_llvm-352eef717dc2e686b28164a8f0f982db4fd24cd7.tar.gz external_llvm-352eef717dc2e686b28164a8f0f982db4fd24cd7.tar.bz2 |
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
-rw-r--r-- | lib/Bytecode/Reader/InstructionReader.cpp | 38 | ||||
-rw-r--r-- | lib/Bytecode/Reader/Reader.cpp | 3 | ||||
-rw-r--r-- | 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 979b394..1f1485e 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<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 @@ 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<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 @@ 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 fdaf13d..c156f51 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, |