mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-08-02 23:26:31 +00:00
Changed the fundemental architecture of Operands for Instructions. Now
Operands are maintained as a vector<Use> in the User class, and operator iterators are provided as before. Getting an operand no longer requires a virtual function call. WARNING: getOperand(x) where x >= getNumOperands() will now assert instead of returning null! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -10,72 +10,24 @@
|
||||
#include "llvm/Type.h"
|
||||
#endif
|
||||
|
||||
SwitchInst::SwitchInst(Value *V, BasicBlock *DefV)
|
||||
: TerminatorInst(Instruction::Switch),
|
||||
DefaultDest(DefV, this), Val(V, this) {
|
||||
assert(Val && DefV);
|
||||
SwitchInst::SwitchInst(Value *V, BasicBlock *DefDest)
|
||||
: TerminatorInst(Instruction::Switch) {
|
||||
assert(V && DefDest);
|
||||
Operands.push_back(Use(V, this));
|
||||
Operands.push_back(Use(DefDest, this));
|
||||
}
|
||||
|
||||
SwitchInst::SwitchInst(const SwitchInst &SI)
|
||||
: TerminatorInst(Instruction::Switch), DefaultDest(SI.DefaultDest),
|
||||
Val(SI.Val) {
|
||||
: TerminatorInst(Instruction::Switch) {
|
||||
Operands.reserve(SI.Operands.size());
|
||||
|
||||
for (dest_const_iterator I = SI.Destinations.begin(),
|
||||
end = SI.Destinations.end(); I != end; ++I)
|
||||
Destinations.push_back(dest_value(ConstPoolUse(I->first, this),
|
||||
BasicBlockUse(I->second, this)));
|
||||
for (unsigned i = 0, E = SI.Operands.size(); i != E; i+=2) {
|
||||
Operands.push_back(Use(SI.Operands[i], this));
|
||||
Operands.push_back(Use(SI.Operands[i+1], this));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void SwitchInst::dest_push_back(ConstPoolVal *OnVal, BasicBlock *Dest) {
|
||||
Destinations.push_back(dest_value(ConstPoolUse(OnVal, this),
|
||||
BasicBlockUse(Dest, this)));
|
||||
}
|
||||
|
||||
void SwitchInst::dropAllReferences() {
|
||||
Val = 0;
|
||||
DefaultDest = 0;
|
||||
Destinations.clear();
|
||||
}
|
||||
|
||||
const BasicBlock *SwitchInst::getSuccessor(unsigned idx) const {
|
||||
if (idx == 0) return DefaultDest;
|
||||
if (idx > Destinations.size()) return 0;
|
||||
return Destinations[idx-1].second;
|
||||
}
|
||||
|
||||
unsigned SwitchInst::getNumOperands() const {
|
||||
return 2+Destinations.size();
|
||||
}
|
||||
|
||||
const Value *SwitchInst::getOperand(unsigned i) const {
|
||||
if (i == 0) return Val;
|
||||
else if (i == 1) return DefaultDest;
|
||||
|
||||
unsigned slot = (i-2) >> 1;
|
||||
if (slot >= Destinations.size()) return 0;
|
||||
|
||||
if (i & 1) return Destinations[slot].second;
|
||||
return Destinations[slot].first;
|
||||
}
|
||||
|
||||
bool SwitchInst::setOperand(unsigned i, Value *V) {
|
||||
if (i == 0) { Val = V; return true; }
|
||||
else if (i == 1) {
|
||||
assert(V->getType() == Type::LabelTy);
|
||||
DefaultDest = (BasicBlock*)V;
|
||||
return true;
|
||||
}
|
||||
|
||||
unsigned slot = (i-2) >> 1;
|
||||
if (slot >= Destinations.size()) return 0;
|
||||
|
||||
if (i & 1) {
|
||||
assert(V->getType() == Type::LabelTy);
|
||||
Destinations[slot].second = (BasicBlock*)V;
|
||||
} else {
|
||||
// TODO: assert constant
|
||||
Destinations[slot].first = (ConstPoolVal*)V;
|
||||
}
|
||||
return true;
|
||||
Operands.push_back(Use(OnVal, this));
|
||||
Operands.push_back(Use(Dest, this));
|
||||
}
|
||||
|
Reference in New Issue
Block a user