136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines//===- CallSite.h - Abstract Call & Invoke instrs ---------------*- C++ -*-===// 263b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman// 36fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// The LLVM Compiler Infrastructure 46fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell// 57ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// This file is distributed under the University of Illinois Open Source 67ed47a13356daed2a34cd2209a31f92552e3bdd8Chris Lattner// License. See LICENSE.TXT for details. 763b3afa98460ce38a1c48d3c44ef6edfdaf37b77Misha Brukman// 86fbcc26f1460eaee4e0eb8b426fc1ff0c7af11beJohn Criswell//===----------------------------------------------------------------------===// 993a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattner// 1093a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattner// This file defines the CallSite class, which is a handy wrapper for code that 11c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif// wants to treat Call and Invoke instructions in a generic way. When in non- 12c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif// mutation context (e.g. an analysis) ImmutableCallSite should be used. 13c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif// Finally, when some degree of customization is necessary between these two 14c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif// extremes, CallSiteBase<> can be supplied with fine-tuned parameters. 1593a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattner// 16c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif// NOTE: These classes are supposed to have "value semantics". So they should be 17c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif// passed by value, not by reference; they should not be "new"ed or "delete"d. 18c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif// They are efficiently copyable, assignable and constructable, with cost 19c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif// equivalent to copying a pointer (notice that they have only a single data 20c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif// member). The internal representation carries a flag which indicates which of 21c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif// the two variants is enclosed. This allows for cheaper checks when various 22c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif// accessors of CallSite are employed. 234ba0f57904613bb2ea0d7f0a8ff6a0c04647044dBrian Gaeke// 2493a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattner//===----------------------------------------------------------------------===// 2593a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattner 2636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#ifndef LLVM_IR_CALLSITE_H 2736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines#define LLVM_IR_CALLSITE_H 2893a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattner 29255b26ea3529ca096313c85dcf006565c7e916f9Gabor Greif#include "llvm/ADT/PointerIntPair.h" 30cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar#include "llvm/ADT/iterator_range.h" 310b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Attributes.h" 320b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/CallingConv.h" 330b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/Instructions.h" 3493a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattner 35d0fde30ce850b78371fd1386338350591f9ff494Brian Gaekenamespace llvm { 36d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 3793a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattnerclass CallInst; 3893a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattnerclass InvokeInst; 3993a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattner 40c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greiftemplate <typename FunTy = const Function, 41cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar typename BBTy = const BasicBlock, 42c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif typename ValTy = const Value, 43c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif typename UserTy = const User, 44cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar typename UseTy = const Use, 45c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif typename InstrTy = const Instruction, 46c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif typename CallTy = const CallInst, 47c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif typename InvokeTy = const InvokeInst, 48c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif typename IterTy = User::const_op_iterator> 49c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greifclass CallSiteBase { 50c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greifprotected: 51c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif PointerIntPair<InstrTy*, 1, bool> I; 520c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 53dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines CallSiteBase() : I(nullptr, false) {} 54756f0d2ab4036b154bd1199aee839652f7b0f10aGabor Greif CallSiteBase(CallTy *CI) : I(CI, true) { assert(CI); } 55756f0d2ab4036b154bd1199aee839652f7b0f10aGabor Greif CallSiteBase(InvokeTy *II) : I(II, false) { assert(II); } 560c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar explicit CallSiteBase(ValTy *II) { *this = get(II); } 570c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar 580c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainarprivate: 59c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif /// CallSiteBase::get - This static method is sort of like a constructor. It 60c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif /// will create an appropriate call site for a Call or Invoke instruction, but 61c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif /// it can also create a null initialized CallSiteBase object for something 62c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif /// which is NOT a call site. 63697a00fbf0e43adb1c37c5af8f6e25e2a42b606dChris Lattner /// 64c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif static CallSiteBase get(ValTy *V) { 65c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif if (InstrTy *II = dyn_cast<InstrTy>(V)) { 66c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif if (II->getOpcode() == Instruction::Call) 67a6758446b78ee93b8a05967b28ce57795b2ee1ccGabor Greif return CallSiteBase(static_cast<CallTy*>(II)); 68c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif else if (II->getOpcode() == Instruction::Invoke) 69a6758446b78ee93b8a05967b28ce57795b2ee1ccGabor Greif return CallSiteBase(static_cast<InvokeTy*>(II)); 70697a00fbf0e43adb1c37c5af8f6e25e2a42b606dChris Lattner } 71c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif return CallSiteBase(); 72697a00fbf0e43adb1c37c5af8f6e25e2a42b606dChris Lattner } 73cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 7489730dca5a29bf44d6f11e298a8beb49a46d347eGabor Greifpublic: 75255b26ea3529ca096313c85dcf006565c7e916f9Gabor Greif /// isCall - true if a CallInst is enclosed. 76255b26ea3529ca096313c85dcf006565c7e916f9Gabor Greif /// Note that !isCall() does not mean it is an InvokeInst enclosed, 77255b26ea3529ca096313c85dcf006565c7e916f9Gabor Greif /// it also could signify a NULL Instruction pointer. 78255b26ea3529ca096313c85dcf006565c7e916f9Gabor Greif bool isCall() const { return I.getInt(); } 79255b26ea3529ca096313c85dcf006565c7e916f9Gabor Greif 80255b26ea3529ca096313c85dcf006565c7e916f9Gabor Greif /// isInvoke - true if a InvokeInst is enclosed. 81255b26ea3529ca096313c85dcf006565c7e916f9Gabor Greif /// 82255b26ea3529ca096313c85dcf006565c7e916f9Gabor Greif bool isInvoke() const { return getInstruction() && !I.getInt(); } 8301f93a4712f4ece817e41a2286a0e19cd2eb91f0Brian Gaeke 84c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif InstrTy *getInstruction() const { return I.getPointer(); } 85c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif InstrTy *operator->() const { return I.getPointer(); } 86ebe69fe11e48d322045d5949c83283927a0d790bStephen Hines explicit operator bool() const { return I.getPointer(); } 87b5b0b45e58ea0b83e79dcee00b51a0149535ed2aVikram S. Adve 88cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// Get the basic block containing the call site 89cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar BBTy* getParent() const { return getInstruction()->getParent(); } 90cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 9115515c944a1d36a51d3ab3b910cfdecb2d0717a7Chad Rosier /// getCalledValue - Return the pointer to function that is being called. 9293a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattner /// 93c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif ValTy *getCalledValue() const { 94255b26ea3529ca096313c85dcf006565c7e916f9Gabor Greif assert(getInstruction() && "Not a call or invoke instruction!"); 95c9f7500d1752feac7cece26d20007a99d21f677cGabor Greif return *getCallee(); 967c4098ee2bec04deb9f24d1fc2d8382266cacff4Chris Lattner } 9793a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattner 9893a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattner /// getCalledFunction - Return the function being called if this is a direct 9993a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattner /// call, otherwise return null (if it's an indirect call). 10093a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattner /// 101c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif FunTy *getCalledFunction() const { 102c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif return dyn_cast<FunTy>(getCalledValue()); 103721aef6897790abc370cd2eddbefa8d0c0a1f6b3Chris Lattner } 10493a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattner 10515515c944a1d36a51d3ab3b910cfdecb2d0717a7Chad Rosier /// setCalledFunction - Set the callee to the specified value. 106697a00fbf0e43adb1c37c5af8f6e25e2a42b606dChris Lattner /// 107697a00fbf0e43adb1c37c5af8f6e25e2a42b606dChris Lattner void setCalledFunction(Value *V) { 108255b26ea3529ca096313c85dcf006565c7e916f9Gabor Greif assert(getInstruction() && "Not a call or invoke instruction!"); 109c9f7500d1752feac7cece26d20007a99d21f677cGabor Greif *getCallee() = V; 110697a00fbf0e43adb1c37c5af8f6e25e2a42b606dChris Lattner } 111697a00fbf0e43adb1c37c5af8f6e25e2a42b606dChris Lattner 112c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif /// isCallee - Determine whether the passed iterator points to the 113c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif /// callee operand's Use. 11436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isCallee(Value::const_user_iterator UI) const { 11536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return isCallee(&UI.getUse()); 116c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif } 117c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif 11836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Determine whether this Use is the callee operand's Use. 11936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isCallee(const Use *U) const { return getCallee() == U; } 12036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 121c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif ValTy *getArgument(unsigned ArgNo) const { 122e6c745261ea2c4c523cb66f8935f6eceeab1c5ecChris Lattner assert(arg_begin() + ArgNo < arg_end() && "Argument # out of range!"); 123436ed471cc70f632dbcd1e82cb8e90d2c0f91ccdGabor Greif return *(arg_begin() + ArgNo); 124e6c745261ea2c4c523cb66f8935f6eceeab1c5ecChris Lattner } 125e6c745261ea2c4c523cb66f8935f6eceeab1c5ecChris Lattner 126823391ae6efffa3ec317c58f8f98ddd1075f12b5Owen Anderson void setArgument(unsigned ArgNo, Value* newVal) { 127255b26ea3529ca096313c85dcf006565c7e916f9Gabor Greif assert(getInstruction() && "Not a call or invoke instruction!"); 128823391ae6efffa3ec317c58f8f98ddd1075f12b5Owen Anderson assert(arg_begin() + ArgNo < arg_end() && "Argument # out of range!"); 129436ed471cc70f632dbcd1e82cb8e90d2c0f91ccdGabor Greif getInstruction()->setOperand(ArgNo, newVal); 130823391ae6efffa3ec317c58f8f98ddd1075f12b5Owen Anderson } 1318c174a9b5a3c5580aa6110336bb6a7f990dcb3b2Matthijs Kooijman 132c9f7500d1752feac7cece26d20007a99d21f677cGabor Greif /// Given a value use iterator, returns the argument that corresponds to it. 133c9f7500d1752feac7cece26d20007a99d21f677cGabor Greif /// Iterator must actually correspond to an argument. 13436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getArgumentNo(Value::const_user_iterator I) const { 13536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return getArgumentNo(&I.getUse()); 13636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 13736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 13836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// Given a use for an argument, get the argument number that corresponds to 13936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// it. 14036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines unsigned getArgumentNo(const Use *U) const { 141c9f7500d1752feac7cece26d20007a99d21f677cGabor Greif assert(getInstruction() && "Not a call or invoke instruction!"); 14236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines assert(arg_begin() <= U && U < arg_end() 143c9f7500d1752feac7cece26d20007a99d21f677cGabor Greif && "Argument # out of range!"); 14436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return U - arg_begin(); 145c9f7500d1752feac7cece26d20007a99d21f677cGabor Greif } 146c9f7500d1752feac7cece26d20007a99d21f677cGabor Greif 14793a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattner /// arg_iterator - The type of iterator to use when looping over actual 14815515c944a1d36a51d3ab3b910cfdecb2d0717a7Chad Rosier /// arguments at this call site. 149c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif typedef IterTy arg_iterator; 15093a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattner 151cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar iterator_range<IterTy> args() const { 152cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return make_range(arg_begin(), arg_end()); 15393a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattner } 15421c276d2fa99914d5ed958ac0aec7d78e3dd87cfDan Gohman bool arg_empty() const { return arg_end() == arg_begin(); } 15596698a5ec78619ac79443039f9dbc1db141a7e82Chris Lattner unsigned arg_size() const { return unsigned(arg_end() - arg_begin()); } 1564c5e43da7792f75567b693105cc53e3f1992ad98Pirama Arumuga Nainar 157cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// Type of iterator to use when looping over data operands at this call site 158cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// (see below). 159cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar typedef IterTy data_operand_iterator; 160cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 161cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// data_operands_begin/data_operands_end - Return iterators iterating over 162cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// the call / invoke argument list and bundle operands. For invokes, this is 163cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// the set of instruction operands except the invoke target and the two 164cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// successor blocks; and for calls this is the set of instruction operands 165cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// except the call target. 166cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 167cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar IterTy data_operands_begin() const { 168cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(getInstruction() && "Not a call or invoke instruction!"); 169cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return (*this)->op_begin(); 170cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 171cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar IterTy data_operands_end() const { 172cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar assert(getInstruction() && "Not a call or invoke instruction!"); 173cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return (*this)->op_end() - (isCall() ? 1 : 3); 174cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 175cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar iterator_range<IterTy> data_ops() const { 176cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return make_range(data_operands_begin(), data_operands_end()); 177cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 178cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar bool data_operands_empty() const { 179cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return data_operands_end() == data_operands_begin(); 180cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 181cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar unsigned data_operands_size() const { 182cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return std::distance(data_operands_begin(), data_operands_end()); 183cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 184cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 185ce931088f36b75dc5073013d2928aebd6397567aDan Gohman /// getType - Return the type of the instruction that generated this call site 186ce931088f36b75dc5073013d2928aebd6397567aDan Gohman /// 187db125cfaf57cc83e7dd7453de2d509bc8efd0e5eChris Lattner Type *getType() const { return (*this)->getType(); } 188ce931088f36b75dc5073013d2928aebd6397567aDan Gohman 189ce931088f36b75dc5073013d2928aebd6397567aDan Gohman /// getCaller - Return the caller function for this call site 190ce931088f36b75dc5073013d2928aebd6397567aDan Gohman /// 1917b975f411f03a00e352c6ef7d9745e76ad070fd2Dan Gohman FunTy *getCaller() const { return (*this)->getParent()->getParent(); } 192ce931088f36b75dc5073013d2928aebd6397567aDan Gohman 193dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// \brief Tests if this call site must be tail call optimized. Only a 194dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// CallInst can be tail call optimized. 195dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isMustTailCall() const { 196dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return isCall() && cast<CallInst>(getInstruction())->isMustTailCall(); 197dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 198dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 199dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines /// \brief Tests if this call site is marked as a tail call. 200dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines bool isTailCall() const { 201dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines return isCall() && cast<CallInst>(getInstruction())->isTailCall(); 202dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines } 203dce4a407a24b04eebc6a376f8e62b41aaa7b071fStephen Hines 2047ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman#define CALLSITE_DELEGATE_GETTER(METHOD) \ 2057ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman InstrTy *II = getInstruction(); \ 2067ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman return isCall() \ 2077ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman ? cast<CallInst>(II)->METHOD \ 2087ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman : cast<InvokeInst>(II)->METHOD 2097ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman 2107ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman#define CALLSITE_DELEGATE_SETTER(METHOD) \ 2117ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman InstrTy *II = getInstruction(); \ 2127ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman if (isCall()) \ 2137ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman cast<CallInst>(II)->METHOD; \ 2147ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman else \ 2157ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman cast<InvokeInst>(II)->METHOD 2167ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman 217cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar unsigned getNumArgOperands() const { 218cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar CALLSITE_DELEGATE_GETTER(getNumArgOperands()); 219cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 220cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 221cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar ValTy *getArgOperand(unsigned i) const { 222cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar CALLSITE_DELEGATE_GETTER(getArgOperand(i)); 223cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 224cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 225cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar bool isInlineAsm() const { 226cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (isCall()) 227cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return cast<CallInst>(getInstruction())->isInlineAsm(); 228cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return false; 229cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 230cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 2317ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman /// getCallingConv/setCallingConv - get or set the calling convention of the 2327ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman /// call. 2337ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman CallingConv::ID getCallingConv() const { 2347ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman CALLSITE_DELEGATE_GETTER(getCallingConv()); 2357ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman } 2367ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman void setCallingConv(CallingConv::ID CC) { 2377ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman CALLSITE_DELEGATE_SETTER(setCallingConv(CC)); 2387ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman } 2397ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman 2406948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar FunctionType *getFunctionType() const { 2416948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar CALLSITE_DELEGATE_GETTER(getFunctionType()); 2426948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 2436948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2446948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar void mutateFunctionType(FunctionType *Ty) const { 2456948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar CALLSITE_DELEGATE_SETTER(mutateFunctionType(Ty)); 2466948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 2476948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar 2487ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman /// getAttributes/setAttributes - get or set the parameter attributes of 2497ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman /// the call. 25099faa3b4ec6d03ac7808fe4ff3fbf3d04e375502Bill Wendling const AttributeSet &getAttributes() const { 2517ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman CALLSITE_DELEGATE_GETTER(getAttributes()); 2527ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman } 25399faa3b4ec6d03ac7808fe4ff3fbf3d04e375502Bill Wendling void setAttributes(const AttributeSet &PAL) { 2547ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman CALLSITE_DELEGATE_SETTER(setAttributes(PAL)); 2557ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman } 2567ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman 257986da6c3fdce52082288094f592e60ba165ae71cNuno Lopes /// \brief Return true if this function has the given attribute. 258629fb82419d9bfff6ae475363bcce66192dfcc8eBill Wendling bool hasFnAttr(Attribute::AttrKind A) const { 2592fa8af224ea026f9432e833fd6f42a216423a010Bill Wendling CALLSITE_DELEGATE_GETTER(hasFnAttr(A)); 260986da6c3fdce52082288094f592e60ba165ae71cNuno Lopes } 261986da6c3fdce52082288094f592e60ba165ae71cNuno Lopes 2623e2d76c946ba753c2b11af192a52e25b6f9b46ffBill Wendling /// \brief Return true if the call or the callee has the given attribute. 263629fb82419d9bfff6ae475363bcce66192dfcc8eBill Wendling bool paramHasAttr(unsigned i, Attribute::AttrKind A) const { 2643e2d76c946ba753c2b11af192a52e25b6f9b46ffBill Wendling CALLSITE_DELEGATE_GETTER(paramHasAttr(i, A)); 2657ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman } 2667ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman 267cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// \brief Return true if the data operand at index \p i directly or 268cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// indirectly has the attribute \p A. 269cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// 270cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// Normal call or invoke arguments have per operand attributes, as specified 271cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// in the attribute set attached to this instruction, while operand bundle 272cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// operands may have some attributes implied by the type of its containing 273cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// operand bundle. 274cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar bool dataOperandHasImpliedAttr(unsigned i, Attribute::AttrKind A) const { 275cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar CALLSITE_DELEGATE_GETTER(dataOperandHasImpliedAttr(i, A)); 276cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 277cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 2787ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman /// @brief Extract the alignment for a call or parameter (0=unknown). 2797ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman uint16_t getParamAlignment(uint16_t i) const { 2807ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman CALLSITE_DELEGATE_GETTER(getParamAlignment(i)); 2817ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman } 2827ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman 28337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// @brief Extract the number of dereferenceable bytes for a call or 28437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// parameter (0=unknown). 28537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines uint64_t getDereferenceableBytes(uint16_t i) const { 28637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines CALLSITE_DELEGATE_GETTER(getDereferenceableBytes(i)); 28737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 288cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 2896948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// @brief Extract the number of dereferenceable_or_null bytes for a call or 2906948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar /// parameter (0=unknown). 2916948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar uint64_t getDereferenceableOrNullBytes(uint16_t i) const { 2926948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar CALLSITE_DELEGATE_GETTER(getDereferenceableOrNullBytes(i)); 2936948897e478cbd66626159776a8017b3c18579b9Pirama Arumuga Nainar } 294cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 295cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// @brief Determine if the parameter or return value is marked with NoAlias 296cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// attribute. 297cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// @param n The parameter to check. 1 is the first parameter, 0 is the return 298cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar bool doesNotAlias(unsigned n) const { 299cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar CALLSITE_DELEGATE_GETTER(doesNotAlias(n)); 300cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 301cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 3022253a2f52f3c46ae75cd05f5885acb987bd1d6b6Michael Gottesman /// \brief Return true if the call should not be treated as a call to a 3032253a2f52f3c46ae75cd05f5885acb987bd1d6b6Michael Gottesman /// builtin. 3042253a2f52f3c46ae75cd05f5885acb987bd1d6b6Michael Gottesman bool isNoBuiltin() const { 3052253a2f52f3c46ae75cd05f5885acb987bd1d6b6Michael Gottesman CALLSITE_DELEGATE_GETTER(isNoBuiltin()); 3062253a2f52f3c46ae75cd05f5885acb987bd1d6b6Michael Gottesman } 3072253a2f52f3c46ae75cd05f5885acb987bd1d6b6Michael Gottesman 3087ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman /// @brief Return true if the call should not be inlined. 3097ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman bool isNoInline() const { 3107ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman CALLSITE_DELEGATE_GETTER(isNoInline()); 3117ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman } 3127ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman void setIsNoInline(bool Value = true) { 313b3344f87ac7833240a40d87d29115bed5f6b2396Nick Lewycky CALLSITE_DELEGATE_SETTER(setIsNoInline(Value)); 3147ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman } 315b3344f87ac7833240a40d87d29115bed5f6b2396Nick Lewycky 3167ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman /// @brief Determine if the call does not access memory. 3177ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman bool doesNotAccessMemory() const { 3187ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman CALLSITE_DELEGATE_GETTER(doesNotAccessMemory()); 3197ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman } 3201b005075b6f0b698eeca69e108688d112bd44519Bill Wendling void setDoesNotAccessMemory() { 3211b005075b6f0b698eeca69e108688d112bd44519Bill Wendling CALLSITE_DELEGATE_SETTER(setDoesNotAccessMemory()); 3227ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman } 3237ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman 3247ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman /// @brief Determine if the call does not access or only reads memory. 3257ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman bool onlyReadsMemory() const { 3267ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman CALLSITE_DELEGATE_GETTER(onlyReadsMemory()); 3277ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman } 3281b005075b6f0b698eeca69e108688d112bd44519Bill Wendling void setOnlyReadsMemory() { 3291b005075b6f0b698eeca69e108688d112bd44519Bill Wendling CALLSITE_DELEGATE_SETTER(setOnlyReadsMemory()); 3307ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman } 3317ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman 332cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// @brief Determine if the call can access memmory only using pointers based 333cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// on its arguments. 334cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar bool onlyAccessesArgMemory() const { 335cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar CALLSITE_DELEGATE_GETTER(onlyAccessesArgMemory()); 336cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 337cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar void setOnlyAccessesArgMemory() { 338cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar CALLSITE_DELEGATE_SETTER(setOnlyAccessesArgMemory()); 339cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 340cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 3417ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman /// @brief Determine if the call cannot return. 3427ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman bool doesNotReturn() const { 3437ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman CALLSITE_DELEGATE_GETTER(doesNotReturn()); 3447ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman } 3451b005075b6f0b698eeca69e108688d112bd44519Bill Wendling void setDoesNotReturn() { 3461b005075b6f0b698eeca69e108688d112bd44519Bill Wendling CALLSITE_DELEGATE_SETTER(setDoesNotReturn()); 3477ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman } 3487ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman 3497ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman /// @brief Determine if the call cannot unwind. 3507ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman bool doesNotThrow() const { 3517ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman CALLSITE_DELEGATE_GETTER(doesNotThrow()); 3527ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman } 3531b005075b6f0b698eeca69e108688d112bd44519Bill Wendling void setDoesNotThrow() { 3541b005075b6f0b698eeca69e108688d112bd44519Bill Wendling CALLSITE_DELEGATE_SETTER(setDoesNotThrow()); 3557ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman } 3567ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman 357cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int getNumOperandBundles() const { 358cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar CALLSITE_DELEGATE_GETTER(getNumOperandBundles()); 359cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 360cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 361cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar bool hasOperandBundles() const { 362cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar CALLSITE_DELEGATE_GETTER(hasOperandBundles()); 363cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 364cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 365cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar int getNumTotalBundleOperands() const { 366cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar CALLSITE_DELEGATE_GETTER(getNumTotalBundleOperands()); 367cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 368cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 369cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar OperandBundleUse getOperandBundleAt(unsigned Index) const { 370cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar CALLSITE_DELEGATE_GETTER(getOperandBundleAt(Index)); 371cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 372cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 373cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Optional<OperandBundleUse> getOperandBundle(StringRef Name) const { 374cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar CALLSITE_DELEGATE_GETTER(getOperandBundle(Name)); 375cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 376cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 377cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Optional<OperandBundleUse> getOperandBundle(uint32_t ID) const { 378cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar CALLSITE_DELEGATE_GETTER(getOperandBundle(ID)); 379cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 380cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 381cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar IterTy arg_begin() const { 382cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar CALLSITE_DELEGATE_GETTER(arg_begin()); 383cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 384cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 385cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar IterTy arg_end() const { 386cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar CALLSITE_DELEGATE_GETTER(arg_end()); 387cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 388cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 3897ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman#undef CALLSITE_DELEGATE_GETTER 3907ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman#undef CALLSITE_DELEGATE_SETTER 3917ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman 392cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar void getOperandBundlesAsDefs(SmallVectorImpl<OperandBundleDef> &Defs) const { 393cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar const Instruction *II = getInstruction(); 394cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar // Since this is actually a getter that "looks like" a setter, don't use the 395cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar // above macros to avoid confusion. 396cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar if (isCall()) 397cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar cast<CallInst>(II)->getOperandBundlesAsDefs(Defs); 398cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar else 399cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar cast<InvokeInst>(II)->getOperandBundlesAsDefs(Defs); 400cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar } 401cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar 402cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar /// @brief Determine whether this data operand is not captured. 403cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar bool doesNotCapture(unsigned OpNo) const { 404cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return dataOperandHasImpliedAttr(OpNo + 1, Attribute::NoCapture); 405173862e5468fbcf4b022b9088d2c81b25c2d60c5Nick Lewycky } 406173862e5468fbcf4b022b9088d2c81b25c2d60c5Nick Lewycky 407173862e5468fbcf4b022b9088d2c81b25c2d60c5Nick Lewycky /// @brief Determine whether this argument is passed by value. 408173862e5468fbcf4b022b9088d2c81b25c2d60c5Nick Lewycky bool isByValArgument(unsigned ArgNo) const { 409034b94b17006f51722886b0f2283fb6fb19aca1fBill Wendling return paramHasAttr(ArgNo + 1, Attribute::ByVal); 410173862e5468fbcf4b022b9088d2c81b25c2d60c5Nick Lewycky } 411173862e5468fbcf4b022b9088d2c81b25c2d60c5Nick Lewycky 41236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// @brief Determine whether this argument is passed in an alloca. 41336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isInAllocaArgument(unsigned ArgNo) const { 41436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return paramHasAttr(ArgNo + 1, Attribute::InAlloca); 41536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 41636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 41736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// @brief Determine whether this argument is passed by value or in an alloca. 41836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool isByValOrInAllocaArgument(unsigned ArgNo) const { 41936b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return paramHasAttr(ArgNo + 1, Attribute::ByVal) || 42036b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines paramHasAttr(ArgNo + 1, Attribute::InAlloca); 42136b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 42236b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 42336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// @brief Determine if there are is an inalloca argument. Only the last 42436b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines /// argument can have the inalloca attribute. 42536b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines bool hasInAllocaArgument() const { 42636b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines return paramHasAttr(arg_size(), Attribute::InAlloca); 42736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines } 42836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines 429cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar bool doesNotAccessMemory(unsigned OpNo) const { 430cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return dataOperandHasImpliedAttr(OpNo + 1, Attribute::ReadNone); 431dc89737bcdbb8f69d8ae7578bdfa904cabcfc5edNick Lewycky } 432dc89737bcdbb8f69d8ae7578bdfa904cabcfc5edNick Lewycky 433cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar bool onlyReadsMemory(unsigned OpNo) const { 434cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar return dataOperandHasImpliedAttr(OpNo + 1, Attribute::ReadOnly) || 435cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar dataOperandHasImpliedAttr(OpNo + 1, Attribute::ReadNone); 436dc89737bcdbb8f69d8ae7578bdfa904cabcfc5edNick Lewycky } 437dc89737bcdbb8f69d8ae7578bdfa904cabcfc5edNick Lewycky 43837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// @brief Return true if the return value is known to be not null. 43937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// This may be because it has the nonnull attribute, or because at least 44037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /// one byte is dereferenceable and the pointer is in addrspace(0). 44137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines bool isReturnNonNull() const { 44237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (paramHasAttr(0, Attribute::NonNull)) 44337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return true; 44437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines else if (getDereferenceableBytes(0) > 0 && 44537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines getType()->getPointerAddressSpace() == 0) 44637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return true; 44737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 44837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return false; 44937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 45037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 4517ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman /// hasArgument - Returns true if this CallSite passes the given Value* as an 4527ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman /// argument to the called function. 4537ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman bool hasArgument(const Value *Arg) const { 4547ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman for (arg_iterator AI = this->arg_begin(), E = this->arg_end(); AI != E; 4557ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman ++AI) 4567ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman if (AI->get() == Arg) 4577ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman return true; 4587ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman return false; 4597ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman } 4607ad3b2a3f0188f5bceb4937e90085c52665672b4Dan Gohman 4618c174a9b5a3c5580aa6110336bb6a7f990dcb3b2Matthijs Kooijmanprivate: 462c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif IterTy getCallee() const { 4633ecf355c7a6f6f559f3c85b46d041ffda5163a8cGabor Greif if (isCall()) // Skip Callee 4643ecf355c7a6f6f559f3c85b46d041ffda5163a8cGabor Greif return cast<CallInst>(getInstruction())->op_end() - 1; 4653ecf355c7a6f6f559f3c85b46d041ffda5163a8cGabor Greif else // Skip BB, BB, Callee 4663ecf355c7a6f6f559f3c85b46d041ffda5163a8cGabor Greif return cast<InvokeInst>(getInstruction())->op_end() - 3; 467c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif } 468c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif}; 469c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif 470cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainarclass CallSite : public CallSiteBase<Function, BasicBlock, Value, User, Use, 471cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar Instruction, CallInst, InvokeInst, 472cddc3e03e4ec99c0268c03a126195173e519ed58Pirama Arumuga Nainar User::op_iterator> { 473c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greifpublic: 474c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif CallSite() {} 4750c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar CallSite(CallSiteBase B) : CallSiteBase(B) {} 4760c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar CallSite(CallInst *CI) : CallSiteBase(CI) {} 4770c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar CallSite(InvokeInst *II) : CallSiteBase(II) {} 4780c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar explicit CallSite(Instruction *II) : CallSiteBase(II) {} 4790c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar explicit CallSite(Value *V) : CallSiteBase(V) {} 480c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif 481c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif bool operator==(const CallSite &CS) const { return I == CS.I; } 482c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif bool operator!=(const CallSite &CS) const { return I != CS.I; } 483c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif bool operator<(const CallSite &CS) const { 484c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif return getInstruction() < CS.getInstruction(); 485c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif } 486c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greif 487c8b82ccbcf3b2e2384d2c0b5176e7b0b40b7f82fGabor Greifprivate: 488c9f7500d1752feac7cece26d20007a99d21f677cGabor Greif User::op_iterator getCallee() const; 48993a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattner}; 49093a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattner 49179fca6fea87be7221843031870bbf2c9ae1fc555Dan Gohman/// ImmutableCallSite - establish a view to a call site for examination 49279fca6fea87be7221843031870bbf2c9ae1fc555Dan Gohmanclass ImmutableCallSite : public CallSiteBase<> { 49379fca6fea87be7221843031870bbf2c9ae1fc555Dan Gohmanpublic: 4940c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar ImmutableCallSite() {} 4950c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar ImmutableCallSite(const CallInst *CI) : CallSiteBase(CI) {} 4960c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar ImmutableCallSite(const InvokeInst *II) : CallSiteBase(II) {} 4970c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar explicit ImmutableCallSite(const Instruction *II) : CallSiteBase(II) {} 4980c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar explicit ImmutableCallSite(const Value *V) : CallSiteBase(V) {} 4990c7f116bb6950ef819323d855415b2f2b0aad987Pirama Arumuga Nainar ImmutableCallSite(CallSite CS) : CallSiteBase(CS.getInstruction()) {} 50079fca6fea87be7221843031870bbf2c9ae1fc555Dan Gohman}; 50179fca6fea87be7221843031870bbf2c9ae1fc555Dan Gohman 502d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke} // End llvm namespace 503d0fde30ce850b78371fd1386338350591f9ff494Brian Gaeke 50493a7e08d1fb087c3e26775838bfaad1d8eb99f11Chris Lattner#endif 505