15 #ifndef LLVM_IR_OPERANDTRAITS_H 16 #define LLVM_IR_OPERANDTRAITS_H 30 template <
typename SubClass,
unsigned ARITY>
34 !std::is_polymorphic<SubClass>::value,
35 "adding virtual methods to subclasses of User breaks use lists");
36 return reinterpret_cast<Use*
>(U) - ARITY;
39 return reinterpret_cast<Use*
>(U);
53 template <
typename SubClass,
unsigned ARITY = 1>
68 template <
typename SubClass,
unsigned MINARITY = 0>
72 !std::is_polymorphic<SubClass>::value,
73 "adding virtual methods to subclasses of User breaks use lists");
74 return reinterpret_cast<Use*
>(U) - static_cast<User*>(U)->getNumOperands();
77 return reinterpret_cast<Use*
>(U);
95 template <
unsigned MINARITY = 1>
111 #define DECLARE_TRANSPARENT_OPERAND_ACCESSORS(VALUECLASS) \ 113 inline VALUECLASS *getOperand(unsigned) const; \ 114 inline void setOperand(unsigned, VALUECLASS*); \ 115 inline op_iterator op_begin(); \ 116 inline const_op_iterator op_begin() const; \ 117 inline op_iterator op_end(); \ 118 inline const_op_iterator op_end() const; \ 120 template <int> inline Use &Op(); \ 121 template <int> inline const Use &Op() const; \ 123 inline unsigned getNumOperands() const 126 #define DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CLASS, VALUECLASS) \ 127 CLASS::op_iterator CLASS::op_begin() { \ 128 return OperandTraits<CLASS>::op_begin(this); \ 130 CLASS::const_op_iterator CLASS::op_begin() const { \ 131 return OperandTraits<CLASS>::op_begin(const_cast<CLASS*>(this)); \ 133 CLASS::op_iterator CLASS::op_end() { \ 134 return OperandTraits<CLASS>::op_end(this); \ 136 CLASS::const_op_iterator CLASS::op_end() const { \ 137 return OperandTraits<CLASS>::op_end(const_cast<CLASS*>(this)); \ 139 VALUECLASS *CLASS::getOperand(unsigned i_nocapture) const { \ 140 assert(i_nocapture < OperandTraits<CLASS>::operands(this) \ 141 && "getOperand() out of range!"); \ 142 return cast_or_null<VALUECLASS>( \ 143 OperandTraits<CLASS>::op_begin(const_cast<CLASS*>(this))[i_nocapture].get()); \ 145 void CLASS::setOperand(unsigned i_nocapture, VALUECLASS *Val_nocapture) { \ 146 assert(i_nocapture < OperandTraits<CLASS>::operands(this) \ 147 && "setOperand() out of range!"); \ 148 OperandTraits<CLASS>::op_begin(this)[i_nocapture] = Val_nocapture; \ 150 unsigned CLASS::getNumOperands() const { \ 151 return OperandTraits<CLASS>::operands(this); \ 153 template <int Idx_nocapture> Use &CLASS::Op() { \ 154 return this->OpFrom<Idx_nocapture>(this); \ 156 template <int Idx_nocapture> const Use &CLASS::Op() const { \ 157 return this->OpFrom<Idx_nocapture>(this); \ static Use * op_end(SubClass *U)
This class represents lattice values for constants.
static Use * op_end(User *U)
A Use represents the edge between a Value definition and its users.
static unsigned operands(const User *U)
const Use * getOperandList() const
static unsigned operands(const User *U)
static Use * op_end(SubClass *U)
static unsigned operands(const User *U)
OptionalOperandTraits - when the number of operands may change at runtime.
unsigned getNumOperands() const
static Use * op_begin(SubClass *U)
static Use * op_begin(SubClass *U)
static unsigned operands(const User *)
HungoffOperandTraits - determine the allocation regime of the Use array when it is not a prefix to th...
FixedNumOperandTraits - determine the allocation regime of the Use array when it is a prefix to the U...
VariadicOperandTraits - determine the allocation regime of the Use array when it is a prefix to the U...
static Use * op_begin(User *U)