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 Use
*Begin
= static_cast<Use
*>(::operator new(sizeof(Use
) * N
44 + sizeof(AugmentedUse
)
47 PointerIntPair
<User
*, 1, unsigned>&
48 ref(static_cast<AugmentedUse
&>(End
[-1]).ref
);
49 ref
.setPointer(const_cast<User
*>(this));
51 return Use::initTags(Begin
, End
);
54 //===----------------------------------------------------------------------===//
55 // User operator new Implementations
56 //===----------------------------------------------------------------------===//
58 void *User::operator new(size_t s
, unsigned Us
) {
59 void *Storage
= ::operator new(s
+ sizeof(Use
) * Us
);
60 Use
*Start
= static_cast<Use
*>(Storage
);
61 Use
*End
= Start
+ Us
;
62 User
*Obj
= reinterpret_cast<User
*>(End
);
63 Obj
->OperandList
= Start
;
64 Obj
->NumOperands
= Us
;
65 Use::initTags(Start
, End
);
69 //===----------------------------------------------------------------------===//
70 // User operator delete Implementation
71 //===----------------------------------------------------------------------===//
73 void User::operator delete(void *Usr
) {
74 User
*Start
= static_cast<User
*>(Usr
);
75 Use
*Storage
= static_cast<Use
*>(Usr
) - Start
->NumOperands
;
76 // If there were hung-off uses, they will have been freed already and
77 // NumOperands reset to 0, so here we just free the User itself.
78 ::operator delete(Storage
);
81 } // End llvm namespace