aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNate Begeman <natebegeman@mac.com>2008-05-15 01:23:11 +0000
committerNate Begeman <natebegeman@mac.com>2008-05-15 01:23:11 +0000
commitff155f03bd5d4a8fbeff09ad854582a37cdaa228 (patch)
tree7a49fb1e31e389335f23855a4cbc510945f9d961
parent386f3e9d50507ecbfb01436dee85cb41ac2df530 (diff)
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@51136 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--include/llvm/User.h19
-rw-r--r--lib/VMCore/Value.cpp19
2 files changed, 21 insertions, 17 deletions
diff --git a/include/llvm/User.h b/include/llvm/User.h
index 1454779154..44beac2ff8 100644
--- a/include/llvm/User.h
+++ b/include/llvm/User.h
@@ -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];
}
diff --git a/lib/VMCore/Value.cpp b/lib/VMCore/Value.cpp
index ff056ba74a..919f4b00e8 100644
--- a/lib/VMCore/Value.cpp
+++ b/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);
+}