X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FUser.h;h=f8277952ee4ba9fa7cd03e8ee116c4a4fbb9f5fa;hb=9e6d1d1f5034347d237941f1bf08fba5c1583cd3;hp=bb1a862c86070650af3e97bf1f5d5a670a1c72fc;hpb=67a2743b6ba03c473f89577d04c8141150b1f1c2;p=oota-llvm.git diff --git a/include/llvm/User.h b/include/llvm/User.h index bb1a862c860..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 { @@ -62,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; @@ -74,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); @@ -82,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];