Add function for testing string attributes to InvokeInst and CallSite. NFC.
[oota-llvm.git] / include / llvm / IR / CallSite.h
index a0ff2cb6c7e856a9c46724a6bdf603f14ea11120..f7bfb47a5b4446edbd495b979f6350cf40a03df5 100644 (file)
@@ -126,6 +126,7 @@ public:
 
   /// \brief Determine whether the passed use points to an argument operand.
   bool isArgOperand(const Use *U) const {
+    assert(getInstruction() == U->getUser());
     return arg_begin() <= U && U < arg_end();
   }
 
@@ -136,13 +137,24 @@ public:
 
   /// \brief Determine whether the passed use points to a bundle operand.
   bool isBundleOperand(const Use *U) const {
+    assert(getInstruction() == U->getUser());
     if (!hasOperandBundles())
       return false;
-    unsigned OperandNo = U->getOperandNo();
+    unsigned OperandNo = U - (*this)->op_begin();
     return getBundleOperandsStartIndex() <= OperandNo &&
            OperandNo < getBundleOperandsEndIndex();
   }
 
+  /// \brief Determine whether the passed iterator points to a data operand.
+  bool isDataOperand(Value::const_user_iterator UI) const {
+    return isDataOperand(&UI.getUse());
+  }
+
+  /// \brief Determine whether the passed use points to a data operand.
+  bool isDataOperand(const Use *U) const {
+    return data_operands_begin() <= U && U < data_operands_end();
+  }
+
   ValTy *getArgument(unsigned ArgNo) const {
     assert(arg_begin() + ArgNo < arg_end() && "Argument # out of range!");
     return *(arg_begin() + ArgNo);
@@ -178,6 +190,21 @@ public:
   bool arg_empty() const { return arg_end() == arg_begin(); }
   unsigned arg_size() const { return unsigned(arg_end() - arg_begin()); }
 
+  /// Given a value use iterator, returns the data operand that corresponds to
+  /// it.
+  /// Iterator must actually correspond to a data operand.
+  unsigned getDataOperandNo(Value::const_user_iterator UI) const {
+    return getDataOperandNo(&UI.getUse());
+  }
+
+  /// Given a use for a data operand, get the data operand number that
+  /// corresponds to it.
+  unsigned getDataOperandNo(const Use *U) const {
+    assert(getInstruction() && "Not a call or invoke instruction!");
+    assert(isDataOperand(U) && "Data operand # out of range!");
+    return U - data_operands_begin();
+  }
+
   /// Type of iterator to use when looping over data operands at this call site
   /// (see below).
   typedef IterTy data_operand_iterator;
@@ -283,6 +310,11 @@ public:
     CALLSITE_DELEGATE_GETTER(hasFnAttr(A));
   }
 
+  /// \brief Return true if this function has the given attribute.
+  bool hasFnAttr(StringRef A) const {
+    CALLSITE_DELEGATE_GETTER(hasFnAttr(A));
+  }
+
   /// \brief Return true if the call or the callee has the given attribute.
   bool paramHasAttr(unsigned i, Attribute::AttrKind A) const {
     CALLSITE_DELEGATE_GETTER(paramHasAttr(i, A));