xref: /aosp_15_r20/external/llvm/lib/IR/Value.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //===-- Value.cpp - Implement the Value class -----------------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file implements the Value, ValueHandle, and User classes.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Value.h"
15*9880d681SAndroid Build Coastguard Worker #include "LLVMContextImpl.h"
16*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/DenseMap.h"
17*9880d681SAndroid Build Coastguard Worker #include "llvm/ADT/SmallString.h"
18*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/CallSite.h"
19*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Constant.h"
20*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Constants.h"
21*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DataLayout.h"
22*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/DerivedTypes.h"
23*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/GetElementPtrTypeIterator.h"
24*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/InstrTypes.h"
25*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Instructions.h"
26*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/IntrinsicInst.h"
27*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Module.h"
28*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Operator.h"
29*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/Statepoint.h"
30*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/ValueHandle.h"
31*9880d681SAndroid Build Coastguard Worker #include "llvm/IR/ValueSymbolTable.h"
32*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Debug.h"
33*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ErrorHandling.h"
34*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/ManagedStatic.h"
35*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
36*9880d681SAndroid Build Coastguard Worker #include <algorithm>
37*9880d681SAndroid Build Coastguard Worker 
38*9880d681SAndroid Build Coastguard Worker using namespace llvm;
39*9880d681SAndroid Build Coastguard Worker 
40*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
41*9880d681SAndroid Build Coastguard Worker //                                Value Class
42*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
checkType(Type * Ty)43*9880d681SAndroid Build Coastguard Worker static inline Type *checkType(Type *Ty) {
44*9880d681SAndroid Build Coastguard Worker   assert(Ty && "Value defined with a null type: Error!");
45*9880d681SAndroid Build Coastguard Worker   return Ty;
46*9880d681SAndroid Build Coastguard Worker }
47*9880d681SAndroid Build Coastguard Worker 
Value(Type * ty,unsigned scid)48*9880d681SAndroid Build Coastguard Worker Value::Value(Type *ty, unsigned scid)
49*9880d681SAndroid Build Coastguard Worker     : VTy(checkType(ty)), UseList(nullptr), SubclassID(scid),
50*9880d681SAndroid Build Coastguard Worker       HasValueHandle(0), SubclassOptionalData(0), SubclassData(0),
51*9880d681SAndroid Build Coastguard Worker       NumUserOperands(0), IsUsedByMD(false), HasName(false) {
52*9880d681SAndroid Build Coastguard Worker   // FIXME: Why isn't this in the subclass gunk??
53*9880d681SAndroid Build Coastguard Worker   // Note, we cannot call isa<CallInst> before the CallInst has been
54*9880d681SAndroid Build Coastguard Worker   // constructed.
55*9880d681SAndroid Build Coastguard Worker   if (SubclassID == Instruction::Call || SubclassID == Instruction::Invoke)
56*9880d681SAndroid Build Coastguard Worker     assert((VTy->isFirstClassType() || VTy->isVoidTy() || VTy->isStructTy()) &&
57*9880d681SAndroid Build Coastguard Worker            "invalid CallInst type!");
58*9880d681SAndroid Build Coastguard Worker   else if (SubclassID != BasicBlockVal &&
59*9880d681SAndroid Build Coastguard Worker            (SubclassID < ConstantFirstVal || SubclassID > ConstantLastVal))
60*9880d681SAndroid Build Coastguard Worker     assert((VTy->isFirstClassType() || VTy->isVoidTy()) &&
61*9880d681SAndroid Build Coastguard Worker            "Cannot create non-first-class values except for constants!");
62*9880d681SAndroid Build Coastguard Worker   static_assert(sizeof(Value) == 3 * sizeof(void *) + 2 * sizeof(unsigned),
63*9880d681SAndroid Build Coastguard Worker                 "Value too big");
64*9880d681SAndroid Build Coastguard Worker }
65*9880d681SAndroid Build Coastguard Worker 
~Value()66*9880d681SAndroid Build Coastguard Worker Value::~Value() {
67*9880d681SAndroid Build Coastguard Worker   // Notify all ValueHandles (if present) that this value is going away.
68*9880d681SAndroid Build Coastguard Worker   if (HasValueHandle)
69*9880d681SAndroid Build Coastguard Worker     ValueHandleBase::ValueIsDeleted(this);
70*9880d681SAndroid Build Coastguard Worker   if (isUsedByMetadata())
71*9880d681SAndroid Build Coastguard Worker     ValueAsMetadata::handleDeletion(this);
72*9880d681SAndroid Build Coastguard Worker 
73*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG      // Only in -g mode...
74*9880d681SAndroid Build Coastguard Worker   // Check to make sure that there are no uses of this value that are still
75*9880d681SAndroid Build Coastguard Worker   // around when the value is destroyed.  If there are, then we have a dangling
76*9880d681SAndroid Build Coastguard Worker   // reference and something is wrong.  This code is here to print out where
77*9880d681SAndroid Build Coastguard Worker   // the value is still being referenced.
78*9880d681SAndroid Build Coastguard Worker   //
79*9880d681SAndroid Build Coastguard Worker   if (!use_empty()) {
80*9880d681SAndroid Build Coastguard Worker     dbgs() << "While deleting: " << *VTy << " %" << getName() << "\n";
81*9880d681SAndroid Build Coastguard Worker     for (auto *U : users())
82*9880d681SAndroid Build Coastguard Worker       dbgs() << "Use still stuck around after Def is destroyed:" << *U << "\n";
83*9880d681SAndroid Build Coastguard Worker   }
84*9880d681SAndroid Build Coastguard Worker #endif
85*9880d681SAndroid Build Coastguard Worker   assert(use_empty() && "Uses remain when a value is destroyed!");
86*9880d681SAndroid Build Coastguard Worker 
87*9880d681SAndroid Build Coastguard Worker   // If this value is named, destroy the name.  This should not be in a symtab
88*9880d681SAndroid Build Coastguard Worker   // at this point.
89*9880d681SAndroid Build Coastguard Worker   destroyValueName();
90*9880d681SAndroid Build Coastguard Worker }
91*9880d681SAndroid Build Coastguard Worker 
destroyValueName()92*9880d681SAndroid Build Coastguard Worker void Value::destroyValueName() {
93*9880d681SAndroid Build Coastguard Worker   ValueName *Name = getValueName();
94*9880d681SAndroid Build Coastguard Worker   if (Name)
95*9880d681SAndroid Build Coastguard Worker     Name->Destroy();
96*9880d681SAndroid Build Coastguard Worker   setValueName(nullptr);
97*9880d681SAndroid Build Coastguard Worker }
98*9880d681SAndroid Build Coastguard Worker 
hasNUses(unsigned N) const99*9880d681SAndroid Build Coastguard Worker bool Value::hasNUses(unsigned N) const {
100*9880d681SAndroid Build Coastguard Worker   const_use_iterator UI = use_begin(), E = use_end();
101*9880d681SAndroid Build Coastguard Worker 
102*9880d681SAndroid Build Coastguard Worker   for (; N; --N, ++UI)
103*9880d681SAndroid Build Coastguard Worker     if (UI == E) return false;  // Too few.
104*9880d681SAndroid Build Coastguard Worker   return UI == E;
105*9880d681SAndroid Build Coastguard Worker }
106*9880d681SAndroid Build Coastguard Worker 
hasNUsesOrMore(unsigned N) const107*9880d681SAndroid Build Coastguard Worker bool Value::hasNUsesOrMore(unsigned N) const {
108*9880d681SAndroid Build Coastguard Worker   const_use_iterator UI = use_begin(), E = use_end();
109*9880d681SAndroid Build Coastguard Worker 
110*9880d681SAndroid Build Coastguard Worker   for (; N; --N, ++UI)
111*9880d681SAndroid Build Coastguard Worker     if (UI == E) return false;  // Too few.
112*9880d681SAndroid Build Coastguard Worker 
113*9880d681SAndroid Build Coastguard Worker   return true;
114*9880d681SAndroid Build Coastguard Worker }
115*9880d681SAndroid Build Coastguard Worker 
isUsedInBasicBlock(const BasicBlock * BB) const116*9880d681SAndroid Build Coastguard Worker bool Value::isUsedInBasicBlock(const BasicBlock *BB) const {
117*9880d681SAndroid Build Coastguard Worker   // This can be computed either by scanning the instructions in BB, or by
118*9880d681SAndroid Build Coastguard Worker   // scanning the use list of this Value. Both lists can be very long, but
119*9880d681SAndroid Build Coastguard Worker   // usually one is quite short.
120*9880d681SAndroid Build Coastguard Worker   //
121*9880d681SAndroid Build Coastguard Worker   // Scan both lists simultaneously until one is exhausted. This limits the
122*9880d681SAndroid Build Coastguard Worker   // search to the shorter list.
123*9880d681SAndroid Build Coastguard Worker   BasicBlock::const_iterator BI = BB->begin(), BE = BB->end();
124*9880d681SAndroid Build Coastguard Worker   const_user_iterator UI = user_begin(), UE = user_end();
125*9880d681SAndroid Build Coastguard Worker   for (; BI != BE && UI != UE; ++BI, ++UI) {
126*9880d681SAndroid Build Coastguard Worker     // Scan basic block: Check if this Value is used by the instruction at BI.
127*9880d681SAndroid Build Coastguard Worker     if (std::find(BI->op_begin(), BI->op_end(), this) != BI->op_end())
128*9880d681SAndroid Build Coastguard Worker       return true;
129*9880d681SAndroid Build Coastguard Worker     // Scan use list: Check if the use at UI is in BB.
130*9880d681SAndroid Build Coastguard Worker     const Instruction *User = dyn_cast<Instruction>(*UI);
131*9880d681SAndroid Build Coastguard Worker     if (User && User->getParent() == BB)
132*9880d681SAndroid Build Coastguard Worker       return true;
133*9880d681SAndroid Build Coastguard Worker   }
134*9880d681SAndroid Build Coastguard Worker   return false;
135*9880d681SAndroid Build Coastguard Worker }
136*9880d681SAndroid Build Coastguard Worker 
getNumUses() const137*9880d681SAndroid Build Coastguard Worker unsigned Value::getNumUses() const {
138*9880d681SAndroid Build Coastguard Worker   return (unsigned)std::distance(use_begin(), use_end());
139*9880d681SAndroid Build Coastguard Worker }
140*9880d681SAndroid Build Coastguard Worker 
getSymTab(Value * V,ValueSymbolTable * & ST)141*9880d681SAndroid Build Coastguard Worker static bool getSymTab(Value *V, ValueSymbolTable *&ST) {
142*9880d681SAndroid Build Coastguard Worker   ST = nullptr;
143*9880d681SAndroid Build Coastguard Worker   if (Instruction *I = dyn_cast<Instruction>(V)) {
144*9880d681SAndroid Build Coastguard Worker     if (BasicBlock *P = I->getParent())
145*9880d681SAndroid Build Coastguard Worker       if (Function *PP = P->getParent())
146*9880d681SAndroid Build Coastguard Worker         ST = &PP->getValueSymbolTable();
147*9880d681SAndroid Build Coastguard Worker   } else if (BasicBlock *BB = dyn_cast<BasicBlock>(V)) {
148*9880d681SAndroid Build Coastguard Worker     if (Function *P = BB->getParent())
149*9880d681SAndroid Build Coastguard Worker       ST = &P->getValueSymbolTable();
150*9880d681SAndroid Build Coastguard Worker   } else if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) {
151*9880d681SAndroid Build Coastguard Worker     if (Module *P = GV->getParent())
152*9880d681SAndroid Build Coastguard Worker       ST = &P->getValueSymbolTable();
153*9880d681SAndroid Build Coastguard Worker   } else if (Argument *A = dyn_cast<Argument>(V)) {
154*9880d681SAndroid Build Coastguard Worker     if (Function *P = A->getParent())
155*9880d681SAndroid Build Coastguard Worker       ST = &P->getValueSymbolTable();
156*9880d681SAndroid Build Coastguard Worker   } else {
157*9880d681SAndroid Build Coastguard Worker     assert(isa<Constant>(V) && "Unknown value type!");
158*9880d681SAndroid Build Coastguard Worker     return true;  // no name is setable for this.
159*9880d681SAndroid Build Coastguard Worker   }
160*9880d681SAndroid Build Coastguard Worker   return false;
161*9880d681SAndroid Build Coastguard Worker }
162*9880d681SAndroid Build Coastguard Worker 
getValueName() const163*9880d681SAndroid Build Coastguard Worker ValueName *Value::getValueName() const {
164*9880d681SAndroid Build Coastguard Worker   if (!HasName) return nullptr;
165*9880d681SAndroid Build Coastguard Worker 
166*9880d681SAndroid Build Coastguard Worker   LLVMContext &Ctx = getContext();
167*9880d681SAndroid Build Coastguard Worker   auto I = Ctx.pImpl->ValueNames.find(this);
168*9880d681SAndroid Build Coastguard Worker   assert(I != Ctx.pImpl->ValueNames.end() &&
169*9880d681SAndroid Build Coastguard Worker          "No name entry found!");
170*9880d681SAndroid Build Coastguard Worker 
171*9880d681SAndroid Build Coastguard Worker   return I->second;
172*9880d681SAndroid Build Coastguard Worker }
173*9880d681SAndroid Build Coastguard Worker 
setValueName(ValueName * VN)174*9880d681SAndroid Build Coastguard Worker void Value::setValueName(ValueName *VN) {
175*9880d681SAndroid Build Coastguard Worker   LLVMContext &Ctx = getContext();
176*9880d681SAndroid Build Coastguard Worker 
177*9880d681SAndroid Build Coastguard Worker   assert(HasName == Ctx.pImpl->ValueNames.count(this) &&
178*9880d681SAndroid Build Coastguard Worker          "HasName bit out of sync!");
179*9880d681SAndroid Build Coastguard Worker 
180*9880d681SAndroid Build Coastguard Worker   if (!VN) {
181*9880d681SAndroid Build Coastguard Worker     if (HasName)
182*9880d681SAndroid Build Coastguard Worker       Ctx.pImpl->ValueNames.erase(this);
183*9880d681SAndroid Build Coastguard Worker     HasName = false;
184*9880d681SAndroid Build Coastguard Worker     return;
185*9880d681SAndroid Build Coastguard Worker   }
186*9880d681SAndroid Build Coastguard Worker 
187*9880d681SAndroid Build Coastguard Worker   HasName = true;
188*9880d681SAndroid Build Coastguard Worker   Ctx.pImpl->ValueNames[this] = VN;
189*9880d681SAndroid Build Coastguard Worker }
190*9880d681SAndroid Build Coastguard Worker 
getName() const191*9880d681SAndroid Build Coastguard Worker StringRef Value::getName() const {
192*9880d681SAndroid Build Coastguard Worker   // Make sure the empty string is still a C string. For historical reasons,
193*9880d681SAndroid Build Coastguard Worker   // some clients want to call .data() on the result and expect it to be null
194*9880d681SAndroid Build Coastguard Worker   // terminated.
195*9880d681SAndroid Build Coastguard Worker   if (!hasName())
196*9880d681SAndroid Build Coastguard Worker     return StringRef("", 0);
197*9880d681SAndroid Build Coastguard Worker   return getValueName()->getKey();
198*9880d681SAndroid Build Coastguard Worker }
199*9880d681SAndroid Build Coastguard Worker 
setNameImpl(const Twine & NewName)200*9880d681SAndroid Build Coastguard Worker void Value::setNameImpl(const Twine &NewName) {
201*9880d681SAndroid Build Coastguard Worker   // Fast-path: LLVMContext can be set to strip out non-GlobalValue names
202*9880d681SAndroid Build Coastguard Worker   if (getContext().shouldDiscardValueNames() && !isa<GlobalValue>(this))
203*9880d681SAndroid Build Coastguard Worker     return;
204*9880d681SAndroid Build Coastguard Worker 
205*9880d681SAndroid Build Coastguard Worker   // Fast path for common IRBuilder case of setName("") when there is no name.
206*9880d681SAndroid Build Coastguard Worker   if (NewName.isTriviallyEmpty() && !hasName())
207*9880d681SAndroid Build Coastguard Worker     return;
208*9880d681SAndroid Build Coastguard Worker 
209*9880d681SAndroid Build Coastguard Worker   SmallString<256> NameData;
210*9880d681SAndroid Build Coastguard Worker   StringRef NameRef = NewName.toStringRef(NameData);
211*9880d681SAndroid Build Coastguard Worker   assert(NameRef.find_first_of(0) == StringRef::npos &&
212*9880d681SAndroid Build Coastguard Worker          "Null bytes are not allowed in names");
213*9880d681SAndroid Build Coastguard Worker 
214*9880d681SAndroid Build Coastguard Worker   // Name isn't changing?
215*9880d681SAndroid Build Coastguard Worker   if (getName() == NameRef)
216*9880d681SAndroid Build Coastguard Worker     return;
217*9880d681SAndroid Build Coastguard Worker 
218*9880d681SAndroid Build Coastguard Worker   assert(!getType()->isVoidTy() && "Cannot assign a name to void values!");
219*9880d681SAndroid Build Coastguard Worker 
220*9880d681SAndroid Build Coastguard Worker   // Get the symbol table to update for this object.
221*9880d681SAndroid Build Coastguard Worker   ValueSymbolTable *ST;
222*9880d681SAndroid Build Coastguard Worker   if (getSymTab(this, ST))
223*9880d681SAndroid Build Coastguard Worker     return;  // Cannot set a name on this value (e.g. constant).
224*9880d681SAndroid Build Coastguard Worker 
225*9880d681SAndroid Build Coastguard Worker   if (!ST) { // No symbol table to update?  Just do the change.
226*9880d681SAndroid Build Coastguard Worker     if (NameRef.empty()) {
227*9880d681SAndroid Build Coastguard Worker       // Free the name for this value.
228*9880d681SAndroid Build Coastguard Worker       destroyValueName();
229*9880d681SAndroid Build Coastguard Worker       return;
230*9880d681SAndroid Build Coastguard Worker     }
231*9880d681SAndroid Build Coastguard Worker 
232*9880d681SAndroid Build Coastguard Worker     // NOTE: Could optimize for the case the name is shrinking to not deallocate
233*9880d681SAndroid Build Coastguard Worker     // then reallocated.
234*9880d681SAndroid Build Coastguard Worker     destroyValueName();
235*9880d681SAndroid Build Coastguard Worker 
236*9880d681SAndroid Build Coastguard Worker     // Create the new name.
237*9880d681SAndroid Build Coastguard Worker     setValueName(ValueName::Create(NameRef));
238*9880d681SAndroid Build Coastguard Worker     getValueName()->setValue(this);
239*9880d681SAndroid Build Coastguard Worker     return;
240*9880d681SAndroid Build Coastguard Worker   }
241*9880d681SAndroid Build Coastguard Worker 
242*9880d681SAndroid Build Coastguard Worker   // NOTE: Could optimize for the case the name is shrinking to not deallocate
243*9880d681SAndroid Build Coastguard Worker   // then reallocated.
244*9880d681SAndroid Build Coastguard Worker   if (hasName()) {
245*9880d681SAndroid Build Coastguard Worker     // Remove old name.
246*9880d681SAndroid Build Coastguard Worker     ST->removeValueName(getValueName());
247*9880d681SAndroid Build Coastguard Worker     destroyValueName();
248*9880d681SAndroid Build Coastguard Worker 
249*9880d681SAndroid Build Coastguard Worker     if (NameRef.empty())
250*9880d681SAndroid Build Coastguard Worker       return;
251*9880d681SAndroid Build Coastguard Worker   }
252*9880d681SAndroid Build Coastguard Worker 
253*9880d681SAndroid Build Coastguard Worker   // Name is changing to something new.
254*9880d681SAndroid Build Coastguard Worker   setValueName(ST->createValueName(NameRef, this));
255*9880d681SAndroid Build Coastguard Worker }
256*9880d681SAndroid Build Coastguard Worker 
setName(const Twine & NewName)257*9880d681SAndroid Build Coastguard Worker void Value::setName(const Twine &NewName) {
258*9880d681SAndroid Build Coastguard Worker   setNameImpl(NewName);
259*9880d681SAndroid Build Coastguard Worker   if (Function *F = dyn_cast<Function>(this))
260*9880d681SAndroid Build Coastguard Worker     F->recalculateIntrinsicID();
261*9880d681SAndroid Build Coastguard Worker }
262*9880d681SAndroid Build Coastguard Worker 
takeName(Value * V)263*9880d681SAndroid Build Coastguard Worker void Value::takeName(Value *V) {
264*9880d681SAndroid Build Coastguard Worker   ValueSymbolTable *ST = nullptr;
265*9880d681SAndroid Build Coastguard Worker   // If this value has a name, drop it.
266*9880d681SAndroid Build Coastguard Worker   if (hasName()) {
267*9880d681SAndroid Build Coastguard Worker     // Get the symtab this is in.
268*9880d681SAndroid Build Coastguard Worker     if (getSymTab(this, ST)) {
269*9880d681SAndroid Build Coastguard Worker       // We can't set a name on this value, but we need to clear V's name if
270*9880d681SAndroid Build Coastguard Worker       // it has one.
271*9880d681SAndroid Build Coastguard Worker       if (V->hasName()) V->setName("");
272*9880d681SAndroid Build Coastguard Worker       return;  // Cannot set a name on this value (e.g. constant).
273*9880d681SAndroid Build Coastguard Worker     }
274*9880d681SAndroid Build Coastguard Worker 
275*9880d681SAndroid Build Coastguard Worker     // Remove old name.
276*9880d681SAndroid Build Coastguard Worker     if (ST)
277*9880d681SAndroid Build Coastguard Worker       ST->removeValueName(getValueName());
278*9880d681SAndroid Build Coastguard Worker     destroyValueName();
279*9880d681SAndroid Build Coastguard Worker   }
280*9880d681SAndroid Build Coastguard Worker 
281*9880d681SAndroid Build Coastguard Worker   // Now we know that this has no name.
282*9880d681SAndroid Build Coastguard Worker 
283*9880d681SAndroid Build Coastguard Worker   // If V has no name either, we're done.
284*9880d681SAndroid Build Coastguard Worker   if (!V->hasName()) return;
285*9880d681SAndroid Build Coastguard Worker 
286*9880d681SAndroid Build Coastguard Worker   // Get this's symtab if we didn't before.
287*9880d681SAndroid Build Coastguard Worker   if (!ST) {
288*9880d681SAndroid Build Coastguard Worker     if (getSymTab(this, ST)) {
289*9880d681SAndroid Build Coastguard Worker       // Clear V's name.
290*9880d681SAndroid Build Coastguard Worker       V->setName("");
291*9880d681SAndroid Build Coastguard Worker       return;  // Cannot set a name on this value (e.g. constant).
292*9880d681SAndroid Build Coastguard Worker     }
293*9880d681SAndroid Build Coastguard Worker   }
294*9880d681SAndroid Build Coastguard Worker 
295*9880d681SAndroid Build Coastguard Worker   // Get V's ST, this should always succed, because V has a name.
296*9880d681SAndroid Build Coastguard Worker   ValueSymbolTable *VST;
297*9880d681SAndroid Build Coastguard Worker   bool Failure = getSymTab(V, VST);
298*9880d681SAndroid Build Coastguard Worker   assert(!Failure && "V has a name, so it should have a ST!"); (void)Failure;
299*9880d681SAndroid Build Coastguard Worker 
300*9880d681SAndroid Build Coastguard Worker   // If these values are both in the same symtab, we can do this very fast.
301*9880d681SAndroid Build Coastguard Worker   // This works even if both values have no symtab yet.
302*9880d681SAndroid Build Coastguard Worker   if (ST == VST) {
303*9880d681SAndroid Build Coastguard Worker     // Take the name!
304*9880d681SAndroid Build Coastguard Worker     setValueName(V->getValueName());
305*9880d681SAndroid Build Coastguard Worker     V->setValueName(nullptr);
306*9880d681SAndroid Build Coastguard Worker     getValueName()->setValue(this);
307*9880d681SAndroid Build Coastguard Worker     return;
308*9880d681SAndroid Build Coastguard Worker   }
309*9880d681SAndroid Build Coastguard Worker 
310*9880d681SAndroid Build Coastguard Worker   // Otherwise, things are slightly more complex.  Remove V's name from VST and
311*9880d681SAndroid Build Coastguard Worker   // then reinsert it into ST.
312*9880d681SAndroid Build Coastguard Worker 
313*9880d681SAndroid Build Coastguard Worker   if (VST)
314*9880d681SAndroid Build Coastguard Worker     VST->removeValueName(V->getValueName());
315*9880d681SAndroid Build Coastguard Worker   setValueName(V->getValueName());
316*9880d681SAndroid Build Coastguard Worker   V->setValueName(nullptr);
317*9880d681SAndroid Build Coastguard Worker   getValueName()->setValue(this);
318*9880d681SAndroid Build Coastguard Worker 
319*9880d681SAndroid Build Coastguard Worker   if (ST)
320*9880d681SAndroid Build Coastguard Worker     ST->reinsertValue(this);
321*9880d681SAndroid Build Coastguard Worker }
322*9880d681SAndroid Build Coastguard Worker 
assertModuleIsMaterialized() const323*9880d681SAndroid Build Coastguard Worker void Value::assertModuleIsMaterialized() const {
324*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
325*9880d681SAndroid Build Coastguard Worker   const GlobalValue *GV = dyn_cast<GlobalValue>(this);
326*9880d681SAndroid Build Coastguard Worker   if (!GV)
327*9880d681SAndroid Build Coastguard Worker     return;
328*9880d681SAndroid Build Coastguard Worker   const Module *M = GV->getParent();
329*9880d681SAndroid Build Coastguard Worker   if (!M)
330*9880d681SAndroid Build Coastguard Worker     return;
331*9880d681SAndroid Build Coastguard Worker   assert(M->isMaterialized());
332*9880d681SAndroid Build Coastguard Worker #endif
333*9880d681SAndroid Build Coastguard Worker }
334*9880d681SAndroid Build Coastguard Worker 
335*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
contains(SmallPtrSetImpl<ConstantExpr * > & Cache,ConstantExpr * Expr,Constant * C)336*9880d681SAndroid Build Coastguard Worker static bool contains(SmallPtrSetImpl<ConstantExpr *> &Cache, ConstantExpr *Expr,
337*9880d681SAndroid Build Coastguard Worker                      Constant *C) {
338*9880d681SAndroid Build Coastguard Worker   if (!Cache.insert(Expr).second)
339*9880d681SAndroid Build Coastguard Worker     return false;
340*9880d681SAndroid Build Coastguard Worker 
341*9880d681SAndroid Build Coastguard Worker   for (auto &O : Expr->operands()) {
342*9880d681SAndroid Build Coastguard Worker     if (O == C)
343*9880d681SAndroid Build Coastguard Worker       return true;
344*9880d681SAndroid Build Coastguard Worker     auto *CE = dyn_cast<ConstantExpr>(O);
345*9880d681SAndroid Build Coastguard Worker     if (!CE)
346*9880d681SAndroid Build Coastguard Worker       continue;
347*9880d681SAndroid Build Coastguard Worker     if (contains(Cache, CE, C))
348*9880d681SAndroid Build Coastguard Worker       return true;
349*9880d681SAndroid Build Coastguard Worker   }
350*9880d681SAndroid Build Coastguard Worker   return false;
351*9880d681SAndroid Build Coastguard Worker }
352*9880d681SAndroid Build Coastguard Worker 
contains(Value * Expr,Value * V)353*9880d681SAndroid Build Coastguard Worker static bool contains(Value *Expr, Value *V) {
354*9880d681SAndroid Build Coastguard Worker   if (Expr == V)
355*9880d681SAndroid Build Coastguard Worker     return true;
356*9880d681SAndroid Build Coastguard Worker 
357*9880d681SAndroid Build Coastguard Worker   auto *C = dyn_cast<Constant>(V);
358*9880d681SAndroid Build Coastguard Worker   if (!C)
359*9880d681SAndroid Build Coastguard Worker     return false;
360*9880d681SAndroid Build Coastguard Worker 
361*9880d681SAndroid Build Coastguard Worker   auto *CE = dyn_cast<ConstantExpr>(Expr);
362*9880d681SAndroid Build Coastguard Worker   if (!CE)
363*9880d681SAndroid Build Coastguard Worker     return false;
364*9880d681SAndroid Build Coastguard Worker 
365*9880d681SAndroid Build Coastguard Worker   SmallPtrSet<ConstantExpr *, 4> Cache;
366*9880d681SAndroid Build Coastguard Worker   return contains(Cache, CE, C);
367*9880d681SAndroid Build Coastguard Worker }
368*9880d681SAndroid Build Coastguard Worker #endif // NDEBUG
369*9880d681SAndroid Build Coastguard Worker 
replaceAllUsesWith(Value * New)370*9880d681SAndroid Build Coastguard Worker void Value::replaceAllUsesWith(Value *New) {
371*9880d681SAndroid Build Coastguard Worker   assert(New && "Value::replaceAllUsesWith(<null>) is invalid!");
372*9880d681SAndroid Build Coastguard Worker   assert(!contains(New, this) &&
373*9880d681SAndroid Build Coastguard Worker          "this->replaceAllUsesWith(expr(this)) is NOT valid!");
374*9880d681SAndroid Build Coastguard Worker   assert(New->getType() == getType() &&
375*9880d681SAndroid Build Coastguard Worker          "replaceAllUses of value with new value of different type!");
376*9880d681SAndroid Build Coastguard Worker 
377*9880d681SAndroid Build Coastguard Worker   // Notify all ValueHandles (if present) that this value is going away.
378*9880d681SAndroid Build Coastguard Worker   if (HasValueHandle)
379*9880d681SAndroid Build Coastguard Worker     ValueHandleBase::ValueIsRAUWd(this, New);
380*9880d681SAndroid Build Coastguard Worker   if (isUsedByMetadata())
381*9880d681SAndroid Build Coastguard Worker     ValueAsMetadata::handleRAUW(this, New);
382*9880d681SAndroid Build Coastguard Worker 
383*9880d681SAndroid Build Coastguard Worker   while (!use_empty()) {
384*9880d681SAndroid Build Coastguard Worker     Use &U = *UseList;
385*9880d681SAndroid Build Coastguard Worker     // Must handle Constants specially, we cannot call replaceUsesOfWith on a
386*9880d681SAndroid Build Coastguard Worker     // constant because they are uniqued.
387*9880d681SAndroid Build Coastguard Worker     if (auto *C = dyn_cast<Constant>(U.getUser())) {
388*9880d681SAndroid Build Coastguard Worker       if (!isa<GlobalValue>(C)) {
389*9880d681SAndroid Build Coastguard Worker         C->handleOperandChange(this, New);
390*9880d681SAndroid Build Coastguard Worker         continue;
391*9880d681SAndroid Build Coastguard Worker       }
392*9880d681SAndroid Build Coastguard Worker     }
393*9880d681SAndroid Build Coastguard Worker 
394*9880d681SAndroid Build Coastguard Worker     U.set(New);
395*9880d681SAndroid Build Coastguard Worker   }
396*9880d681SAndroid Build Coastguard Worker 
397*9880d681SAndroid Build Coastguard Worker   if (BasicBlock *BB = dyn_cast<BasicBlock>(this))
398*9880d681SAndroid Build Coastguard Worker     BB->replaceSuccessorsPhiUsesWith(cast<BasicBlock>(New));
399*9880d681SAndroid Build Coastguard Worker }
400*9880d681SAndroid Build Coastguard Worker 
401*9880d681SAndroid Build Coastguard Worker // Like replaceAllUsesWith except it does not handle constants or basic blocks.
402*9880d681SAndroid Build Coastguard Worker // This routine leaves uses within BB.
replaceUsesOutsideBlock(Value * New,BasicBlock * BB)403*9880d681SAndroid Build Coastguard Worker void Value::replaceUsesOutsideBlock(Value *New, BasicBlock *BB) {
404*9880d681SAndroid Build Coastguard Worker   assert(New && "Value::replaceUsesOutsideBlock(<null>, BB) is invalid!");
405*9880d681SAndroid Build Coastguard Worker   assert(!contains(New, this) &&
406*9880d681SAndroid Build Coastguard Worker          "this->replaceUsesOutsideBlock(expr(this), BB) is NOT valid!");
407*9880d681SAndroid Build Coastguard Worker   assert(New->getType() == getType() &&
408*9880d681SAndroid Build Coastguard Worker          "replaceUses of value with new value of different type!");
409*9880d681SAndroid Build Coastguard Worker   assert(BB && "Basic block that may contain a use of 'New' must be defined\n");
410*9880d681SAndroid Build Coastguard Worker 
411*9880d681SAndroid Build Coastguard Worker   use_iterator UI = use_begin(), E = use_end();
412*9880d681SAndroid Build Coastguard Worker   for (; UI != E;) {
413*9880d681SAndroid Build Coastguard Worker     Use &U = *UI;
414*9880d681SAndroid Build Coastguard Worker     ++UI;
415*9880d681SAndroid Build Coastguard Worker     auto *Usr = dyn_cast<Instruction>(U.getUser());
416*9880d681SAndroid Build Coastguard Worker     if (Usr && Usr->getParent() == BB)
417*9880d681SAndroid Build Coastguard Worker       continue;
418*9880d681SAndroid Build Coastguard Worker     U.set(New);
419*9880d681SAndroid Build Coastguard Worker   }
420*9880d681SAndroid Build Coastguard Worker }
421*9880d681SAndroid Build Coastguard Worker 
422*9880d681SAndroid Build Coastguard Worker namespace {
423*9880d681SAndroid Build Coastguard Worker // Various metrics for how much to strip off of pointers.
424*9880d681SAndroid Build Coastguard Worker enum PointerStripKind {
425*9880d681SAndroid Build Coastguard Worker   PSK_ZeroIndices,
426*9880d681SAndroid Build Coastguard Worker   PSK_ZeroIndicesAndAliases,
427*9880d681SAndroid Build Coastguard Worker   PSK_InBoundsConstantIndices,
428*9880d681SAndroid Build Coastguard Worker   PSK_InBounds
429*9880d681SAndroid Build Coastguard Worker };
430*9880d681SAndroid Build Coastguard Worker 
431*9880d681SAndroid Build Coastguard Worker template <PointerStripKind StripKind>
stripPointerCastsAndOffsets(Value * V)432*9880d681SAndroid Build Coastguard Worker static Value *stripPointerCastsAndOffsets(Value *V) {
433*9880d681SAndroid Build Coastguard Worker   if (!V->getType()->isPointerTy())
434*9880d681SAndroid Build Coastguard Worker     return V;
435*9880d681SAndroid Build Coastguard Worker 
436*9880d681SAndroid Build Coastguard Worker   // Even though we don't look through PHI nodes, we could be called on an
437*9880d681SAndroid Build Coastguard Worker   // instruction in an unreachable block, which may be on a cycle.
438*9880d681SAndroid Build Coastguard Worker   SmallPtrSet<Value *, 4> Visited;
439*9880d681SAndroid Build Coastguard Worker 
440*9880d681SAndroid Build Coastguard Worker   Visited.insert(V);
441*9880d681SAndroid Build Coastguard Worker   do {
442*9880d681SAndroid Build Coastguard Worker     if (GEPOperator *GEP = dyn_cast<GEPOperator>(V)) {
443*9880d681SAndroid Build Coastguard Worker       switch (StripKind) {
444*9880d681SAndroid Build Coastguard Worker       case PSK_ZeroIndicesAndAliases:
445*9880d681SAndroid Build Coastguard Worker       case PSK_ZeroIndices:
446*9880d681SAndroid Build Coastguard Worker         if (!GEP->hasAllZeroIndices())
447*9880d681SAndroid Build Coastguard Worker           return V;
448*9880d681SAndroid Build Coastguard Worker         break;
449*9880d681SAndroid Build Coastguard Worker       case PSK_InBoundsConstantIndices:
450*9880d681SAndroid Build Coastguard Worker         if (!GEP->hasAllConstantIndices())
451*9880d681SAndroid Build Coastguard Worker           return V;
452*9880d681SAndroid Build Coastguard Worker         // fallthrough
453*9880d681SAndroid Build Coastguard Worker       case PSK_InBounds:
454*9880d681SAndroid Build Coastguard Worker         if (!GEP->isInBounds())
455*9880d681SAndroid Build Coastguard Worker           return V;
456*9880d681SAndroid Build Coastguard Worker         break;
457*9880d681SAndroid Build Coastguard Worker       }
458*9880d681SAndroid Build Coastguard Worker       V = GEP->getPointerOperand();
459*9880d681SAndroid Build Coastguard Worker     } else if (Operator::getOpcode(V) == Instruction::BitCast ||
460*9880d681SAndroid Build Coastguard Worker                Operator::getOpcode(V) == Instruction::AddrSpaceCast) {
461*9880d681SAndroid Build Coastguard Worker       V = cast<Operator>(V)->getOperand(0);
462*9880d681SAndroid Build Coastguard Worker     } else if (GlobalAlias *GA = dyn_cast<GlobalAlias>(V)) {
463*9880d681SAndroid Build Coastguard Worker       if (StripKind == PSK_ZeroIndices || GA->isInterposable())
464*9880d681SAndroid Build Coastguard Worker         return V;
465*9880d681SAndroid Build Coastguard Worker       V = GA->getAliasee();
466*9880d681SAndroid Build Coastguard Worker     } else {
467*9880d681SAndroid Build Coastguard Worker       if (auto CS = CallSite(V))
468*9880d681SAndroid Build Coastguard Worker         if (Value *RV = CS.getReturnedArgOperand()) {
469*9880d681SAndroid Build Coastguard Worker           V = RV;
470*9880d681SAndroid Build Coastguard Worker           continue;
471*9880d681SAndroid Build Coastguard Worker         }
472*9880d681SAndroid Build Coastguard Worker 
473*9880d681SAndroid Build Coastguard Worker       return V;
474*9880d681SAndroid Build Coastguard Worker     }
475*9880d681SAndroid Build Coastguard Worker     assert(V->getType()->isPointerTy() && "Unexpected operand type!");
476*9880d681SAndroid Build Coastguard Worker   } while (Visited.insert(V).second);
477*9880d681SAndroid Build Coastguard Worker 
478*9880d681SAndroid Build Coastguard Worker   return V;
479*9880d681SAndroid Build Coastguard Worker }
480*9880d681SAndroid Build Coastguard Worker } // end anonymous namespace
481*9880d681SAndroid Build Coastguard Worker 
stripPointerCasts()482*9880d681SAndroid Build Coastguard Worker Value *Value::stripPointerCasts() {
483*9880d681SAndroid Build Coastguard Worker   return stripPointerCastsAndOffsets<PSK_ZeroIndicesAndAliases>(this);
484*9880d681SAndroid Build Coastguard Worker }
485*9880d681SAndroid Build Coastguard Worker 
stripPointerCastsNoFollowAliases()486*9880d681SAndroid Build Coastguard Worker Value *Value::stripPointerCastsNoFollowAliases() {
487*9880d681SAndroid Build Coastguard Worker   return stripPointerCastsAndOffsets<PSK_ZeroIndices>(this);
488*9880d681SAndroid Build Coastguard Worker }
489*9880d681SAndroid Build Coastguard Worker 
stripInBoundsConstantOffsets()490*9880d681SAndroid Build Coastguard Worker Value *Value::stripInBoundsConstantOffsets() {
491*9880d681SAndroid Build Coastguard Worker   return stripPointerCastsAndOffsets<PSK_InBoundsConstantIndices>(this);
492*9880d681SAndroid Build Coastguard Worker }
493*9880d681SAndroid Build Coastguard Worker 
stripAndAccumulateInBoundsConstantOffsets(const DataLayout & DL,APInt & Offset)494*9880d681SAndroid Build Coastguard Worker Value *Value::stripAndAccumulateInBoundsConstantOffsets(const DataLayout &DL,
495*9880d681SAndroid Build Coastguard Worker                                                         APInt &Offset) {
496*9880d681SAndroid Build Coastguard Worker   if (!getType()->isPointerTy())
497*9880d681SAndroid Build Coastguard Worker     return this;
498*9880d681SAndroid Build Coastguard Worker 
499*9880d681SAndroid Build Coastguard Worker   assert(Offset.getBitWidth() == DL.getPointerSizeInBits(cast<PointerType>(
500*9880d681SAndroid Build Coastguard Worker                                      getType())->getAddressSpace()) &&
501*9880d681SAndroid Build Coastguard Worker          "The offset must have exactly as many bits as our pointer.");
502*9880d681SAndroid Build Coastguard Worker 
503*9880d681SAndroid Build Coastguard Worker   // Even though we don't look through PHI nodes, we could be called on an
504*9880d681SAndroid Build Coastguard Worker   // instruction in an unreachable block, which may be on a cycle.
505*9880d681SAndroid Build Coastguard Worker   SmallPtrSet<Value *, 4> Visited;
506*9880d681SAndroid Build Coastguard Worker   Visited.insert(this);
507*9880d681SAndroid Build Coastguard Worker   Value *V = this;
508*9880d681SAndroid Build Coastguard Worker   do {
509*9880d681SAndroid Build Coastguard Worker     if (GEPOperator *GEP = dyn_cast<GEPOperator>(V)) {
510*9880d681SAndroid Build Coastguard Worker       if (!GEP->isInBounds())
511*9880d681SAndroid Build Coastguard Worker         return V;
512*9880d681SAndroid Build Coastguard Worker       APInt GEPOffset(Offset);
513*9880d681SAndroid Build Coastguard Worker       if (!GEP->accumulateConstantOffset(DL, GEPOffset))
514*9880d681SAndroid Build Coastguard Worker         return V;
515*9880d681SAndroid Build Coastguard Worker       Offset = GEPOffset;
516*9880d681SAndroid Build Coastguard Worker       V = GEP->getPointerOperand();
517*9880d681SAndroid Build Coastguard Worker     } else if (Operator::getOpcode(V) == Instruction::BitCast) {
518*9880d681SAndroid Build Coastguard Worker       V = cast<Operator>(V)->getOperand(0);
519*9880d681SAndroid Build Coastguard Worker     } else if (GlobalAlias *GA = dyn_cast<GlobalAlias>(V)) {
520*9880d681SAndroid Build Coastguard Worker       V = GA->getAliasee();
521*9880d681SAndroid Build Coastguard Worker     } else {
522*9880d681SAndroid Build Coastguard Worker       if (auto CS = CallSite(V))
523*9880d681SAndroid Build Coastguard Worker         if (Value *RV = CS.getReturnedArgOperand()) {
524*9880d681SAndroid Build Coastguard Worker           V = RV;
525*9880d681SAndroid Build Coastguard Worker           continue;
526*9880d681SAndroid Build Coastguard Worker         }
527*9880d681SAndroid Build Coastguard Worker 
528*9880d681SAndroid Build Coastguard Worker       return V;
529*9880d681SAndroid Build Coastguard Worker     }
530*9880d681SAndroid Build Coastguard Worker     assert(V->getType()->isPointerTy() && "Unexpected operand type!");
531*9880d681SAndroid Build Coastguard Worker   } while (Visited.insert(V).second);
532*9880d681SAndroid Build Coastguard Worker 
533*9880d681SAndroid Build Coastguard Worker   return V;
534*9880d681SAndroid Build Coastguard Worker }
535*9880d681SAndroid Build Coastguard Worker 
stripInBoundsOffsets()536*9880d681SAndroid Build Coastguard Worker Value *Value::stripInBoundsOffsets() {
537*9880d681SAndroid Build Coastguard Worker   return stripPointerCastsAndOffsets<PSK_InBounds>(this);
538*9880d681SAndroid Build Coastguard Worker }
539*9880d681SAndroid Build Coastguard Worker 
getPointerDereferenceableBytes(const DataLayout & DL,bool & CanBeNull) const540*9880d681SAndroid Build Coastguard Worker unsigned Value::getPointerDereferenceableBytes(const DataLayout &DL,
541*9880d681SAndroid Build Coastguard Worker                                                bool &CanBeNull) const {
542*9880d681SAndroid Build Coastguard Worker   assert(getType()->isPointerTy() && "must be pointer");
543*9880d681SAndroid Build Coastguard Worker 
544*9880d681SAndroid Build Coastguard Worker   unsigned DerefBytes = 0;
545*9880d681SAndroid Build Coastguard Worker   CanBeNull = false;
546*9880d681SAndroid Build Coastguard Worker   if (const Argument *A = dyn_cast<Argument>(this)) {
547*9880d681SAndroid Build Coastguard Worker     DerefBytes = A->getDereferenceableBytes();
548*9880d681SAndroid Build Coastguard Worker     if (DerefBytes == 0 && A->hasByValAttr() && A->getType()->isSized()) {
549*9880d681SAndroid Build Coastguard Worker       DerefBytes = DL.getTypeStoreSize(A->getType());
550*9880d681SAndroid Build Coastguard Worker       CanBeNull = false;
551*9880d681SAndroid Build Coastguard Worker     }
552*9880d681SAndroid Build Coastguard Worker     if (DerefBytes == 0) {
553*9880d681SAndroid Build Coastguard Worker       DerefBytes = A->getDereferenceableOrNullBytes();
554*9880d681SAndroid Build Coastguard Worker       CanBeNull = true;
555*9880d681SAndroid Build Coastguard Worker     }
556*9880d681SAndroid Build Coastguard Worker   } else if (auto CS = ImmutableCallSite(this)) {
557*9880d681SAndroid Build Coastguard Worker     DerefBytes = CS.getDereferenceableBytes(0);
558*9880d681SAndroid Build Coastguard Worker     if (DerefBytes == 0) {
559*9880d681SAndroid Build Coastguard Worker       DerefBytes = CS.getDereferenceableOrNullBytes(0);
560*9880d681SAndroid Build Coastguard Worker       CanBeNull = true;
561*9880d681SAndroid Build Coastguard Worker     }
562*9880d681SAndroid Build Coastguard Worker   } else if (const LoadInst *LI = dyn_cast<LoadInst>(this)) {
563*9880d681SAndroid Build Coastguard Worker     if (MDNode *MD = LI->getMetadata(LLVMContext::MD_dereferenceable)) {
564*9880d681SAndroid Build Coastguard Worker       ConstantInt *CI = mdconst::extract<ConstantInt>(MD->getOperand(0));
565*9880d681SAndroid Build Coastguard Worker       DerefBytes = CI->getLimitedValue();
566*9880d681SAndroid Build Coastguard Worker     }
567*9880d681SAndroid Build Coastguard Worker     if (DerefBytes == 0) {
568*9880d681SAndroid Build Coastguard Worker       if (MDNode *MD =
569*9880d681SAndroid Build Coastguard Worker               LI->getMetadata(LLVMContext::MD_dereferenceable_or_null)) {
570*9880d681SAndroid Build Coastguard Worker         ConstantInt *CI = mdconst::extract<ConstantInt>(MD->getOperand(0));
571*9880d681SAndroid Build Coastguard Worker         DerefBytes = CI->getLimitedValue();
572*9880d681SAndroid Build Coastguard Worker       }
573*9880d681SAndroid Build Coastguard Worker       CanBeNull = true;
574*9880d681SAndroid Build Coastguard Worker     }
575*9880d681SAndroid Build Coastguard Worker   } else if (auto *AI = dyn_cast<AllocaInst>(this)) {
576*9880d681SAndroid Build Coastguard Worker     if (AI->getAllocatedType()->isSized()) {
577*9880d681SAndroid Build Coastguard Worker       DerefBytes = DL.getTypeStoreSize(AI->getAllocatedType());
578*9880d681SAndroid Build Coastguard Worker       CanBeNull = false;
579*9880d681SAndroid Build Coastguard Worker     }
580*9880d681SAndroid Build Coastguard Worker   } else if (auto *GV = dyn_cast<GlobalVariable>(this)) {
581*9880d681SAndroid Build Coastguard Worker     if (GV->getValueType()->isSized() && !GV->hasExternalWeakLinkage()) {
582*9880d681SAndroid Build Coastguard Worker       // TODO: Don't outright reject hasExternalWeakLinkage but set the
583*9880d681SAndroid Build Coastguard Worker       // CanBeNull flag.
584*9880d681SAndroid Build Coastguard Worker       DerefBytes = DL.getTypeStoreSize(GV->getValueType());
585*9880d681SAndroid Build Coastguard Worker       CanBeNull = false;
586*9880d681SAndroid Build Coastguard Worker     }
587*9880d681SAndroid Build Coastguard Worker   }
588*9880d681SAndroid Build Coastguard Worker   return DerefBytes;
589*9880d681SAndroid Build Coastguard Worker }
590*9880d681SAndroid Build Coastguard Worker 
getPointerAlignment(const DataLayout & DL) const591*9880d681SAndroid Build Coastguard Worker unsigned Value::getPointerAlignment(const DataLayout &DL) const {
592*9880d681SAndroid Build Coastguard Worker   assert(getType()->isPointerTy() && "must be pointer");
593*9880d681SAndroid Build Coastguard Worker 
594*9880d681SAndroid Build Coastguard Worker   unsigned Align = 0;
595*9880d681SAndroid Build Coastguard Worker   if (auto *GO = dyn_cast<GlobalObject>(this)) {
596*9880d681SAndroid Build Coastguard Worker     Align = GO->getAlignment();
597*9880d681SAndroid Build Coastguard Worker     if (Align == 0) {
598*9880d681SAndroid Build Coastguard Worker       if (auto *GVar = dyn_cast<GlobalVariable>(GO)) {
599*9880d681SAndroid Build Coastguard Worker         Type *ObjectType = GVar->getValueType();
600*9880d681SAndroid Build Coastguard Worker         if (ObjectType->isSized()) {
601*9880d681SAndroid Build Coastguard Worker           // If the object is defined in the current Module, we'll be giving
602*9880d681SAndroid Build Coastguard Worker           // it the preferred alignment. Otherwise, we have to assume that it
603*9880d681SAndroid Build Coastguard Worker           // may only have the minimum ABI alignment.
604*9880d681SAndroid Build Coastguard Worker           if (GVar->isStrongDefinitionForLinker())
605*9880d681SAndroid Build Coastguard Worker             Align = DL.getPreferredAlignment(GVar);
606*9880d681SAndroid Build Coastguard Worker           else
607*9880d681SAndroid Build Coastguard Worker             Align = DL.getABITypeAlignment(ObjectType);
608*9880d681SAndroid Build Coastguard Worker         }
609*9880d681SAndroid Build Coastguard Worker       }
610*9880d681SAndroid Build Coastguard Worker     }
611*9880d681SAndroid Build Coastguard Worker   } else if (const Argument *A = dyn_cast<Argument>(this)) {
612*9880d681SAndroid Build Coastguard Worker     Align = A->getParamAlignment();
613*9880d681SAndroid Build Coastguard Worker 
614*9880d681SAndroid Build Coastguard Worker     if (!Align && A->hasStructRetAttr()) {
615*9880d681SAndroid Build Coastguard Worker       // An sret parameter has at least the ABI alignment of the return type.
616*9880d681SAndroid Build Coastguard Worker       Type *EltTy = cast<PointerType>(A->getType())->getElementType();
617*9880d681SAndroid Build Coastguard Worker       if (EltTy->isSized())
618*9880d681SAndroid Build Coastguard Worker         Align = DL.getABITypeAlignment(EltTy);
619*9880d681SAndroid Build Coastguard Worker     }
620*9880d681SAndroid Build Coastguard Worker   } else if (const AllocaInst *AI = dyn_cast<AllocaInst>(this)) {
621*9880d681SAndroid Build Coastguard Worker     Align = AI->getAlignment();
622*9880d681SAndroid Build Coastguard Worker     if (Align == 0) {
623*9880d681SAndroid Build Coastguard Worker       Type *AllocatedType = AI->getAllocatedType();
624*9880d681SAndroid Build Coastguard Worker       if (AllocatedType->isSized())
625*9880d681SAndroid Build Coastguard Worker         Align = DL.getPrefTypeAlignment(AllocatedType);
626*9880d681SAndroid Build Coastguard Worker     }
627*9880d681SAndroid Build Coastguard Worker   } else if (auto CS = ImmutableCallSite(this))
628*9880d681SAndroid Build Coastguard Worker     Align = CS.getAttributes().getParamAlignment(AttributeSet::ReturnIndex);
629*9880d681SAndroid Build Coastguard Worker   else if (const LoadInst *LI = dyn_cast<LoadInst>(this))
630*9880d681SAndroid Build Coastguard Worker     if (MDNode *MD = LI->getMetadata(LLVMContext::MD_align)) {
631*9880d681SAndroid Build Coastguard Worker       ConstantInt *CI = mdconst::extract<ConstantInt>(MD->getOperand(0));
632*9880d681SAndroid Build Coastguard Worker       Align = CI->getLimitedValue();
633*9880d681SAndroid Build Coastguard Worker     }
634*9880d681SAndroid Build Coastguard Worker 
635*9880d681SAndroid Build Coastguard Worker   return Align;
636*9880d681SAndroid Build Coastguard Worker }
637*9880d681SAndroid Build Coastguard Worker 
DoPHITranslation(const BasicBlock * CurBB,const BasicBlock * PredBB)638*9880d681SAndroid Build Coastguard Worker Value *Value::DoPHITranslation(const BasicBlock *CurBB,
639*9880d681SAndroid Build Coastguard Worker                                const BasicBlock *PredBB) {
640*9880d681SAndroid Build Coastguard Worker   PHINode *PN = dyn_cast<PHINode>(this);
641*9880d681SAndroid Build Coastguard Worker   if (PN && PN->getParent() == CurBB)
642*9880d681SAndroid Build Coastguard Worker     return PN->getIncomingValueForBlock(PredBB);
643*9880d681SAndroid Build Coastguard Worker   return this;
644*9880d681SAndroid Build Coastguard Worker }
645*9880d681SAndroid Build Coastguard Worker 
getContext() const646*9880d681SAndroid Build Coastguard Worker LLVMContext &Value::getContext() const { return VTy->getContext(); }
647*9880d681SAndroid Build Coastguard Worker 
reverseUseList()648*9880d681SAndroid Build Coastguard Worker void Value::reverseUseList() {
649*9880d681SAndroid Build Coastguard Worker   if (!UseList || !UseList->Next)
650*9880d681SAndroid Build Coastguard Worker     // No need to reverse 0 or 1 uses.
651*9880d681SAndroid Build Coastguard Worker     return;
652*9880d681SAndroid Build Coastguard Worker 
653*9880d681SAndroid Build Coastguard Worker   Use *Head = UseList;
654*9880d681SAndroid Build Coastguard Worker   Use *Current = UseList->Next;
655*9880d681SAndroid Build Coastguard Worker   Head->Next = nullptr;
656*9880d681SAndroid Build Coastguard Worker   while (Current) {
657*9880d681SAndroid Build Coastguard Worker     Use *Next = Current->Next;
658*9880d681SAndroid Build Coastguard Worker     Current->Next = Head;
659*9880d681SAndroid Build Coastguard Worker     Head->setPrev(&Current->Next);
660*9880d681SAndroid Build Coastguard Worker     Head = Current;
661*9880d681SAndroid Build Coastguard Worker     Current = Next;
662*9880d681SAndroid Build Coastguard Worker   }
663*9880d681SAndroid Build Coastguard Worker   UseList = Head;
664*9880d681SAndroid Build Coastguard Worker   Head->setPrev(&UseList);
665*9880d681SAndroid Build Coastguard Worker }
666*9880d681SAndroid Build Coastguard Worker 
667*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
668*9880d681SAndroid Build Coastguard Worker //                             ValueHandleBase Class
669*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
670*9880d681SAndroid Build Coastguard Worker 
AddToExistingUseList(ValueHandleBase ** List)671*9880d681SAndroid Build Coastguard Worker void ValueHandleBase::AddToExistingUseList(ValueHandleBase **List) {
672*9880d681SAndroid Build Coastguard Worker   assert(List && "Handle list is null?");
673*9880d681SAndroid Build Coastguard Worker 
674*9880d681SAndroid Build Coastguard Worker   // Splice ourselves into the list.
675*9880d681SAndroid Build Coastguard Worker   Next = *List;
676*9880d681SAndroid Build Coastguard Worker   *List = this;
677*9880d681SAndroid Build Coastguard Worker   setPrevPtr(List);
678*9880d681SAndroid Build Coastguard Worker   if (Next) {
679*9880d681SAndroid Build Coastguard Worker     Next->setPrevPtr(&Next);
680*9880d681SAndroid Build Coastguard Worker     assert(V == Next->V && "Added to wrong list?");
681*9880d681SAndroid Build Coastguard Worker   }
682*9880d681SAndroid Build Coastguard Worker }
683*9880d681SAndroid Build Coastguard Worker 
AddToExistingUseListAfter(ValueHandleBase * List)684*9880d681SAndroid Build Coastguard Worker void ValueHandleBase::AddToExistingUseListAfter(ValueHandleBase *List) {
685*9880d681SAndroid Build Coastguard Worker   assert(List && "Must insert after existing node");
686*9880d681SAndroid Build Coastguard Worker 
687*9880d681SAndroid Build Coastguard Worker   Next = List->Next;
688*9880d681SAndroid Build Coastguard Worker   setPrevPtr(&List->Next);
689*9880d681SAndroid Build Coastguard Worker   List->Next = this;
690*9880d681SAndroid Build Coastguard Worker   if (Next)
691*9880d681SAndroid Build Coastguard Worker     Next->setPrevPtr(&Next);
692*9880d681SAndroid Build Coastguard Worker }
693*9880d681SAndroid Build Coastguard Worker 
AddToUseList()694*9880d681SAndroid Build Coastguard Worker void ValueHandleBase::AddToUseList() {
695*9880d681SAndroid Build Coastguard Worker   assert(V && "Null pointer doesn't have a use list!");
696*9880d681SAndroid Build Coastguard Worker 
697*9880d681SAndroid Build Coastguard Worker   LLVMContextImpl *pImpl = V->getContext().pImpl;
698*9880d681SAndroid Build Coastguard Worker 
699*9880d681SAndroid Build Coastguard Worker   if (V->HasValueHandle) {
700*9880d681SAndroid Build Coastguard Worker     // If this value already has a ValueHandle, then it must be in the
701*9880d681SAndroid Build Coastguard Worker     // ValueHandles map already.
702*9880d681SAndroid Build Coastguard Worker     ValueHandleBase *&Entry = pImpl->ValueHandles[V];
703*9880d681SAndroid Build Coastguard Worker     assert(Entry && "Value doesn't have any handles?");
704*9880d681SAndroid Build Coastguard Worker     AddToExistingUseList(&Entry);
705*9880d681SAndroid Build Coastguard Worker     return;
706*9880d681SAndroid Build Coastguard Worker   }
707*9880d681SAndroid Build Coastguard Worker 
708*9880d681SAndroid Build Coastguard Worker   // Ok, it doesn't have any handles yet, so we must insert it into the
709*9880d681SAndroid Build Coastguard Worker   // DenseMap.  However, doing this insertion could cause the DenseMap to
710*9880d681SAndroid Build Coastguard Worker   // reallocate itself, which would invalidate all of the PrevP pointers that
711*9880d681SAndroid Build Coastguard Worker   // point into the old table.  Handle this by checking for reallocation and
712*9880d681SAndroid Build Coastguard Worker   // updating the stale pointers only if needed.
713*9880d681SAndroid Build Coastguard Worker   DenseMap<Value*, ValueHandleBase*> &Handles = pImpl->ValueHandles;
714*9880d681SAndroid Build Coastguard Worker   const void *OldBucketPtr = Handles.getPointerIntoBucketsArray();
715*9880d681SAndroid Build Coastguard Worker 
716*9880d681SAndroid Build Coastguard Worker   ValueHandleBase *&Entry = Handles[V];
717*9880d681SAndroid Build Coastguard Worker   assert(!Entry && "Value really did already have handles?");
718*9880d681SAndroid Build Coastguard Worker   AddToExistingUseList(&Entry);
719*9880d681SAndroid Build Coastguard Worker   V->HasValueHandle = true;
720*9880d681SAndroid Build Coastguard Worker 
721*9880d681SAndroid Build Coastguard Worker   // If reallocation didn't happen or if this was the first insertion, don't
722*9880d681SAndroid Build Coastguard Worker   // walk the table.
723*9880d681SAndroid Build Coastguard Worker   if (Handles.isPointerIntoBucketsArray(OldBucketPtr) ||
724*9880d681SAndroid Build Coastguard Worker       Handles.size() == 1) {
725*9880d681SAndroid Build Coastguard Worker     return;
726*9880d681SAndroid Build Coastguard Worker   }
727*9880d681SAndroid Build Coastguard Worker 
728*9880d681SAndroid Build Coastguard Worker   // Okay, reallocation did happen.  Fix the Prev Pointers.
729*9880d681SAndroid Build Coastguard Worker   for (DenseMap<Value*, ValueHandleBase*>::iterator I = Handles.begin(),
730*9880d681SAndroid Build Coastguard Worker        E = Handles.end(); I != E; ++I) {
731*9880d681SAndroid Build Coastguard Worker     assert(I->second && I->first == I->second->V &&
732*9880d681SAndroid Build Coastguard Worker            "List invariant broken!");
733*9880d681SAndroid Build Coastguard Worker     I->second->setPrevPtr(&I->second);
734*9880d681SAndroid Build Coastguard Worker   }
735*9880d681SAndroid Build Coastguard Worker }
736*9880d681SAndroid Build Coastguard Worker 
RemoveFromUseList()737*9880d681SAndroid Build Coastguard Worker void ValueHandleBase::RemoveFromUseList() {
738*9880d681SAndroid Build Coastguard Worker   assert(V && V->HasValueHandle &&
739*9880d681SAndroid Build Coastguard Worker          "Pointer doesn't have a use list!");
740*9880d681SAndroid Build Coastguard Worker 
741*9880d681SAndroid Build Coastguard Worker   // Unlink this from its use list.
742*9880d681SAndroid Build Coastguard Worker   ValueHandleBase **PrevPtr = getPrevPtr();
743*9880d681SAndroid Build Coastguard Worker   assert(*PrevPtr == this && "List invariant broken");
744*9880d681SAndroid Build Coastguard Worker 
745*9880d681SAndroid Build Coastguard Worker   *PrevPtr = Next;
746*9880d681SAndroid Build Coastguard Worker   if (Next) {
747*9880d681SAndroid Build Coastguard Worker     assert(Next->getPrevPtr() == &Next && "List invariant broken");
748*9880d681SAndroid Build Coastguard Worker     Next->setPrevPtr(PrevPtr);
749*9880d681SAndroid Build Coastguard Worker     return;
750*9880d681SAndroid Build Coastguard Worker   }
751*9880d681SAndroid Build Coastguard Worker 
752*9880d681SAndroid Build Coastguard Worker   // If the Next pointer was null, then it is possible that this was the last
753*9880d681SAndroid Build Coastguard Worker   // ValueHandle watching VP.  If so, delete its entry from the ValueHandles
754*9880d681SAndroid Build Coastguard Worker   // map.
755*9880d681SAndroid Build Coastguard Worker   LLVMContextImpl *pImpl = V->getContext().pImpl;
756*9880d681SAndroid Build Coastguard Worker   DenseMap<Value*, ValueHandleBase*> &Handles = pImpl->ValueHandles;
757*9880d681SAndroid Build Coastguard Worker   if (Handles.isPointerIntoBucketsArray(PrevPtr)) {
758*9880d681SAndroid Build Coastguard Worker     Handles.erase(V);
759*9880d681SAndroid Build Coastguard Worker     V->HasValueHandle = false;
760*9880d681SAndroid Build Coastguard Worker   }
761*9880d681SAndroid Build Coastguard Worker }
762*9880d681SAndroid Build Coastguard Worker 
ValueIsDeleted(Value * V)763*9880d681SAndroid Build Coastguard Worker void ValueHandleBase::ValueIsDeleted(Value *V) {
764*9880d681SAndroid Build Coastguard Worker   assert(V->HasValueHandle && "Should only be called if ValueHandles present");
765*9880d681SAndroid Build Coastguard Worker 
766*9880d681SAndroid Build Coastguard Worker   // Get the linked list base, which is guaranteed to exist since the
767*9880d681SAndroid Build Coastguard Worker   // HasValueHandle flag is set.
768*9880d681SAndroid Build Coastguard Worker   LLVMContextImpl *pImpl = V->getContext().pImpl;
769*9880d681SAndroid Build Coastguard Worker   ValueHandleBase *Entry = pImpl->ValueHandles[V];
770*9880d681SAndroid Build Coastguard Worker   assert(Entry && "Value bit set but no entries exist");
771*9880d681SAndroid Build Coastguard Worker 
772*9880d681SAndroid Build Coastguard Worker   // We use a local ValueHandleBase as an iterator so that ValueHandles can add
773*9880d681SAndroid Build Coastguard Worker   // and remove themselves from the list without breaking our iteration.  This
774*9880d681SAndroid Build Coastguard Worker   // is not really an AssertingVH; we just have to give ValueHandleBase a kind.
775*9880d681SAndroid Build Coastguard Worker   // Note that we deliberately do not the support the case when dropping a value
776*9880d681SAndroid Build Coastguard Worker   // handle results in a new value handle being permanently added to the list
777*9880d681SAndroid Build Coastguard Worker   // (as might occur in theory for CallbackVH's): the new value handle will not
778*9880d681SAndroid Build Coastguard Worker   // be processed and the checking code will mete out righteous punishment if
779*9880d681SAndroid Build Coastguard Worker   // the handle is still present once we have finished processing all the other
780*9880d681SAndroid Build Coastguard Worker   // value handles (it is fine to momentarily add then remove a value handle).
781*9880d681SAndroid Build Coastguard Worker   for (ValueHandleBase Iterator(Assert, *Entry); Entry; Entry = Iterator.Next) {
782*9880d681SAndroid Build Coastguard Worker     Iterator.RemoveFromUseList();
783*9880d681SAndroid Build Coastguard Worker     Iterator.AddToExistingUseListAfter(Entry);
784*9880d681SAndroid Build Coastguard Worker     assert(Entry->Next == &Iterator && "Loop invariant broken.");
785*9880d681SAndroid Build Coastguard Worker 
786*9880d681SAndroid Build Coastguard Worker     switch (Entry->getKind()) {
787*9880d681SAndroid Build Coastguard Worker     case Assert:
788*9880d681SAndroid Build Coastguard Worker       break;
789*9880d681SAndroid Build Coastguard Worker     case Tracking:
790*9880d681SAndroid Build Coastguard Worker       // Mark that this value has been deleted by setting it to an invalid Value
791*9880d681SAndroid Build Coastguard Worker       // pointer.
792*9880d681SAndroid Build Coastguard Worker       Entry->operator=(DenseMapInfo<Value *>::getTombstoneKey());
793*9880d681SAndroid Build Coastguard Worker       break;
794*9880d681SAndroid Build Coastguard Worker     case Weak:
795*9880d681SAndroid Build Coastguard Worker       // Weak just goes to null, which will unlink it from the list.
796*9880d681SAndroid Build Coastguard Worker       Entry->operator=(nullptr);
797*9880d681SAndroid Build Coastguard Worker       break;
798*9880d681SAndroid Build Coastguard Worker     case Callback:
799*9880d681SAndroid Build Coastguard Worker       // Forward to the subclass's implementation.
800*9880d681SAndroid Build Coastguard Worker       static_cast<CallbackVH*>(Entry)->deleted();
801*9880d681SAndroid Build Coastguard Worker       break;
802*9880d681SAndroid Build Coastguard Worker     }
803*9880d681SAndroid Build Coastguard Worker   }
804*9880d681SAndroid Build Coastguard Worker 
805*9880d681SAndroid Build Coastguard Worker   // All callbacks, weak references, and assertingVHs should be dropped by now.
806*9880d681SAndroid Build Coastguard Worker   if (V->HasValueHandle) {
807*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG      // Only in +Asserts mode...
808*9880d681SAndroid Build Coastguard Worker     dbgs() << "While deleting: " << *V->getType() << " %" << V->getName()
809*9880d681SAndroid Build Coastguard Worker            << "\n";
810*9880d681SAndroid Build Coastguard Worker     if (pImpl->ValueHandles[V]->getKind() == Assert)
811*9880d681SAndroid Build Coastguard Worker       llvm_unreachable("An asserting value handle still pointed to this"
812*9880d681SAndroid Build Coastguard Worker                        " value!");
813*9880d681SAndroid Build Coastguard Worker 
814*9880d681SAndroid Build Coastguard Worker #endif
815*9880d681SAndroid Build Coastguard Worker     llvm_unreachable("All references to V were not removed?");
816*9880d681SAndroid Build Coastguard Worker   }
817*9880d681SAndroid Build Coastguard Worker }
818*9880d681SAndroid Build Coastguard Worker 
ValueIsRAUWd(Value * Old,Value * New)819*9880d681SAndroid Build Coastguard Worker void ValueHandleBase::ValueIsRAUWd(Value *Old, Value *New) {
820*9880d681SAndroid Build Coastguard Worker   assert(Old->HasValueHandle &&"Should only be called if ValueHandles present");
821*9880d681SAndroid Build Coastguard Worker   assert(Old != New && "Changing value into itself!");
822*9880d681SAndroid Build Coastguard Worker   assert(Old->getType() == New->getType() &&
823*9880d681SAndroid Build Coastguard Worker          "replaceAllUses of value with new value of different type!");
824*9880d681SAndroid Build Coastguard Worker 
825*9880d681SAndroid Build Coastguard Worker   // Get the linked list base, which is guaranteed to exist since the
826*9880d681SAndroid Build Coastguard Worker   // HasValueHandle flag is set.
827*9880d681SAndroid Build Coastguard Worker   LLVMContextImpl *pImpl = Old->getContext().pImpl;
828*9880d681SAndroid Build Coastguard Worker   ValueHandleBase *Entry = pImpl->ValueHandles[Old];
829*9880d681SAndroid Build Coastguard Worker 
830*9880d681SAndroid Build Coastguard Worker   assert(Entry && "Value bit set but no entries exist");
831*9880d681SAndroid Build Coastguard Worker 
832*9880d681SAndroid Build Coastguard Worker   // We use a local ValueHandleBase as an iterator so that
833*9880d681SAndroid Build Coastguard Worker   // ValueHandles can add and remove themselves from the list without
834*9880d681SAndroid Build Coastguard Worker   // breaking our iteration.  This is not really an AssertingVH; we
835*9880d681SAndroid Build Coastguard Worker   // just have to give ValueHandleBase some kind.
836*9880d681SAndroid Build Coastguard Worker   for (ValueHandleBase Iterator(Assert, *Entry); Entry; Entry = Iterator.Next) {
837*9880d681SAndroid Build Coastguard Worker     Iterator.RemoveFromUseList();
838*9880d681SAndroid Build Coastguard Worker     Iterator.AddToExistingUseListAfter(Entry);
839*9880d681SAndroid Build Coastguard Worker     assert(Entry->Next == &Iterator && "Loop invariant broken.");
840*9880d681SAndroid Build Coastguard Worker 
841*9880d681SAndroid Build Coastguard Worker     switch (Entry->getKind()) {
842*9880d681SAndroid Build Coastguard Worker     case Assert:
843*9880d681SAndroid Build Coastguard Worker       // Asserting handle does not follow RAUW implicitly.
844*9880d681SAndroid Build Coastguard Worker       break;
845*9880d681SAndroid Build Coastguard Worker     case Tracking:
846*9880d681SAndroid Build Coastguard Worker       // Tracking goes to new value like a WeakVH. Note that this may make it
847*9880d681SAndroid Build Coastguard Worker       // something incompatible with its templated type. We don't want to have a
848*9880d681SAndroid Build Coastguard Worker       // virtual (or inline) interface to handle this though, so instead we make
849*9880d681SAndroid Build Coastguard Worker       // the TrackingVH accessors guarantee that a client never sees this value.
850*9880d681SAndroid Build Coastguard Worker 
851*9880d681SAndroid Build Coastguard Worker       // FALLTHROUGH
852*9880d681SAndroid Build Coastguard Worker     case Weak:
853*9880d681SAndroid Build Coastguard Worker       // Weak goes to the new value, which will unlink it from Old's list.
854*9880d681SAndroid Build Coastguard Worker       Entry->operator=(New);
855*9880d681SAndroid Build Coastguard Worker       break;
856*9880d681SAndroid Build Coastguard Worker     case Callback:
857*9880d681SAndroid Build Coastguard Worker       // Forward to the subclass's implementation.
858*9880d681SAndroid Build Coastguard Worker       static_cast<CallbackVH*>(Entry)->allUsesReplacedWith(New);
859*9880d681SAndroid Build Coastguard Worker       break;
860*9880d681SAndroid Build Coastguard Worker     }
861*9880d681SAndroid Build Coastguard Worker   }
862*9880d681SAndroid Build Coastguard Worker 
863*9880d681SAndroid Build Coastguard Worker #ifndef NDEBUG
864*9880d681SAndroid Build Coastguard Worker   // If any new tracking or weak value handles were added while processing the
865*9880d681SAndroid Build Coastguard Worker   // list, then complain about it now.
866*9880d681SAndroid Build Coastguard Worker   if (Old->HasValueHandle)
867*9880d681SAndroid Build Coastguard Worker     for (Entry = pImpl->ValueHandles[Old]; Entry; Entry = Entry->Next)
868*9880d681SAndroid Build Coastguard Worker       switch (Entry->getKind()) {
869*9880d681SAndroid Build Coastguard Worker       case Tracking:
870*9880d681SAndroid Build Coastguard Worker       case Weak:
871*9880d681SAndroid Build Coastguard Worker         dbgs() << "After RAUW from " << *Old->getType() << " %"
872*9880d681SAndroid Build Coastguard Worker                << Old->getName() << " to " << *New->getType() << " %"
873*9880d681SAndroid Build Coastguard Worker                << New->getName() << "\n";
874*9880d681SAndroid Build Coastguard Worker         llvm_unreachable("A tracking or weak value handle still pointed to the"
875*9880d681SAndroid Build Coastguard Worker                          " old value!\n");
876*9880d681SAndroid Build Coastguard Worker       default:
877*9880d681SAndroid Build Coastguard Worker         break;
878*9880d681SAndroid Build Coastguard Worker       }
879*9880d681SAndroid Build Coastguard Worker #endif
880*9880d681SAndroid Build Coastguard Worker }
881*9880d681SAndroid Build Coastguard Worker 
882*9880d681SAndroid Build Coastguard Worker // Pin the vtable to this file.
anchor()883*9880d681SAndroid Build Coastguard Worker void CallbackVH::anchor() {}
884