X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FUser.h;h=f8277952ee4ba9fa7cd03e8ee116c4a4fbb9f5fa;hb=9e6d1d1f5034347d237941f1bf08fba5c1583cd3;hp=e25d19b563fe92f571986ff0c83e0eefe190856a;hpb=bda9dfd5ab20fbefc9b0d563e7556f7cddc247d7;p=oota-llvm.git diff --git a/include/llvm/User.h b/include/llvm/User.h index e25d19b563f..f8277952ee4 100644 --- a/include/llvm/User.h +++ b/include/llvm/User.h @@ -41,7 +41,6 @@ struct OperandTraits { struct Layout { typedef U overlay; }; - static inline void *allocate(unsigned); }; class User : public Value { @@ -50,12 +49,11 @@ class User : public Value { template friend struct HungoffOperandTraits; protected: - /// OperandList - This is a pointer to the array of Users for this operand. + /// OperandList - This is a pointer to the array of Uses for this User. /// For nodes of fixed arity (e.g. a binary operator) this array will live - /// prefixed to the derived class. For nodes of resizable variable arity - /// (e.g. PHINodes, SwitchInst etc.), this memory will be dynamically - /// allocated and should be destroyed by the classes' - /// virtual dtor. + /// prefixed to some derived class instance. For nodes of resizable variable + /// arity (e.g. PHINodes, SwitchInst etc.), this memory will be dynamically + /// allocated and should be destroyed by the classes' virtual dtor. Use *OperandList; /// NumOperands - The number of values used by this User. @@ -63,6 +61,7 @@ protected: unsigned NumOperands; void *operator new(size_t s, unsigned Us); + void *operator new(size_t s, unsigned Us, bool Prefix); User(const Type *ty, unsigned vty, Use *OpList, unsigned NumOps) : Value(ty, vty), OperandList(OpList), NumOperands(NumOps) {} Use *allocHungoffUses(unsigned) const; @@ -75,7 +74,8 @@ protected: } public: ~User() { - Use::zap(OperandList, OperandList + NumOperands); + if ((intptr_t(OperandList) & 1) == 0) + Use::zap(OperandList, OperandList + NumOperands); } /// operator delete - free memory allocated for User and Use objects void operator delete(void *Usr); @@ -83,12 +83,23 @@ public: void operator delete(void*, unsigned) { assert(0 && "Constructor throws?"); } - template Use &Op() { - return OperandTraits::op_begin(this)[Idx]; + /// placement delete - required by std, but never called. + void operator delete(void*, unsigned, bool) { + assert(0 && "Constructor throws?"); + } +protected: + template static Use &OpFrom(const U *that) { + return Idx < 0 + ? OperandTraits::op_end(const_cast(that))[Idx] + : OperandTraits::op_begin(const_cast(that))[Idx]; + } + template Use &Op() { + return OpFrom(this); } - template const Use &Op() const { - return OperandTraits::op_begin(const_cast(this))[Idx]; + template const Use &Op() const { + return OpFrom(this); } +public: Value *getOperand(unsigned i) const { assert(i < NumOperands && "getOperand() out of range!"); return OperandList[i];