From: Chris Lattner Date: Mon, 24 Feb 2003 20:35:45 +0000 (+0000) Subject: Initial checkin of CallSite wrapper for Call/Invoke instructions X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=93a7e08d1fb087c3e26775838bfaad1d8eb99f11;p=llvm Initial checkin of CallSite wrapper for Call/Invoke instructions git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5618 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Support/CallSite.h b/include/llvm/Support/CallSite.h new file mode 100644 index 00000000000..066572efde8 --- /dev/null +++ b/include/llvm/Support/CallSite.h @@ -0,0 +1,49 @@ +//===-- llvm/Support/CallSite.h - Abstract Call & Invoke instrs -*- C++ -*-===// +// +// This file defines the CallSite class, which is a handy wrapper for code that +// wants to treat Call and Invoke instructions in a generic way. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_SUPPORT_CALLSITE_H +#define LLVM_SUPPORT_CALLSITE_H + +#include "llvm/Instruction.h" + +class CallInst; +class InvokeInst; + +class CallSite { + Instruction *I; +public: + CallSite(CallInst *CI) : I((Instruction*)CI) {} + CallSite(InvokeInst *II) : I((Instruction*)II) {} + + /// getCalledValue - Return the pointer to function that is being called... + /// + Value *getCalledValue() const { return I->getOperand(0); } + + /// getCalledFunction - Return the function being called if this is a direct + /// call, otherwise return null (if it's an indirect call). + /// + Function *getCalledFunction() const { + return dyn_cast(getCalledValue()); + } + + /// arg_iterator - The type of iterator to use when looping over actual + /// arguments at this call site... + typedef User::op_iterator arg_iterator; + + /// arg_begin/arg_end - Return iterators corresponding to the actual argument + /// list for a call site. + /// + arg_iterator arg_begin() const { + if (I->getOpcode() == Instruction::Call) + 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_begin(); } +}; + +#endif