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