forked from OSchip/llvm-project
Move the operator new and operator delete out of line. This fixes an issue with
operator new() referring to the static initTags function, which has to be in the same linkage unit as any file including User.h. llvm-svn: 51136
This commit is contained in:
parent
fa48372a24
commit
60f9320fc5
|
@ -227,16 +227,7 @@ protected:
|
|||
///
|
||||
unsigned NumOperands;
|
||||
|
||||
void *operator new(size_t s, unsigned Us) {
|
||||
void *Storage = ::operator new(s + sizeof(Use) * Us);
|
||||
Use *Start = static_cast<Use*>(Storage);
|
||||
Use *End = Start + Us;
|
||||
User *Obj = reinterpret_cast<User*>(End);
|
||||
Obj->OperandList = Start;
|
||||
Obj->NumOperands = Us;
|
||||
Use::initTags(Start, End);
|
||||
return Obj;
|
||||
}
|
||||
void *operator new(size_t s, unsigned Us);
|
||||
User(const Type *Ty, unsigned vty, Use *OpList, unsigned NumOps)
|
||||
: Value(Ty, vty), OperandList(OpList), NumOperands(NumOps) {}
|
||||
Use *allocHungoffUses(unsigned) const;
|
||||
|
@ -251,13 +242,7 @@ public:
|
|||
~User() {
|
||||
Use::zap(OperandList, OperandList + NumOperands);
|
||||
}
|
||||
void operator delete(void *Usr) {
|
||||
User *Start = static_cast<User*>(Usr);
|
||||
Use *Storage = static_cast<Use*>(Usr) - Start->NumOperands;
|
||||
::operator delete(Storage == Start->OperandList
|
||||
? Storage
|
||||
: Usr);
|
||||
}
|
||||
void operator delete(void *Usr);
|
||||
template <unsigned Idx> Use &Op() {
|
||||
return OperandTraits<User>::op_begin(this)[Idx];
|
||||
}
|
||||
|
|
|
@ -355,3 +355,22 @@ void User::replaceUsesOfWith(Value *From, Value *To) {
|
|||
setOperand(i, To); // Fix it now...
|
||||
}
|
||||
}
|
||||
|
||||
void *User::operator new(size_t s, unsigned Us) {
|
||||
void *Storage = ::operator new(s + sizeof(Use) * Us);
|
||||
Use *Start = static_cast<Use*>(Storage);
|
||||
Use *End = Start + Us;
|
||||
User *Obj = reinterpret_cast<User*>(End);
|
||||
Obj->OperandList = Start;
|
||||
Obj->NumOperands = Us;
|
||||
Use::initTags(Start, End);
|
||||
return Obj;
|
||||
}
|
||||
|
||||
void User::operator delete(void *Usr) {
|
||||
User *Start = static_cast<User*>(Usr);
|
||||
Use *Storage = static_cast<Use*>(Usr) - Start->NumOperands;
|
||||
::operator delete(Storage == Start->OperandList
|
||||
? Storage
|
||||
: Usr);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue