1315b333deaeae84dc35d7d9588ee5cf0bb35c2dcNick Lewycky//===-- llvm/OperandTraits.h - OperandTraits class definition ---*- C++ -*-===//
2efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif//
3efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif//                     The LLVM Compiler Infrastructure
4efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif//
5efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif// This file is distributed under the University of Illinois Open Source
6efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif// License. See LICENSE.TXT for details.
7efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif//
8efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif//===----------------------------------------------------------------------===//
9efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif//
10efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif// This file defines the traits classes that are handy for enforcing the correct
11efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif// layout of various User subclasses. It also provides the means for accessing
12efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif// the operands in the most efficient manner.
13efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif//
14efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif
15674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_IR_OPERANDTRAITS_H
16674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_IR_OPERANDTRAITS_H
17efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif
180b8c9a80f20772c3793201ab5b251d3520b9cea3Chandler Carruth#include "llvm/IR/User.h"
19efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif
20efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greifnamespace llvm {
21efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif
22efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif//===----------------------------------------------------------------------===//
23138acfe353ed8b895de093a4c118b01093b6fbfbGabor Greif//                          FixedNumOperand Trait Class
24efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif//===----------------------------------------------------------------------===//
25efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif
2607252fd463d2378383ae035e45f6ed3c12959efeGabor Greif/// FixedNumOperandTraits - determine the allocation regime of the Use array
2707252fd463d2378383ae035e45f6ed3c12959efeGabor Greif/// when it is a prefix to the User object, and the number of Use objects is
2807252fd463d2378383ae035e45f6ed3c12959efeGabor Greif/// known at compile time.
2907252fd463d2378383ae035e45f6ed3c12959efeGabor Greif
3067c619ba3eae68dcdb3f9340d82b33173aa0c256Jay Foadtemplate <typename SubClass, unsigned ARITY>
31efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greifstruct FixedNumOperandTraits {
3267c619ba3eae68dcdb3f9340d82b33173aa0c256Jay Foad  static Use *op_begin(SubClass* U) {
33efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif    return reinterpret_cast<Use*>(U) - ARITY;
34efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  }
3567c619ba3eae68dcdb3f9340d82b33173aa0c256Jay Foad  static Use *op_end(SubClass* U) {
36efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif    return reinterpret_cast<Use*>(U);
37efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  }
38efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  static unsigned operands(const User*) {
39efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif    return ARITY;
40efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  }
41efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif};
42efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif
43efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif//===----------------------------------------------------------------------===//
44138acfe353ed8b895de093a4c118b01093b6fbfbGabor Greif//                          OptionalOperand Trait Class
45efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif//===----------------------------------------------------------------------===//
46efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif
47138acfe353ed8b895de093a4c118b01093b6fbfbGabor Greif/// OptionalOperandTraits - when the number of operands may change at runtime.
48138acfe353ed8b895de093a4c118b01093b6fbfbGabor Greif/// Naturally it may only decrease, because the allocations may not change.
49138acfe353ed8b895de093a4c118b01093b6fbfbGabor Greif
5067c619ba3eae68dcdb3f9340d82b33173aa0c256Jay Foadtemplate <typename SubClass, unsigned ARITY = 1>
5167c619ba3eae68dcdb3f9340d82b33173aa0c256Jay Foadstruct OptionalOperandTraits : public FixedNumOperandTraits<SubClass, ARITY> {
52efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  static unsigned operands(const User *U) {
53efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif    return U->getNumOperands();
54efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  }
55efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif};
56efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif
57efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif//===----------------------------------------------------------------------===//
58efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif//                          VariadicOperand Trait Class
59efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif//===----------------------------------------------------------------------===//
60efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif
6107252fd463d2378383ae035e45f6ed3c12959efeGabor Greif/// VariadicOperandTraits - determine the allocation regime of the Use array
6207252fd463d2378383ae035e45f6ed3c12959efeGabor Greif/// when it is a prefix to the User object, and the number of Use objects is
6307252fd463d2378383ae035e45f6ed3c12959efeGabor Greif/// only known at allocation time.
6407252fd463d2378383ae035e45f6ed3c12959efeGabor Greif
6567c619ba3eae68dcdb3f9340d82b33173aa0c256Jay Foadtemplate <typename SubClass, unsigned MINARITY = 0>
66efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greifstruct VariadicOperandTraits {
6767c619ba3eae68dcdb3f9340d82b33173aa0c256Jay Foad  static Use *op_begin(SubClass* U) {
6867c619ba3eae68dcdb3f9340d82b33173aa0c256Jay Foad    return reinterpret_cast<Use*>(U) - static_cast<User*>(U)->getNumOperands();
69efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  }
7067c619ba3eae68dcdb3f9340d82b33173aa0c256Jay Foad  static Use *op_end(SubClass* U) {
71efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif    return reinterpret_cast<Use*>(U);
72efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  }
73efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  static unsigned operands(const User *U) {
74efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif    return U->getNumOperands();
75efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  }
76efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif};
77efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif
78efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif//===----------------------------------------------------------------------===//
79efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif//                          HungoffOperand Trait Class
80efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif//===----------------------------------------------------------------------===//
81efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif
8207252fd463d2378383ae035e45f6ed3c12959efeGabor Greif/// HungoffOperandTraits - determine the allocation regime of the Use array
8307252fd463d2378383ae035e45f6ed3c12959efeGabor Greif/// when it is not a prefix to the User object, but allocated at an unrelated
8407252fd463d2378383ae035e45f6ed3c12959efeGabor Greif/// heap address.
8507252fd463d2378383ae035e45f6ed3c12959efeGabor Greif/// Assumes that the User subclass that is determined by this traits class
8607252fd463d2378383ae035e45f6ed3c12959efeGabor Greif/// has an OperandList member of type User::op_iterator. [Note: this is now
8707252fd463d2378383ae035e45f6ed3c12959efeGabor Greif/// trivially satisfied, because User has that member for historic reasons.]
8807252fd463d2378383ae035e45f6ed3c12959efeGabor Greif///
8907252fd463d2378383ae035e45f6ed3c12959efeGabor Greif/// This is the traits class that is needed when the Use array must be
9007252fd463d2378383ae035e45f6ed3c12959efeGabor Greif/// resizable.
9107252fd463d2378383ae035e45f6ed3c12959efeGabor Greif
92efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greiftemplate <unsigned MINARITY = 1>
93efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greifstruct HungoffOperandTraits {
94efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  static Use *op_begin(User* U) {
95efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif    return U->OperandList;
96efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  }
97efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  static Use *op_end(User* U) {
98efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif    return U->OperandList + U->getNumOperands();
99efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  }
100efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  static unsigned operands(const User *U) {
101efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif    return U->getNumOperands();
102efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  }
103efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif};
104efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif
105efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif/// Macro for generating in-class operand accessor declarations.
106efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif/// It should only be called in the public section of the interface.
107efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif///
108efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif#define DECLARE_TRANSPARENT_OPERAND_ACCESSORS(VALUECLASS) \
109efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  public: \
110efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  inline VALUECLASS *getOperand(unsigned) const; \
111efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  inline void setOperand(unsigned, VALUECLASS*); \
1126cd093b56e80ed54a2062e789937a096ba3afe56Gabor Greif  inline op_iterator op_begin(); \
1136cd093b56e80ed54a2062e789937a096ba3afe56Gabor Greif  inline const_op_iterator op_begin() const; \
1146cd093b56e80ed54a2062e789937a096ba3afe56Gabor Greif  inline op_iterator op_end(); \
1156cd093b56e80ed54a2062e789937a096ba3afe56Gabor Greif  inline const_op_iterator op_end() const; \
116efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  protected: \
11720cb46287cf5deb49cb484c9770e73f7cf246e7bGabor Greif  template <int> inline Use &Op(); \
11820cb46287cf5deb49cb484c9770e73f7cf246e7bGabor Greif  template <int> inline const Use &Op() const; \
119efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  public: \
120efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  inline unsigned getNumOperands() const
121efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif
122efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif/// Macro for generating out-of-class operand accessor definitions
123efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif#define DEFINE_TRANSPARENT_OPERAND_ACCESSORS(CLASS, VALUECLASS) \
1246cd093b56e80ed54a2062e789937a096ba3afe56Gabor GreifCLASS::op_iterator CLASS::op_begin() { \
1256cd093b56e80ed54a2062e789937a096ba3afe56Gabor Greif  return OperandTraits<CLASS>::op_begin(this); \
1266cd093b56e80ed54a2062e789937a096ba3afe56Gabor Greif} \
1276cd093b56e80ed54a2062e789937a096ba3afe56Gabor GreifCLASS::const_op_iterator CLASS::op_begin() const { \
1286cd093b56e80ed54a2062e789937a096ba3afe56Gabor Greif  return OperandTraits<CLASS>::op_begin(const_cast<CLASS*>(this)); \
1296cd093b56e80ed54a2062e789937a096ba3afe56Gabor Greif} \
1306cd093b56e80ed54a2062e789937a096ba3afe56Gabor GreifCLASS::op_iterator CLASS::op_end() { \
1316cd093b56e80ed54a2062e789937a096ba3afe56Gabor Greif  return OperandTraits<CLASS>::op_end(this); \
1326cd093b56e80ed54a2062e789937a096ba3afe56Gabor Greif} \
1336cd093b56e80ed54a2062e789937a096ba3afe56Gabor GreifCLASS::const_op_iterator CLASS::op_end() const { \
1346cd093b56e80ed54a2062e789937a096ba3afe56Gabor Greif  return OperandTraits<CLASS>::op_end(const_cast<CLASS*>(this)); \
1356cd093b56e80ed54a2062e789937a096ba3afe56Gabor Greif} \
136efe65369a74871c3140a540a6c95ce5d1f080954Gabor GreifVALUECLASS *CLASS::getOperand(unsigned i_nocapture) const { \
137efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  assert(i_nocapture < OperandTraits<CLASS>::operands(this) \
138efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif         && "getOperand() out of range!"); \
139ff7782bcc9235b1dc4c7fcb0497c52e4717eeffcJay Foad  return cast_or_null<VALUECLASS>( \
140ff7782bcc9235b1dc4c7fcb0497c52e4717eeffcJay Foad    OperandTraits<CLASS>::op_begin(const_cast<CLASS*>(this))[i_nocapture].get()); \
141efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif} \
142efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greifvoid CLASS::setOperand(unsigned i_nocapture, VALUECLASS *Val_nocapture) { \
143efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  assert(i_nocapture < OperandTraits<CLASS>::operands(this) \
144efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif         && "setOperand() out of range!"); \
145efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  OperandTraits<CLASS>::op_begin(this)[i_nocapture] = Val_nocapture; \
146efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif} \
147efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greifunsigned CLASS::getNumOperands() const { \
148efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif  return OperandTraits<CLASS>::operands(this); \
149efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif} \
15020cb46287cf5deb49cb484c9770e73f7cf246e7bGabor Greiftemplate <int Idx_nocapture> Use &CLASS::Op() { \
15120cb46287cf5deb49cb484c9770e73f7cf246e7bGabor Greif  return this->OpFrom<Idx_nocapture>(this); \
152efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif} \
15320cb46287cf5deb49cb484c9770e73f7cf246e7bGabor Greiftemplate <int Idx_nocapture> const Use &CLASS::Op() const { \
15420cb46287cf5deb49cb484c9770e73f7cf246e7bGabor Greif  return this->OpFrom<Idx_nocapture>(this); \
155efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif}
156efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif
157efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif
158efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif} // End llvm namespace
159efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif
160efe65369a74871c3140a540a6c95ce5d1f080954Gabor Greif#endif
161