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/Optional.h" 30 #include "llvm/ADT/PointerIntPair.h" 31 #include "llvm/ADT/iterator_range.h" 32 #include "llvm/IR/Attributes.h" 33 #include "llvm/IR/CallingConv.h" 34 #include "llvm/IR/Function.h" 35 #include "llvm/IR/InstrTypes.h" 36 #include "llvm/IR/Instruction.h" 37 #include "llvm/IR/Instructions.h" 38 #include "llvm/IR/Use.h" 39 #include "llvm/IR/User.h" 40 #include "llvm/IR/Value.h" 41 #include "llvm/Support/Casting.h" 42 #include <cassert> 43 #include <cstdint> 44 #include <iterator> 45 46 namespace llvm { 47 48 namespace Intrinsic { 49 enum ID : unsigned; 50 } 51 52 template <typename FunTy = const Function, 53 typename BBTy = const BasicBlock, 54 typename ValTy = const Value, 55 typename UserTy = const User, 56 typename UseTy = const Use, 57 typename InstrTy = const Instruction, 58 typename CallTy = const CallInst, 59 typename InvokeTy = const InvokeInst, 60 typename IterTy = User::const_op_iterator> 61 class CallSiteBase { 62 protected: 63 PointerIntPair<InstrTy*, 1, bool> I; 64 65 CallSiteBase() = default; CallSiteBase(CallTy * CI)66 CallSiteBase(CallTy *CI) : I(CI, true) { assert(CI); } CallSiteBase(InvokeTy * II)67 CallSiteBase(InvokeTy *II) : I(II, false) { assert(II); } CallSiteBase(ValTy * II)68 explicit CallSiteBase(ValTy *II) { *this = get(II); } 69 70 private: 71 /// This static method is like a constructor. It will create an appropriate 72 /// call site for a Call or Invoke instruction, but it can also create a null 73 /// initialized CallSiteBase object for something which is NOT a call site. get(ValTy * V)74 static CallSiteBase get(ValTy *V) { 75 if (InstrTy *II = dyn_cast<InstrTy>(V)) { 76 if (II->getOpcode() == Instruction::Call) 77 return CallSiteBase(static_cast<CallTy*>(II)); 78 else if (II->getOpcode() == Instruction::Invoke) 79 return CallSiteBase(static_cast<InvokeTy*>(II)); 80 } 81 return CallSiteBase(); 82 } 83 84 public: 85 /// Return true if a CallInst is enclosed. Note that !isCall() does not mean 86 /// an InvokeInst is enclosed. It may also signify a NULL instruction pointer. isCall()87 bool isCall() const { return I.getInt(); } 88 89 /// Return true if a InvokeInst is enclosed. isInvoke()90 bool isInvoke() const { return getInstruction() && !I.getInt(); } 91 getInstruction()92 InstrTy *getInstruction() const { return I.getPointer(); } 93 InstrTy *operator->() const { return I.getPointer(); } 94 explicit operator bool() const { return I.getPointer(); } 95 96 /// Get the basic block containing the call site. getParent()97 BBTy* getParent() const { return getInstruction()->getParent(); } 98 99 /// Return the pointer to function that is being called. getCalledValue()100 ValTy *getCalledValue() const { 101 assert(getInstruction() && "Not a call or invoke instruction!"); 102 return *getCallee(); 103 } 104 105 /// Return the function being called if this is a direct call, otherwise 106 /// return null (if it's an indirect call). getCalledFunction()107 FunTy *getCalledFunction() const { 108 return dyn_cast<FunTy>(getCalledValue()); 109 } 110 111 /// Return true if the callsite is an indirect call. isIndirectCall()112 bool isIndirectCall() const { 113 const Value *V = getCalledValue(); 114 if (!V) 115 return false; 116 if (isa<FunTy>(V) || isa<Constant>(V)) 117 return false; 118 if (const CallInst *CI = dyn_cast<CallInst>(getInstruction())) { 119 if (CI->isInlineAsm()) 120 return false; 121 } 122 return true; 123 } 124 125 /// Set the callee to the specified value. setCalledFunction(Value * V)126 void setCalledFunction(Value *V) { 127 assert(getInstruction() && "Not a call or invoke instruction!"); 128 *getCallee() = V; 129 } 130 131 /// Return the intrinsic ID of the intrinsic called by this CallSite, 132 /// or Intrinsic::not_intrinsic if the called function is not an 133 /// intrinsic, or if this CallSite is an indirect call. getIntrinsicID()134 Intrinsic::ID getIntrinsicID() const { 135 if (auto *F = getCalledFunction()) 136 return F->getIntrinsicID(); 137 // Don't use Intrinsic::not_intrinsic, as it will require pulling 138 // Intrinsics.h into every header that uses CallSite. 139 return static_cast<Intrinsic::ID>(0); 140 } 141 142 /// Determine whether the passed iterator points to the callee operand's Use. isCallee(Value::const_user_iterator UI)143 bool isCallee(Value::const_user_iterator UI) const { 144 return isCallee(&UI.getUse()); 145 } 146 147 /// Determine whether this Use is the callee operand's Use. isCallee(const Use * U)148 bool isCallee(const Use *U) const { return getCallee() == U; } 149 150 /// Determine whether the passed iterator points to an argument operand. isArgOperand(Value::const_user_iterator UI)151 bool isArgOperand(Value::const_user_iterator UI) const { 152 return isArgOperand(&UI.getUse()); 153 } 154 155 /// Determine whether the passed use points to an argument operand. isArgOperand(const Use * U)156 bool isArgOperand(const Use *U) const { 157 assert(getInstruction() == U->getUser()); 158 return arg_begin() <= U && U < arg_end(); 159 } 160 161 /// Determine whether the passed iterator points to a bundle operand. isBundleOperand(Value::const_user_iterator UI)162 bool isBundleOperand(Value::const_user_iterator UI) const { 163 return isBundleOperand(&UI.getUse()); 164 } 165 166 /// Determine whether the passed use points to a bundle operand. isBundleOperand(const Use * U)167 bool isBundleOperand(const Use *U) const { 168 assert(getInstruction() == U->getUser()); 169 if (!hasOperandBundles()) 170 return false; 171 unsigned OperandNo = U - (*this)->op_begin(); 172 return getBundleOperandsStartIndex() <= OperandNo && 173 OperandNo < getBundleOperandsEndIndex(); 174 } 175 176 /// Determine whether the passed iterator points to a data operand. isDataOperand(Value::const_user_iterator UI)177 bool isDataOperand(Value::const_user_iterator UI) const { 178 return isDataOperand(&UI.getUse()); 179 } 180 181 /// Determine whether the passed use points to a data operand. isDataOperand(const Use * U)182 bool isDataOperand(const Use *U) const { 183 return data_operands_begin() <= U && U < data_operands_end(); 184 } 185 getArgument(unsigned ArgNo)186 ValTy *getArgument(unsigned ArgNo) const { 187 assert(arg_begin() + ArgNo < arg_end() && "Argument # out of range!"); 188 return *(arg_begin() + ArgNo); 189 } 190 setArgument(unsigned ArgNo,Value * newVal)191 void setArgument(unsigned ArgNo, Value* newVal) { 192 assert(getInstruction() && "Not a call or invoke instruction!"); 193 assert(arg_begin() + ArgNo < arg_end() && "Argument # out of range!"); 194 getInstruction()->setOperand(ArgNo, newVal); 195 } 196 197 /// Given a value use iterator, returns the argument that corresponds to it. 198 /// Iterator must actually correspond to an argument. getArgumentNo(Value::const_user_iterator I)199 unsigned getArgumentNo(Value::const_user_iterator I) const { 200 return getArgumentNo(&I.getUse()); 201 } 202 203 /// Given a use for an argument, get the argument number that corresponds to 204 /// it. getArgumentNo(const Use * U)205 unsigned getArgumentNo(const Use *U) const { 206 assert(getInstruction() && "Not a call or invoke instruction!"); 207 assert(isArgOperand(U) && "Argument # out of range!"); 208 return U - arg_begin(); 209 } 210 211 /// The type of iterator to use when looping over actual arguments at this 212 /// call site. 213 using arg_iterator = IterTy; 214 args()215 iterator_range<IterTy> args() const { 216 return make_range(arg_begin(), arg_end()); 217 } arg_empty()218 bool arg_empty() const { return arg_end() == arg_begin(); } arg_size()219 unsigned arg_size() const { return unsigned(arg_end() - arg_begin()); } 220 221 /// Given a value use iterator, return the data operand corresponding to it. 222 /// Iterator must actually correspond to a data operand. getDataOperandNo(Value::const_user_iterator UI)223 unsigned getDataOperandNo(Value::const_user_iterator UI) const { 224 return getDataOperandNo(&UI.getUse()); 225 } 226 227 /// Given a use for a data operand, get the data operand number that 228 /// corresponds to it. getDataOperandNo(const Use * U)229 unsigned getDataOperandNo(const Use *U) const { 230 assert(getInstruction() && "Not a call or invoke instruction!"); 231 assert(isDataOperand(U) && "Data operand # out of range!"); 232 return U - data_operands_begin(); 233 } 234 235 /// Type of iterator to use when looping over data operands at this call site 236 /// (see below). 237 using data_operand_iterator = IterTy; 238 239 /// data_operands_begin/data_operands_end - Return iterators iterating over 240 /// the call / invoke argument list and bundle operands. For invokes, this is 241 /// the set of instruction operands except the invoke target and the two 242 /// successor blocks; and for calls this is the set of instruction operands 243 /// except the call target. 244 data_operands_begin()245 IterTy data_operands_begin() const { 246 assert(getInstruction() && "Not a call or invoke instruction!"); 247 return (*this)->op_begin(); 248 } data_operands_end()249 IterTy data_operands_end() const { 250 assert(getInstruction() && "Not a call or invoke instruction!"); 251 return (*this)->op_end() - (isCall() ? 1 : 3); 252 } data_ops()253 iterator_range<IterTy> data_ops() const { 254 return make_range(data_operands_begin(), data_operands_end()); 255 } data_operands_empty()256 bool data_operands_empty() const { 257 return data_operands_end() == data_operands_begin(); 258 } data_operands_size()259 unsigned data_operands_size() const { 260 return std::distance(data_operands_begin(), data_operands_end()); 261 } 262 263 /// Return the type of the instruction that generated this call site. getType()264 Type *getType() const { return (*this)->getType(); } 265 266 /// Return the caller function for this call site. getCaller()267 FunTy *getCaller() const { return (*this)->getParent()->getParent(); } 268 269 /// Tests if this call site must be tail call optimized. Only a CallInst can 270 /// be tail call optimized. isMustTailCall()271 bool isMustTailCall() const { 272 return isCall() && cast<CallInst>(getInstruction())->isMustTailCall(); 273 } 274 275 /// Tests if this call site is marked as a tail call. isTailCall()276 bool isTailCall() const { 277 return isCall() && cast<CallInst>(getInstruction())->isTailCall(); 278 } 279 280 #define CALLSITE_DELEGATE_GETTER(METHOD) \ 281 InstrTy *II = getInstruction(); \ 282 return isCall() \ 283 ? cast<CallInst>(II)->METHOD \ 284 : cast<InvokeInst>(II)->METHOD 285 286 #define CALLSITE_DELEGATE_SETTER(METHOD) \ 287 InstrTy *II = getInstruction(); \ 288 if (isCall()) \ 289 cast<CallInst>(II)->METHOD; \ 290 else \ 291 cast<InvokeInst>(II)->METHOD 292 getNumArgOperands()293 unsigned getNumArgOperands() const { 294 CALLSITE_DELEGATE_GETTER(getNumArgOperands()); 295 } 296 getArgOperand(unsigned i)297 ValTy *getArgOperand(unsigned i) const { 298 CALLSITE_DELEGATE_GETTER(getArgOperand(i)); 299 } 300 getReturnedArgOperand()301 ValTy *getReturnedArgOperand() const { 302 CALLSITE_DELEGATE_GETTER(getReturnedArgOperand()); 303 } 304 isInlineAsm()305 bool isInlineAsm() const { 306 if (isCall()) 307 return cast<CallInst>(getInstruction())->isInlineAsm(); 308 return false; 309 } 310 311 /// Get the calling convention of the call. getCallingConv()312 CallingConv::ID getCallingConv() const { 313 CALLSITE_DELEGATE_GETTER(getCallingConv()); 314 } 315 /// Set the calling convention of the call. setCallingConv(CallingConv::ID CC)316 void setCallingConv(CallingConv::ID CC) { 317 CALLSITE_DELEGATE_SETTER(setCallingConv(CC)); 318 } 319 getFunctionType()320 FunctionType *getFunctionType() const { 321 CALLSITE_DELEGATE_GETTER(getFunctionType()); 322 } 323 mutateFunctionType(FunctionType * Ty)324 void mutateFunctionType(FunctionType *Ty) const { 325 CALLSITE_DELEGATE_SETTER(mutateFunctionType(Ty)); 326 } 327 328 /// Get the parameter attributes of the call. getAttributes()329 AttributeList getAttributes() const { 330 CALLSITE_DELEGATE_GETTER(getAttributes()); 331 } 332 /// Set the parameter attributes of the call. setAttributes(AttributeList PAL)333 void setAttributes(AttributeList PAL) { 334 CALLSITE_DELEGATE_SETTER(setAttributes(PAL)); 335 } 336 addAttribute(unsigned i,Attribute::AttrKind Kind)337 void addAttribute(unsigned i, Attribute::AttrKind Kind) { 338 CALLSITE_DELEGATE_SETTER(addAttribute(i, Kind)); 339 } 340 addAttribute(unsigned i,Attribute Attr)341 void addAttribute(unsigned i, Attribute Attr) { 342 CALLSITE_DELEGATE_SETTER(addAttribute(i, Attr)); 343 } 344 addParamAttr(unsigned ArgNo,Attribute::AttrKind Kind)345 void addParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) { 346 CALLSITE_DELEGATE_SETTER(addParamAttr(ArgNo, Kind)); 347 } 348 removeAttribute(unsigned i,Attribute::AttrKind Kind)349 void removeAttribute(unsigned i, Attribute::AttrKind Kind) { 350 CALLSITE_DELEGATE_SETTER(removeAttribute(i, Kind)); 351 } 352 removeAttribute(unsigned i,StringRef Kind)353 void removeAttribute(unsigned i, StringRef Kind) { 354 CALLSITE_DELEGATE_SETTER(removeAttribute(i, Kind)); 355 } 356 removeParamAttr(unsigned ArgNo,Attribute::AttrKind Kind)357 void removeParamAttr(unsigned ArgNo, Attribute::AttrKind Kind) { 358 CALLSITE_DELEGATE_SETTER(removeParamAttr(ArgNo, Kind)); 359 } 360 361 /// Return true if this function has the given attribute. hasFnAttr(Attribute::AttrKind Kind)362 bool hasFnAttr(Attribute::AttrKind Kind) const { 363 CALLSITE_DELEGATE_GETTER(hasFnAttr(Kind)); 364 } 365 366 /// Return true if this function has the given attribute. hasFnAttr(StringRef Kind)367 bool hasFnAttr(StringRef Kind) const { 368 CALLSITE_DELEGATE_GETTER(hasFnAttr(Kind)); 369 } 370 371 /// Return true if this return value has the given attribute. hasRetAttr(Attribute::AttrKind Kind)372 bool hasRetAttr(Attribute::AttrKind Kind) const { 373 CALLSITE_DELEGATE_GETTER(hasRetAttr(Kind)); 374 } 375 376 /// Return true if the call or the callee has the given attribute. paramHasAttr(unsigned ArgNo,Attribute::AttrKind Kind)377 bool paramHasAttr(unsigned ArgNo, Attribute::AttrKind Kind) const { 378 CALLSITE_DELEGATE_GETTER(paramHasAttr(ArgNo, Kind)); 379 } 380 getAttribute(unsigned i,Attribute::AttrKind Kind)381 Attribute getAttribute(unsigned i, Attribute::AttrKind Kind) const { 382 CALLSITE_DELEGATE_GETTER(getAttribute(i, Kind)); 383 } 384 getAttribute(unsigned i,StringRef Kind)385 Attribute getAttribute(unsigned i, StringRef Kind) const { 386 CALLSITE_DELEGATE_GETTER(getAttribute(i, Kind)); 387 } 388 389 /// Return true if the data operand at index \p i directly or indirectly has 390 /// the attribute \p A. 391 /// 392 /// Normal call or invoke arguments have per operand attributes, as specified 393 /// in the attribute set attached to this instruction, while operand bundle 394 /// operands may have some attributes implied by the type of its containing 395 /// operand bundle. dataOperandHasImpliedAttr(unsigned i,Attribute::AttrKind Kind)396 bool dataOperandHasImpliedAttr(unsigned i, Attribute::AttrKind Kind) const { 397 CALLSITE_DELEGATE_GETTER(dataOperandHasImpliedAttr(i, Kind)); 398 } 399 400 /// Extract the alignment of the return value. getRetAlignment()401 unsigned getRetAlignment() const { 402 CALLSITE_DELEGATE_GETTER(getRetAlignment()); 403 } 404 405 /// Extract the alignment for a call or parameter (0=unknown). getParamAlignment(unsigned ArgNo)406 unsigned getParamAlignment(unsigned ArgNo) const { 407 CALLSITE_DELEGATE_GETTER(getParamAlignment(ArgNo)); 408 } 409 410 /// Extract the number of dereferenceable bytes for a call or parameter 411 /// (0=unknown). getDereferenceableBytes(unsigned i)412 uint64_t getDereferenceableBytes(unsigned i) const { 413 CALLSITE_DELEGATE_GETTER(getDereferenceableBytes(i)); 414 } 415 416 /// Extract the number of dereferenceable_or_null bytes for a call or 417 /// parameter (0=unknown). getDereferenceableOrNullBytes(unsigned i)418 uint64_t getDereferenceableOrNullBytes(unsigned i) const { 419 CALLSITE_DELEGATE_GETTER(getDereferenceableOrNullBytes(i)); 420 } 421 422 /// Determine if the return value is marked with NoAlias attribute. returnDoesNotAlias()423 bool returnDoesNotAlias() const { 424 CALLSITE_DELEGATE_GETTER(returnDoesNotAlias()); 425 } 426 427 /// Return true if the call should not be treated as a call to a builtin. isNoBuiltin()428 bool isNoBuiltin() const { 429 CALLSITE_DELEGATE_GETTER(isNoBuiltin()); 430 } 431 432 /// Return true if the call requires strict floating point semantics. isStrictFP()433 bool isStrictFP() const { 434 CALLSITE_DELEGATE_GETTER(isStrictFP()); 435 } 436 437 /// Return true if the call should not be inlined. isNoInline()438 bool isNoInline() const { 439 CALLSITE_DELEGATE_GETTER(isNoInline()); 440 } 441 void setIsNoInline(bool Value = true) { 442 CALLSITE_DELEGATE_SETTER(setIsNoInline(Value)); 443 } 444 445 /// Determine if the call does not access memory. doesNotAccessMemory()446 bool doesNotAccessMemory() const { 447 CALLSITE_DELEGATE_GETTER(doesNotAccessMemory()); 448 } setDoesNotAccessMemory()449 void setDoesNotAccessMemory() { 450 CALLSITE_DELEGATE_SETTER(setDoesNotAccessMemory()); 451 } 452 453 /// Determine if the call does not access or only reads memory. onlyReadsMemory()454 bool onlyReadsMemory() const { 455 CALLSITE_DELEGATE_GETTER(onlyReadsMemory()); 456 } setOnlyReadsMemory()457 void setOnlyReadsMemory() { 458 CALLSITE_DELEGATE_SETTER(setOnlyReadsMemory()); 459 } 460 461 /// Determine if the call does not access or only writes memory. doesNotReadMemory()462 bool doesNotReadMemory() const { 463 CALLSITE_DELEGATE_GETTER(doesNotReadMemory()); 464 } setDoesNotReadMemory()465 void setDoesNotReadMemory() { 466 CALLSITE_DELEGATE_SETTER(setDoesNotReadMemory()); 467 } 468 469 /// Determine if the call can access memmory only using pointers based 470 /// on its arguments. onlyAccessesArgMemory()471 bool onlyAccessesArgMemory() const { 472 CALLSITE_DELEGATE_GETTER(onlyAccessesArgMemory()); 473 } setOnlyAccessesArgMemory()474 void setOnlyAccessesArgMemory() { 475 CALLSITE_DELEGATE_SETTER(setOnlyAccessesArgMemory()); 476 } 477 478 /// Determine if the function may only access memory that is 479 /// inaccessible from the IR. onlyAccessesInaccessibleMemory()480 bool onlyAccessesInaccessibleMemory() const { 481 CALLSITE_DELEGATE_GETTER(onlyAccessesInaccessibleMemory()); 482 } setOnlyAccessesInaccessibleMemory()483 void setOnlyAccessesInaccessibleMemory() { 484 CALLSITE_DELEGATE_SETTER(setOnlyAccessesInaccessibleMemory()); 485 } 486 487 /// Determine if the function may only access memory that is 488 /// either inaccessible from the IR or pointed to by its arguments. onlyAccessesInaccessibleMemOrArgMem()489 bool onlyAccessesInaccessibleMemOrArgMem() const { 490 CALLSITE_DELEGATE_GETTER(onlyAccessesInaccessibleMemOrArgMem()); 491 } setOnlyAccessesInaccessibleMemOrArgMem()492 void setOnlyAccessesInaccessibleMemOrArgMem() { 493 CALLSITE_DELEGATE_SETTER(setOnlyAccessesInaccessibleMemOrArgMem()); 494 } 495 496 /// Determine if the call cannot return. doesNotReturn()497 bool doesNotReturn() const { 498 CALLSITE_DELEGATE_GETTER(doesNotReturn()); 499 } setDoesNotReturn()500 void setDoesNotReturn() { 501 CALLSITE_DELEGATE_SETTER(setDoesNotReturn()); 502 } 503 504 /// Determine if the call cannot unwind. doesNotThrow()505 bool doesNotThrow() const { 506 CALLSITE_DELEGATE_GETTER(doesNotThrow()); 507 } setDoesNotThrow()508 void setDoesNotThrow() { 509 CALLSITE_DELEGATE_SETTER(setDoesNotThrow()); 510 } 511 512 /// Determine if the call can be duplicated. cannotDuplicate()513 bool cannotDuplicate() const { 514 CALLSITE_DELEGATE_GETTER(cannotDuplicate()); 515 } setCannotDuplicate()516 void setCannotDuplicate() { 517 CALLSITE_DELEGATE_SETTER(setCannotDuplicate()); 518 } 519 520 /// Determine if the call is convergent. isConvergent()521 bool isConvergent() const { 522 CALLSITE_DELEGATE_GETTER(isConvergent()); 523 } setConvergent()524 void setConvergent() { 525 CALLSITE_DELEGATE_SETTER(setConvergent()); 526 } setNotConvergent()527 void setNotConvergent() { 528 CALLSITE_DELEGATE_SETTER(setNotConvergent()); 529 } 530 getNumOperandBundles()531 unsigned getNumOperandBundles() const { 532 CALLSITE_DELEGATE_GETTER(getNumOperandBundles()); 533 } 534 hasOperandBundles()535 bool hasOperandBundles() const { 536 CALLSITE_DELEGATE_GETTER(hasOperandBundles()); 537 } 538 getBundleOperandsStartIndex()539 unsigned getBundleOperandsStartIndex() const { 540 CALLSITE_DELEGATE_GETTER(getBundleOperandsStartIndex()); 541 } 542 getBundleOperandsEndIndex()543 unsigned getBundleOperandsEndIndex() const { 544 CALLSITE_DELEGATE_GETTER(getBundleOperandsEndIndex()); 545 } 546 getNumTotalBundleOperands()547 unsigned getNumTotalBundleOperands() const { 548 CALLSITE_DELEGATE_GETTER(getNumTotalBundleOperands()); 549 } 550 getOperandBundleAt(unsigned Index)551 OperandBundleUse getOperandBundleAt(unsigned Index) const { 552 CALLSITE_DELEGATE_GETTER(getOperandBundleAt(Index)); 553 } 554 getOperandBundle(StringRef Name)555 Optional<OperandBundleUse> getOperandBundle(StringRef Name) const { 556 CALLSITE_DELEGATE_GETTER(getOperandBundle(Name)); 557 } 558 getOperandBundle(uint32_t ID)559 Optional<OperandBundleUse> getOperandBundle(uint32_t ID) const { 560 CALLSITE_DELEGATE_GETTER(getOperandBundle(ID)); 561 } 562 countOperandBundlesOfType(uint32_t ID)563 unsigned countOperandBundlesOfType(uint32_t ID) const { 564 CALLSITE_DELEGATE_GETTER(countOperandBundlesOfType(ID)); 565 } 566 isBundleOperand(unsigned Idx)567 bool isBundleOperand(unsigned Idx) const { 568 CALLSITE_DELEGATE_GETTER(isBundleOperand(Idx)); 569 } 570 arg_begin()571 IterTy arg_begin() const { 572 CALLSITE_DELEGATE_GETTER(arg_begin()); 573 } 574 arg_end()575 IterTy arg_end() const { 576 CALLSITE_DELEGATE_GETTER(arg_end()); 577 } 578 579 #undef CALLSITE_DELEGATE_GETTER 580 #undef CALLSITE_DELEGATE_SETTER 581 getOperandBundlesAsDefs(SmallVectorImpl<OperandBundleDef> & Defs)582 void getOperandBundlesAsDefs(SmallVectorImpl<OperandBundleDef> &Defs) const { 583 const Instruction *II = getInstruction(); 584 // Since this is actually a getter that "looks like" a setter, don't use the 585 // above macros to avoid confusion. 586 if (isCall()) 587 cast<CallInst>(II)->getOperandBundlesAsDefs(Defs); 588 else 589 cast<InvokeInst>(II)->getOperandBundlesAsDefs(Defs); 590 } 591 592 /// Determine whether this data operand is not captured. doesNotCapture(unsigned OpNo)593 bool doesNotCapture(unsigned OpNo) const { 594 return dataOperandHasImpliedAttr(OpNo + 1, Attribute::NoCapture); 595 } 596 597 /// Determine whether this argument is passed by value. isByValArgument(unsigned ArgNo)598 bool isByValArgument(unsigned ArgNo) const { 599 return paramHasAttr(ArgNo, Attribute::ByVal); 600 } 601 602 /// Determine whether this argument is passed in an alloca. isInAllocaArgument(unsigned ArgNo)603 bool isInAllocaArgument(unsigned ArgNo) const { 604 return paramHasAttr(ArgNo, Attribute::InAlloca); 605 } 606 607 /// Determine whether this argument is passed by value or in an alloca. isByValOrInAllocaArgument(unsigned ArgNo)608 bool isByValOrInAllocaArgument(unsigned ArgNo) const { 609 return paramHasAttr(ArgNo, Attribute::ByVal) || 610 paramHasAttr(ArgNo, Attribute::InAlloca); 611 } 612 613 /// Determine if there are is an inalloca argument. Only the last argument can 614 /// have the inalloca attribute. hasInAllocaArgument()615 bool hasInAllocaArgument() const { 616 return !arg_empty() && paramHasAttr(arg_size() - 1, Attribute::InAlloca); 617 } 618 doesNotAccessMemory(unsigned OpNo)619 bool doesNotAccessMemory(unsigned OpNo) const { 620 return dataOperandHasImpliedAttr(OpNo + 1, Attribute::ReadNone); 621 } 622 onlyReadsMemory(unsigned OpNo)623 bool onlyReadsMemory(unsigned OpNo) const { 624 return dataOperandHasImpliedAttr(OpNo + 1, Attribute::ReadOnly) || 625 dataOperandHasImpliedAttr(OpNo + 1, Attribute::ReadNone); 626 } 627 doesNotReadMemory(unsigned OpNo)628 bool doesNotReadMemory(unsigned OpNo) const { 629 return dataOperandHasImpliedAttr(OpNo + 1, Attribute::WriteOnly) || 630 dataOperandHasImpliedAttr(OpNo + 1, Attribute::ReadNone); 631 } 632 633 /// Return true if the return value is known to be not null. 634 /// This may be because it has the nonnull attribute, or because at least 635 /// one byte is dereferenceable and the pointer is in addrspace(0). isReturnNonNull()636 bool isReturnNonNull() const { 637 if (hasRetAttr(Attribute::NonNull)) 638 return true; 639 else if (getDereferenceableBytes(AttributeList::ReturnIndex) > 0 && 640 !NullPointerIsDefined(getCaller(), 641 getType()->getPointerAddressSpace())) 642 return true; 643 644 return false; 645 } 646 647 /// Returns true if this CallSite passes the given Value* as an argument to 648 /// the called function. hasArgument(const Value * Arg)649 bool hasArgument(const Value *Arg) const { 650 for (arg_iterator AI = this->arg_begin(), E = this->arg_end(); AI != E; 651 ++AI) 652 if (AI->get() == Arg) 653 return true; 654 return false; 655 } 656 657 private: getCallee()658 IterTy getCallee() const { 659 if (isCall()) // Skip Callee 660 return cast<CallInst>(getInstruction())->op_end() - 1; 661 else // Skip BB, BB, Callee 662 return cast<InvokeInst>(getInstruction())->op_end() - 3; 663 } 664 }; 665 666 class CallSite : public CallSiteBase<Function, BasicBlock, Value, User, Use, 667 Instruction, CallInst, InvokeInst, 668 User::op_iterator> { 669 public: 670 CallSite() = default; CallSite(CallSiteBase B)671 CallSite(CallSiteBase B) : CallSiteBase(B) {} CallSite(CallInst * CI)672 CallSite(CallInst *CI) : CallSiteBase(CI) {} CallSite(InvokeInst * II)673 CallSite(InvokeInst *II) : CallSiteBase(II) {} CallSite(Instruction * II)674 explicit CallSite(Instruction *II) : CallSiteBase(II) {} CallSite(Value * V)675 explicit CallSite(Value *V) : CallSiteBase(V) {} 676 677 bool operator==(const CallSite &CS) const { return I == CS.I; } 678 bool operator!=(const CallSite &CS) const { return I != CS.I; } 679 bool operator<(const CallSite &CS) const { 680 return getInstruction() < CS.getInstruction(); 681 } 682 683 private: 684 friend struct DenseMapInfo<CallSite>; 685 686 User::op_iterator getCallee() const; 687 }; 688 689 template <> struct DenseMapInfo<CallSite> { 690 using BaseInfo = DenseMapInfo<decltype(CallSite::I)>; 691 692 static CallSite getEmptyKey() { 693 CallSite CS; 694 CS.I = BaseInfo::getEmptyKey(); 695 return CS; 696 } 697 698 static CallSite getTombstoneKey() { 699 CallSite CS; 700 CS.I = BaseInfo::getTombstoneKey(); 701 return CS; 702 } 703 704 static unsigned getHashValue(const CallSite &CS) { 705 return BaseInfo::getHashValue(CS.I); 706 } 707 708 static bool isEqual(const CallSite &LHS, const CallSite &RHS) { 709 return LHS == RHS; 710 } 711 }; 712 713 /// Establish a view to a call site for examination. 714 class ImmutableCallSite : public CallSiteBase<> { 715 public: 716 ImmutableCallSite() = default; 717 ImmutableCallSite(const CallInst *CI) : CallSiteBase(CI) {} 718 ImmutableCallSite(const InvokeInst *II) : CallSiteBase(II) {} 719 explicit ImmutableCallSite(const Instruction *II) : CallSiteBase(II) {} 720 explicit ImmutableCallSite(const Value *V) : CallSiteBase(V) {} 721 ImmutableCallSite(CallSite CS) : CallSiteBase(CS.getInstruction()) {} 722 }; 723 724 } // end namespace llvm 725 726 #endif // LLVM_IR_CALLSITE_H 727