aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Bytecode
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2002-08-21 22:55:27 +0000
committerChris Lattner <sabre@nondot.org>2002-08-21 22:55:27 +0000
commit352eef717dc2e686b28164a8f0f982db4fd24cd7 (patch)
tree623a406f8d4657e269c8209a22da815b7a686034 /lib/Bytecode
parent64339f681a0bc29c21164fc6ea600794a9f49e4b (diff)
downloadexternal_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
Diffstat (limited to 'lib/Bytecode')
-rw-r--r--lib/Bytecode/Reader/InstructionReader.cpp38
-rw-r--r--lib/Bytecode/Reader/Reader.cpp3
-rw-r--r--lib/Bytecode/Reader/ReaderInternals.h3
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,