1 //===- CallSite.h - Abstract Call & Invoke instrs ---------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file defines the CallSite class, which is a handy wrapper for code that 11 // wants to treat Call and Invoke instructions in a generic way. When in non- 12 // mutation context (e.g. an analysis) ImmutableCallSite should be used. 13 // Finally, when some degree of customization is necessary between these two 14 // extremes, CallSiteBase<> can be supplied with fine-tuned parameters. 15 // 16 // NOTE: These classes are supposed to have "value semantics". So they should be 17 // passed by value, not by reference; they should not be "new"ed or "delete"d. 18 // They are efficiently copyable, assignable and constructable, with cost 19 // equivalent to copying a pointer (notice that they have only a single data 20 // member). The internal representation carries a flag which indicates which of 21 // the two variants is enclosed. This allows for cheaper checks when various 22 // accessors of CallSite are employed. 23 // 24 //===----------------------------------------------------------------------===// 25 26 #ifndef LLVM_IR_CALLSITE_H 27 #define LLVM_IR_CALLSITE_H 28 29 #include "llvm/ADT/PointerIntPair.h" 30 #include "llvm/ADT/iterator_range.h" 31 #include "llvm/IR/Attributes.h" 32 #include "llvm/IR/CallingConv.h" 33 #include "llvm/IR/Instructions.h" 34 35 namespace llvm { 36 37 class CallInst; 38 class InvokeInst; 39 40 template <typename FunTy = const Function, 41 typename BBTy = const BasicBlock, 42 typename ValTy = const Value, 43 typename UserTy = const User, 44 typename UseTy = const Use, 45 typename InstrTy = const Instruction, 46 typename CallTy = const CallInst, 47 typename InvokeTy = const InvokeInst, 48 typename IterTy = User::const_op_iterator> 49 class CallSiteBase { 50 protected: 51 PointerIntPair<InstrTy*, 1, bool> I; 52 CallSiteBase()53 CallSiteBase() : I(nullptr, false) {} CallSiteBase(CallTy * CI)54 CallSiteBase(CallTy *CI) : I(CI, true) { assert(CI); } CallSiteBase(InvokeTy * II)55 CallSiteBase(InvokeTy *II) : I(II, false) { assert(II); } CallSiteBase(ValTy * II)56 explicit CallSiteBase(ValTy *II) { *this = get(II); } 57 58 private: 59 /// CallSiteBase::get - This static method is sort of like a constructor. It 60 /// will create an appropriate call site for a Call or Invoke instruction, but 61 /// it can also create a null initialized CallSiteBase object for something 62 /// which is NOT a call site. 63 /// get(ValTy * V)64 static CallSiteBase get(ValTy *V) { 65 if (InstrTy *II = dyn_cast<InstrTy>(V)) { 66 if (II->getOpcode() == Instruction::Call) 67 return CallSiteBase(static_cast<CallTy*>(II)); 68 else if (II->getOpcode() == Instruction::Invoke) 69 return CallSiteBase(static_cast<InvokeTy*>(II)); 70 } 71 return CallSiteBase(); 72 } 73 74 public: 75 /// isCall - true if a CallInst is enclosed. 76 /// Note that !isCall() does not mean it is an InvokeInst enclosed, 77 /// it also could signify a NULL Instruction pointer. isCall()78 bool isCall() const { return I.getInt(); } 79 80 /// isInvoke - true if a InvokeInst is enclosed. 81 /// isInvoke()82 bool isInvoke() const { return getInstruction() && !I.getInt(); } 83 getInstruction()84 InstrTy *getInstruction() const { return I.getPointer(); } 85 InstrTy *operator->() const { return I.getPointer(); } 86 explicit operator bool() const { return I.getPointer(); } 87 88 /// Get the basic block containing the call site getParent()89 BBTy* getParent() const { return getInstruction()->getParent(); } 90 91 /// getCalledValue - Return the pointer to function that is being called. 92 /// getCalledValue()93 ValTy *getCalledValue() const { 94 assert(getInstruction() && "Not a call or invoke instruction!"); 95 return *getCallee(); 96 } 97 98 /// getCalledFunction - Return the function being called if this is a direct 99 /// call, otherwise return null (if it's an indirect call). 100 /// getCalledFunction()101 FunTy *getCalledFunction() const { 102 return dyn_cast<FunTy>(getCalledValue()); 103 } 104 105 /// setCalledFunction - Set the callee to the specified value. 106 /// setCalledFunction(Value * V)107 void setCalledFunction(Value *V) { 108 assert(getInstruction() && "Not a call or invoke instruction!"); 109 *getCallee() = V; 110 } 111 112 /// isCallee - Determine whether the passed iterator points to the 113 /// callee operand's Use. isCallee(Value::const_user_iterator UI)114 bool isCallee(Value::const_user_iterator UI) const { 115 return isCallee(&UI.getUse()); 116 } 117 118 /// Determine whether this Use is the callee operand's Use. isCallee(const Use * U)119 bool isCallee(const Use *U) const { return getCallee() == U; } 120 getArgument(unsigned ArgNo)121 ValTy *getArgument(unsigned ArgNo) const { 122 assert(arg_begin() + ArgNo < arg_end() && "Argument # out of range!"); 123 return *(arg_begin() + ArgNo); 124 } 125 setArgument(unsigned ArgNo,Value * newVal)126 void setArgument(unsigned ArgNo, Value* newVal) { 127 assert(getInstruction() && "Not a call or invoke instruction!"); 128 assert(arg_begin() + ArgNo < arg_end() && "Argument # out of range!"); 129 getInstruction()->setOperand(ArgNo, newVal); 130 } 131 132 /// Given a value use iterator, returns the argument that corresponds to it. 133 /// Iterator must actually correspond to an argument. getArgumentNo(Value::const_user_iterator I)134 unsigned getArgumentNo(Value::const_user_iterator I) const { 135 return getArgumentNo(&I.getUse()); 136 } 137 138 /// Given a use for an argument, get the argument number that corresponds to 139 /// it. getArgumentNo(const Use * U)140 unsigned getArgumentNo(const Use *U) const { 141 assert(getInstruction() && "Not a call or invoke instruction!"); 142 assert(arg_begin() <= U && U < arg_end() 143 && "Argument # out of range!"); 144 return U - arg_begin(); 145 } 146 147 /// arg_iterator - The type of iterator to use when looping over actual 148 /// arguments at this call site. 149 typedef IterTy arg_iterator; 150 args()151 iterator_range<IterTy> args() const { 152 return make_range(arg_begin(), arg_end()); 153 } arg_empty()154 bool arg_empty() const { return arg_end() == arg_begin(); } arg_size()155 unsigned arg_size() const { return unsigned(arg_end() - arg_begin()); } 156 157 /// Type of iterator to use when looping over data operands at this call site 158 /// (see below). 159 typedef IterTy data_operand_iterator; 160 161 /// data_operands_begin/data_operands_end - Return iterators iterating over 162 /// the call / invoke argument list and bundle operands. For invokes, this is 163 /// the set of instruction operands except the invoke target and the two 164 /// successor blocks; and for calls this is the set of instruction operands 165 /// except the call target. 166 data_operands_begin()167 IterTy data_operands_begin() const { 168 assert(getInstruction() && "Not a call or invoke instruction!"); 169 return (*this)->op_begin(); 170 } data_operands_end()171 IterTy data_operands_end() const { 172 assert(getInstruction() && "Not a call or invoke instruction!"); 173 return (*this)->op_end() - (isCall() ? 1 : 3); 174 } data_ops()175 iterator_range<IterTy> data_ops() const { 176 return make_range(data_operands_begin(), data_operands_end()); 177 } data_operands_empty()178 bool data_operands_empty() const { 179 return data_operands_end() == data_operands_begin(); 180 } data_operands_size()181 unsigned data_operands_size() const { 182 return std::distance(data_operands_begin(), data_operands_end()); 183 } 184 185 /// getType - Return the type of the instruction that generated this call site 186 /// getType()187 Type *getType() const { return (*this)->getType(); } 188 189 /// getCaller - Return the caller function for this call site 190 /// getCaller()191 FunTy *getCaller() const { return (*this)->getParent()->getParent(); } 192 193 /// \brief Tests if this call site must be tail call optimized. Only a 194 /// CallInst can be tail call optimized. isMustTailCall()195 bool isMustTailCall() const { 196 return isCall() && cast<CallInst>(getInstruction())->isMustTailCall(); 197 } 198 199 /// \brief Tests if this call site is marked as a tail call. isTailCall()200 bool isTailCall() const { 201 return isCall() && cast<CallInst>(getInstruction())->isTailCall(); 202 } 203 204 #define CALLSITE_DELEGATE_GETTER(METHOD) \ 205 InstrTy *II = getInstruction(); \ 206 return isCall() \ 207 ? cast<CallInst>(II)->METHOD \ 208 : cast<InvokeInst>(II)->METHOD 209 210 #define CALLSITE_DELEGATE_SETTER(METHOD) \ 211 InstrTy *II = getInstruction(); \ 212 if (isCall()) \ 213 cast<CallInst>(II)->METHOD; \ 214 else \ 215 cast<InvokeInst>(II)->METHOD 216 getNumArgOperands()217 unsigned getNumArgOperands() const { 218 CALLSITE_DELEGATE_GETTER(getNumArgOperands()); 219 } 220 getArgOperand(unsigned i)221 ValTy *getArgOperand(unsigned i) const { 222 CALLSITE_DELEGATE_GETTER(getArgOperand(i)); 223 } 224 isInlineAsm()225 bool isInlineAsm() const { 226 if (isCall()) 227 return cast<CallInst>(getInstruction())->isInlineAsm(); 228 return false; 229 } 230 231 /// getCallingConv/setCallingConv - get or set the calling convention of the 232 /// call. getCallingConv()233 CallingConv::ID getCallingConv() const { 234 CALLSITE_DELEGATE_GETTER(getCallingConv()); 235 } setCallingConv(CallingConv::ID CC)236 void setCallingConv(CallingConv::ID CC) { 237 CALLSITE_DELEGATE_SETTER(setCallingConv(CC)); 238 } 239 getFunctionType()240 FunctionType *getFunctionType() const { 241 CALLSITE_DELEGATE_GETTER(getFunctionType()); 242 } 243 mutateFunctionType(FunctionType * Ty)244 void mutateFunctionType(FunctionType *Ty) const { 245 CALLSITE_DELEGATE_SETTER(mutateFunctionType(Ty)); 246 } 247 248 /// getAttributes/setAttributes - get or set the parameter attributes of 249 /// the call. getAttributes()250 const AttributeSet &getAttributes() const { 251 CALLSITE_DELEGATE_GETTER(getAttributes()); 252 } setAttributes(const AttributeSet & PAL)253 void setAttributes(const AttributeSet &PAL) { 254 CALLSITE_DELEGATE_SETTER(setAttributes(PAL)); 255 } 256 257 /// \brief Return true if this function has the given attribute. hasFnAttr(Attribute::AttrKind A)258 bool hasFnAttr(Attribute::AttrKind A) const { 259 CALLSITE_DELEGATE_GETTER(hasFnAttr(A)); 260 } 261 262 /// \brief Return true if the call or the callee has the given attribute. paramHasAttr(unsigned i,Attribute::AttrKind A)263 bool paramHasAttr(unsigned i, Attribute::AttrKind A) const { 264 CALLSITE_DELEGATE_GETTER(paramHasAttr(i, A)); 265 } 266 267 /// \brief Return true if the data operand at index \p i directly or 268 /// indirectly has the attribute \p A. 269 /// 270 /// Normal call or invoke arguments have per operand attributes, as specified 271 /// in the attribute set attached to this instruction, while operand bundle 272 /// operands may have some attributes implied by the type of its containing 273 /// operand bundle. dataOperandHasImpliedAttr(unsigned i,Attribute::AttrKind A)274 bool dataOperandHasImpliedAttr(unsigned i, Attribute::AttrKind A) const { 275 CALLSITE_DELEGATE_GETTER(dataOperandHasImpliedAttr(i, A)); 276 } 277 278 /// @brief Extract the alignment for a call or parameter (0=unknown). getParamAlignment(uint16_t i)279 uint16_t getParamAlignment(uint16_t i) const { 280 CALLSITE_DELEGATE_GETTER(getParamAlignment(i)); 281 } 282 283 /// @brief Extract the number of dereferenceable bytes for a call or 284 /// parameter (0=unknown). getDereferenceableBytes(uint16_t i)285 uint64_t getDereferenceableBytes(uint16_t i) const { 286 CALLSITE_DELEGATE_GETTER(getDereferenceableBytes(i)); 287 } 288 289 /// @brief Extract the number of dereferenceable_or_null bytes for a call or 290 /// parameter (0=unknown). getDereferenceableOrNullBytes(uint16_t i)291 uint64_t getDereferenceableOrNullBytes(uint16_t i) const { 292 CALLSITE_DELEGATE_GETTER(getDereferenceableOrNullBytes(i)); 293 } 294 295 /// @brief Determine if the parameter or return value is marked with NoAlias 296 /// attribute. 297 /// @param n The parameter to check. 1 is the first parameter, 0 is the return doesNotAlias(unsigned n)298 bool doesNotAlias(unsigned n) const { 299 CALLSITE_DELEGATE_GETTER(doesNotAlias(n)); 300 } 301 302 /// \brief Return true if the call should not be treated as a call to a 303 /// builtin. isNoBuiltin()304 bool isNoBuiltin() const { 305 CALLSITE_DELEGATE_GETTER(isNoBuiltin()); 306 } 307 308 /// @brief Return true if the call should not be inlined. isNoInline()309 bool isNoInline() const { 310 CALLSITE_DELEGATE_GETTER(isNoInline()); 311 } 312 void setIsNoInline(bool Value = true) { 313 CALLSITE_DELEGATE_SETTER(setIsNoInline(Value)); 314 } 315 316 /// @brief Determine if the call does not access memory. doesNotAccessMemory()317 bool doesNotAccessMemory() const { 318 CALLSITE_DELEGATE_GETTER(doesNotAccessMemory()); 319 } setDoesNotAccessMemory()320 void setDoesNotAccessMemory() { 321 CALLSITE_DELEGATE_SETTER(setDoesNotAccessMemory()); 322 } 323 324 /// @brief Determine if the call does not access or only reads memory. onlyReadsMemory()325 bool onlyReadsMemory() const { 326 CALLSITE_DELEGATE_GETTER(onlyReadsMemory()); 327 } setOnlyReadsMemory()328 void setOnlyReadsMemory() { 329 CALLSITE_DELEGATE_SETTER(setOnlyReadsMemory()); 330 } 331 332 /// @brief Determine if the call can access memmory only using pointers based 333 /// on its arguments. onlyAccessesArgMemory()334 bool onlyAccessesArgMemory() const { 335 CALLSITE_DELEGATE_GETTER(onlyAccessesArgMemory()); 336 } setOnlyAccessesArgMemory()337 void setOnlyAccessesArgMemory() { 338 CALLSITE_DELEGATE_SETTER(setOnlyAccessesArgMemory()); 339 } 340 341 /// @brief Determine if the call cannot return. doesNotReturn()342 bool doesNotReturn() const { 343 CALLSITE_DELEGATE_GETTER(doesNotReturn()); 344 } setDoesNotReturn()345 void setDoesNotReturn() { 346 CALLSITE_DELEGATE_SETTER(setDoesNotReturn()); 347 } 348 349 /// @brief Determine if the call cannot unwind. doesNotThrow()350 bool doesNotThrow() const { 351 CALLSITE_DELEGATE_GETTER(doesNotThrow()); 352 } setDoesNotThrow()353 void setDoesNotThrow() { 354 CALLSITE_DELEGATE_SETTER(setDoesNotThrow()); 355 } 356 getNumOperandBundles()357 int getNumOperandBundles() const { 358 CALLSITE_DELEGATE_GETTER(getNumOperandBundles()); 359 } 360 hasOperandBundles()361 bool hasOperandBundles() const { 362 CALLSITE_DELEGATE_GETTER(hasOperandBundles()); 363 } 364 getNumTotalBundleOperands()365 int getNumTotalBundleOperands() const { 366 CALLSITE_DELEGATE_GETTER(getNumTotalBundleOperands()); 367 } 368 getOperandBundleAt(unsigned Index)369 OperandBundleUse getOperandBundleAt(unsigned Index) const { 370 CALLSITE_DELEGATE_GETTER(getOperandBundleAt(Index)); 371 } 372 getOperandBundle(StringRef Name)373 Optional<OperandBundleUse> getOperandBundle(StringRef Name) const { 374 CALLSITE_DELEGATE_GETTER(getOperandBundle(Name)); 375 } 376 getOperandBundle(uint32_t ID)377 Optional<OperandBundleUse> getOperandBundle(uint32_t ID) const { 378 CALLSITE_DELEGATE_GETTER(getOperandBundle(ID)); 379 } 380 arg_begin()381 IterTy arg_begin() const { 382 CALLSITE_DELEGATE_GETTER(arg_begin()); 383 } 384 arg_end()385 IterTy arg_end() const { 386 CALLSITE_DELEGATE_GETTER(arg_end()); 387 } 388 389 #undef CALLSITE_DELEGATE_GETTER 390 #undef CALLSITE_DELEGATE_SETTER 391 getOperandBundlesAsDefs(SmallVectorImpl<OperandBundleDef> & Defs)392 void getOperandBundlesAsDefs(SmallVectorImpl<OperandBundleDef> &Defs) const { 393 const Instruction *II = getInstruction(); 394 // Since this is actually a getter that "looks like" a setter, don't use the 395 // above macros to avoid confusion. 396 if (isCall()) 397 cast<CallInst>(II)->getOperandBundlesAsDefs(Defs); 398 else 399 cast<InvokeInst>(II)->getOperandBundlesAsDefs(Defs); 400 } 401 402 /// @brief Determine whether this data operand is not captured. doesNotCapture(unsigned OpNo)403 bool doesNotCapture(unsigned OpNo) const { 404 return dataOperandHasImpliedAttr(OpNo + 1, Attribute::NoCapture); 405 } 406 407 /// @brief Determine whether this argument is passed by value. isByValArgument(unsigned ArgNo)408 bool isByValArgument(unsigned ArgNo) const { 409 return paramHasAttr(ArgNo + 1, Attribute::ByVal); 410 } 411 412 /// @brief Determine whether this argument is passed in an alloca. isInAllocaArgument(unsigned ArgNo)413 bool isInAllocaArgument(unsigned ArgNo) const { 414 return paramHasAttr(ArgNo + 1, Attribute::InAlloca); 415 } 416 417 /// @brief Determine whether this argument is passed by value or in an alloca. isByValOrInAllocaArgument(unsigned ArgNo)418 bool isByValOrInAllocaArgument(unsigned ArgNo) const { 419 return paramHasAttr(ArgNo + 1, Attribute::ByVal) || 420 paramHasAttr(ArgNo + 1, Attribute::InAlloca); 421 } 422 423 /// @brief Determine if there are is an inalloca argument. Only the last 424 /// argument can have the inalloca attribute. hasInAllocaArgument()425 bool hasInAllocaArgument() const { 426 return paramHasAttr(arg_size(), Attribute::InAlloca); 427 } 428 doesNotAccessMemory(unsigned OpNo)429 bool doesNotAccessMemory(unsigned OpNo) const { 430 return dataOperandHasImpliedAttr(OpNo + 1, Attribute::ReadNone); 431 } 432 onlyReadsMemory(unsigned OpNo)433 bool onlyReadsMemory(unsigned OpNo) const { 434 return dataOperandHasImpliedAttr(OpNo + 1, Attribute::ReadOnly) || 435 dataOperandHasImpliedAttr(OpNo + 1, Attribute::ReadNone); 436 } 437 438 /// @brief Return true if the return value is known to be not null. 439 /// This may be because it has the nonnull attribute, or because at least 440 /// one byte is dereferenceable and the pointer is in addrspace(0). isReturnNonNull()441 bool isReturnNonNull() const { 442 if (paramHasAttr(0, Attribute::NonNull)) 443 return true; 444 else if (getDereferenceableBytes(0) > 0 && 445 getType()->getPointerAddressSpace() == 0) 446 return true; 447 448 return false; 449 } 450 451 /// hasArgument - Returns true if this CallSite passes the given Value* as an 452 /// argument to the called function. hasArgument(const Value * Arg)453 bool hasArgument(const Value *Arg) const { 454 for (arg_iterator AI = this->arg_begin(), E = this->arg_end(); AI != E; 455 ++AI) 456 if (AI->get() == Arg) 457 return true; 458 return false; 459 } 460 461 private: getCallee()462 IterTy getCallee() const { 463 if (isCall()) // Skip Callee 464 return cast<CallInst>(getInstruction())->op_end() - 1; 465 else // Skip BB, BB, Callee 466 return cast<InvokeInst>(getInstruction())->op_end() - 3; 467 } 468 }; 469 470 class CallSite : public CallSiteBase<Function, BasicBlock, Value, User, Use, 471 Instruction, CallInst, InvokeInst, 472 User::op_iterator> { 473 public: CallSite()474 CallSite() {} CallSite(CallSiteBase B)475 CallSite(CallSiteBase B) : CallSiteBase(B) {} CallSite(CallInst * CI)476 CallSite(CallInst *CI) : CallSiteBase(CI) {} CallSite(InvokeInst * II)477 CallSite(InvokeInst *II) : CallSiteBase(II) {} CallSite(Instruction * II)478 explicit CallSite(Instruction *II) : CallSiteBase(II) {} CallSite(Value * V)479 explicit CallSite(Value *V) : CallSiteBase(V) {} 480 481 bool operator==(const CallSite &CS) const { return I == CS.I; } 482 bool operator!=(const CallSite &CS) const { return I != CS.I; } 483 bool operator<(const CallSite &CS) const { 484 return getInstruction() < CS.getInstruction(); 485 } 486 487 private: 488 User::op_iterator getCallee() const; 489 }; 490 491 /// ImmutableCallSite - establish a view to a call site for examination 492 class ImmutableCallSite : public CallSiteBase<> { 493 public: ImmutableCallSite()494 ImmutableCallSite() {} ImmutableCallSite(const CallInst * CI)495 ImmutableCallSite(const CallInst *CI) : CallSiteBase(CI) {} ImmutableCallSite(const InvokeInst * II)496 ImmutableCallSite(const InvokeInst *II) : CallSiteBase(II) {} ImmutableCallSite(const Instruction * II)497 explicit ImmutableCallSite(const Instruction *II) : CallSiteBase(II) {} ImmutableCallSite(const Value * V)498 explicit ImmutableCallSite(const Value *V) : CallSiteBase(V) {} ImmutableCallSite(CallSite CS)499 ImmutableCallSite(CallSite CS) : CallSiteBase(CS.getInstruction()) {} 500 }; 501 502 } // End llvm namespace 503 504 #endif 505