]>
Commit | Line | Data |
---|---|---|
223e47cc LB |
1 | //===-- User.cpp - Implement the User class -------------------------------===// |
2 | // | |
3 | // The LLVM Compiler Infrastructure | |
4 | // | |
5 | // This file is distributed under the University of Illinois Open Source | |
6 | // License. See LICENSE.TXT for details. | |
7 | // | |
8 | //===----------------------------------------------------------------------===// | |
9 | ||
970d7e83 LB |
10 | #include "llvm/IR/User.h" |
11 | #include "llvm/IR/Constant.h" | |
12 | #include "llvm/IR/GlobalValue.h" | |
13 | #include "llvm/IR/Operator.h" | |
223e47cc LB |
14 | |
15 | namespace llvm { | |
16 | ||
17 | //===----------------------------------------------------------------------===// | |
18 | // User Class | |
19 | //===----------------------------------------------------------------------===// | |
20 | ||
21 | void User::anchor() {} | |
22 | ||
223e47cc LB |
23 | void User::replaceUsesOfWith(Value *From, Value *To) { |
24 | if (From == To) return; // Duh what? | |
25 | ||
26 | assert((!isa<Constant>(this) || isa<GlobalValue>(this)) && | |
27 | "Cannot call User::replaceUsesOfWith on a constant!"); | |
28 | ||
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... | |
35 | } | |
36 | } | |
37 | ||
38 | //===----------------------------------------------------------------------===// | |
39 | // User allocHungoffUses Implementation | |
40 | //===----------------------------------------------------------------------===// | |
41 | ||
42 | Use *User::allocHungoffUses(unsigned N) const { | |
43 | // Allocate the array of Uses, followed by a pointer (with bottom bit set) to | |
44 | // the User. | |
45 | size_t size = N * sizeof(Use) + sizeof(Use::UserRef); | |
46 | Use *Begin = static_cast<Use*>(::operator new(size)); | |
47 | Use *End = Begin + N; | |
48 | (void) new(End) Use::UserRef(const_cast<User*>(this), 1); | |
49 | return Use::initTags(Begin, End); | |
50 | } | |
51 | ||
52 | //===----------------------------------------------------------------------===// | |
53 | // User operator new Implementations | |
54 | //===----------------------------------------------------------------------===// | |
55 | ||
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); | |
64 | return Obj; | |
65 | } | |
66 | ||
67 | //===----------------------------------------------------------------------===// | |
68 | // User operator delete Implementation | |
69 | //===----------------------------------------------------------------------===// | |
70 | ||
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); | |
77 | } | |
78 | ||
970d7e83 LB |
79 | //===----------------------------------------------------------------------===// |
80 | // Operator Class | |
81 | //===----------------------------------------------------------------------===// | |
82 | ||
83 | Operator::~Operator() { | |
84 | llvm_unreachable("should never destroy an Operator"); | |
85 | } | |
86 | ||
223e47cc | 87 | } // End llvm namespace |