diff options
author | Nate Begeman <natebegeman@mac.com> | 2008-05-15 01:23:11 +0000 |
---|---|---|
committer | Nate Begeman <natebegeman@mac.com> | 2008-05-15 01:23:11 +0000 |
commit | 60f9320fc5a24d95cdb637e8376d9714933d3e68 (patch) | |
tree | d50f40396c58b70468038911ef96c05a9ed570f5 /llvm/lib | |
parent | fa48372a24463e5516bd32ad2a777e317fca81c7 (diff) | |
download | bcm5719-llvm-60f9320fc5a24d95cdb637e8376d9714933d3e68.tar.gz bcm5719-llvm-60f9320fc5a24d95cdb637e8376d9714933d3e68.zip |
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
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/VMCore/Value.cpp | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/llvm/lib/VMCore/Value.cpp b/llvm/lib/VMCore/Value.cpp index ff056ba74ac..919f4b00e87 100644 --- a/llvm/lib/VMCore/Value.cpp +++ b/llvm/lib/VMCore/Value.cpp @@ -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); +} |