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