1 //===-- User.cpp - Implement the User class -------------------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "llvm/Constant.h"
11 #include "llvm/GlobalValue.h"
12 #include "llvm/User.h"
16 //===----------------------------------------------------------------------===//
18 //===----------------------------------------------------------------------===//
20 // replaceUsesOfWith - Replaces all references to the "From" definition with
21 // references to the "To" definition.
23 void User::replaceUsesOfWith(Value
*From
, Value
*To
) {
24 if (From
== To
) return; // Duh what?
26 assert((!isa
<Constant
>(this) || isa
<GlobalValue
>(this)) &&
27 "Cannot call User::replaceUsesOfWith on a constant!");
29 for (unsigned i
= 0, E
= getNumOperands(); i
!= E
; ++i
)
30 if (getOperand(i
) == From
) { // Is This operand is pointing to oldval?
31 // The side effects of this setOperand call include linking to
32 // "To", adding "this" to the uses list of To, and
33 // most importantly, removing "this" from the use list of "From".
34 setOperand(i
, To
); // Fix it now...
38 //===----------------------------------------------------------------------===//
39 // User allocHungoffUses Implementation
40 //===----------------------------------------------------------------------===//
42 Use
*User::allocHungoffUses(unsigned N
) const {
43 // Allocate the array of Uses, followed by a pointer (with bottom bit set) to
45 size_t size
= N
* sizeof(Use
) + sizeof(Use::UserRef
);
46 Use
*Begin
= static_cast<Use
*>(::operator new(size
));
48 (void) new(End
) Use::UserRef(const_cast<User
*>(this), 1);
49 return Use::initTags(Begin
, End
);
52 //===----------------------------------------------------------------------===//
53 // User operator new Implementations
54 //===----------------------------------------------------------------------===//
56 void *User::operator new(size_t s
, unsigned Us
) {
57 void *Storage
= ::operator new(s
+ sizeof(Use
) * Us
);
58 Use
*Start
= static_cast<Use
*>(Storage
);
59 Use
*End
= Start
+ Us
;
60 User
*Obj
= reinterpret_cast<User
*>(End
);
61 Obj
->OperandList
= Start
;
62 Obj
->NumOperands
= Us
;
63 Use::initTags(Start
, End
);
67 //===----------------------------------------------------------------------===//
68 // User operator delete Implementation
69 //===----------------------------------------------------------------------===//
71 void User::operator delete(void *Usr
) {
72 User
*Start
= static_cast<User
*>(Usr
);
73 Use
*Storage
= static_cast<Use
*>(Usr
) - Start
->NumOperands
;
74 // If there were hung-off uses, they will have been freed already and
75 // NumOperands reset to 0, so here we just free the User itself.
76 ::operator delete(Storage
);
79 } // End llvm namespace