mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-18 14:31:27 +00:00
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:
parent
2e033f31dc
commit
8c174a9b5a
@ -130,12 +130,9 @@ public:
|
|||||||
void setArgument(unsigned ArgNo, Value* newVal) {
|
void setArgument(unsigned ArgNo, Value* newVal) {
|
||||||
assert(I && "Not a call or invoke instruction!");
|
assert(I && "Not a call or invoke instruction!");
|
||||||
assert(arg_begin() + ArgNo < arg_end() && "Argument # out of range!");
|
assert(arg_begin() + ArgNo < arg_end() && "Argument # out of range!");
|
||||||
if (I->getOpcode() == Instruction::Call)
|
I->setOperand(getArgumentOffset() + ArgNo, newVal);
|
||||||
I->setOperand(ArgNo+1, newVal); // Skip Function
|
|
||||||
else
|
|
||||||
I->setOperand(ArgNo+3, newVal); // Skip Function, BB, BB
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// hasArgument - Returns true if this CallSite passes the given Value* as an
|
/// hasArgument - Returns true if this CallSite passes the given Value* as an
|
||||||
/// argument to the called function.
|
/// argument to the called function.
|
||||||
bool hasArgument(const Value *Arg) const;
|
bool hasArgument(const Value *Arg) const;
|
||||||
@ -146,14 +143,11 @@ public:
|
|||||||
|
|
||||||
/// arg_begin/arg_end - Return iterators corresponding to the actual argument
|
/// arg_begin/arg_end - Return iterators corresponding to the actual argument
|
||||||
/// list for a call site.
|
/// list for a call site.
|
||||||
///
|
|
||||||
arg_iterator arg_begin() const {
|
arg_iterator arg_begin() const {
|
||||||
assert(I && "Not a call or invoke instruction!");
|
assert(I && "Not a call or invoke instruction!");
|
||||||
if (I->getOpcode() == Instruction::Call)
|
return I->op_begin() + getArgumentOffset(); // Skip non-arguments
|
||||||
return I->op_begin()+1; // Skip Function
|
|
||||||
else
|
|
||||||
return I->op_begin()+3; // Skip Function, BB, BB
|
|
||||||
}
|
}
|
||||||
|
|
||||||
arg_iterator arg_end() const { return I->op_end(); }
|
arg_iterator arg_end() const { return I->op_end(); }
|
||||||
bool arg_empty() const { return arg_end() == arg_begin(); }
|
bool arg_empty() const { return arg_end() == arg_begin(); }
|
||||||
unsigned arg_size() const { return unsigned(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 {
|
bool operator<(const CallSite &CS) const {
|
||||||
return getInstruction() < CS.getInstruction();
|
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
|
} // End llvm namespace
|
||||||
|
Loading…
x
Reference in New Issue
Block a user