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