diff options
-rw-r--r-- | include/llvm/Support/CallSite.h | 23 |
1 files changed, 22 insertions, 1 deletions
diff --git a/include/llvm/Support/CallSite.h b/include/llvm/Support/CallSite.h index faf6d0d278..c30f00c9b9 100644 --- a/include/llvm/Support/CallSite.h +++ b/include/llvm/Support/CallSite.h @@ -22,6 +22,21 @@ public: CallSite(const CallSite &CS) : I(CS.I) {} CallSite &operator=(const CallSite &CS) { I = CS.I; return *this; } + /// CallSite::get - This static method is sort of like a constructor. It will + /// create an appropriate call site for a Call or Invoke instruction, but it + /// can also create a null initialized CallSite object for something which is + /// NOT a call site. + /// + static CallSite get(Value *V) { + if (Instruction *I = dyn_cast<Instruction>(V)) { + if (I->getOpcode() == Instruction::Call) + return CallSite((CallInst*)I); + else if (I->getOpcode() == Instruction::Invoke) + return CallSite((InvokeInst*)I); + } + return CallSite(); + } + /// getInstruction - Return the instruction this call site corresponds to /// Instruction *getInstruction() const { return I; } @@ -37,6 +52,12 @@ public: return dyn_cast<Function>(getCalledValue()); } + /// setCalledFunction - Set the callee to the specied value... + /// + void setCalledFunction(Value *V) { + I->setOperand(0, V); + } + /// arg_iterator - The type of iterator to use when looping over actual /// arguments at this call site... typedef User::op_iterator arg_iterator; @@ -50,7 +71,7 @@ public: else return I->op_begin()+3; // Skip Function, BB, BB } - arg_iterator arg_end() const { return I->op_begin(); } + arg_iterator arg_end() const { return I->op_end(); } }; #endif |