X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FUser.h;h=f8277952ee4ba9fa7cd03e8ee116c4a4fbb9f5fa;hb=104cf9e02b0ed94d4173869a598af6c6972a8660;hp=570f381d1a8c4eb168e16f21305cfc3d0b0be78f;hpb=e98fc279e28de4817831a9d11ec99b83a3f49d02;p=oota-llvm.git diff --git a/include/llvm/User.h b/include/llvm/User.h index 570f381d1a8..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,20 +83,43 @@ 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]; } void setOperand(unsigned i, Value *Val) { assert(i < NumOperands && "setOperand() out of range!"); + assert((!isa((const Value*)this) || + isa((const Value*)this)) && + "Cannot mutate a constant with setOperand!"); OperandList[i] = Val; } + const Use &getOperandUse(unsigned i) const { + assert(i < NumOperands && "getOperand() out of range!"); + return OperandList[i]; + } + Use &getOperandUse(unsigned i) { + assert(i < NumOperands && "getOperand() out of range!"); + return OperandList[i]; + } + unsigned getNumOperands() const { return NumOperands; } // ---------------------------------------------------------------------------