mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-03 13:31:05 +00:00
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
This commit is contained in:
parent
64339f681a
commit
352eef717d
@ -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)
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user