Add CallSite::getArgumentOffset() to hide the differences in operands betwen

Call and Invoke in a single method instead of having it hardcoded in multiple
places.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@53224 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Matthijs Kooijman 2008-07-08 08:50:32 +00:00
parent 2e033f31dc
commit 8c174a9b5a

View File

@ -130,12 +130,9 @@ public:
void setArgument(unsigned ArgNo, Value* newVal) {
assert(I && "Not a call or invoke instruction!");
assert(arg_begin() + ArgNo < arg_end() && "Argument # out of range!");
if (I->getOpcode() == Instruction::Call)
I->setOperand(ArgNo+1, newVal); // Skip Function
else
I->setOperand(ArgNo+3, newVal); // Skip Function, BB, BB
I->setOperand(getArgumentOffset() + ArgNo, newVal);
}
/// hasArgument - Returns true if this CallSite passes the given Value* as an
/// argument to the called function.
bool hasArgument(const Value *Arg) const;
@ -146,14 +143,11 @@ public:
/// arg_begin/arg_end - Return iterators corresponding to the actual argument
/// list for a call site.
///
arg_iterator arg_begin() const {
assert(I && "Not a call or invoke instruction!");
if (I->getOpcode() == Instruction::Call)
return I->op_begin()+1; // Skip Function
else
return I->op_begin()+3; // Skip Function, BB, BB
return I->op_begin() + getArgumentOffset(); // Skip non-arguments
}
arg_iterator arg_end() const { return I->op_end(); }
bool arg_empty() const { return arg_end() == arg_begin(); }
unsigned arg_size() const { return unsigned(arg_end() - arg_begin()); }
@ -161,6 +155,15 @@ public:
bool operator<(const CallSite &CS) const {
return getInstruction() < CS.getInstruction();
}
private:
/// Returns the operand number of the first argument
unsigned getArgumentOffset() const {
if (I->getOpcode() == Instruction::Call)
return 1; // Skip Function
else
return 3; // Skip Function, BB, BB
}
};
} // End llvm namespace