#include "llvm/Instructions.h"
#include "llvm/Operator.h"
#include "llvm/Module.h"
-#include "llvm/Metadata.h"
#include "llvm/ValueSymbolTable.h"
#include "llvm/ADT/SmallString.h"
#include "llvm/Support/Debug.h"
SubclassOptionalData(0), SubclassData(0), VTy(checkType(ty)),
UseList(0), Name(0) {
if (isa<CallInst>(this) || isa<InvokeInst>(this))
- assert((VTy->isFirstClassType() ||
- VTy == Type::getVoidTy(ty->getContext()) ||
- isa<OpaqueType>(ty) || VTy->getTypeID() == Type::StructTyID) &&
+ assert((VTy->isFirstClassType() || VTy->isVoidTy() ||
+ ty->isOpaqueTy() || VTy->isStructTy()) &&
"invalid CallInst type!");
else if (!isa<Constant>(this) && !isa<BasicBlock>(this))
- assert((VTy->isFirstClassType() ||
- VTy == Type::getVoidTy(ty->getContext()) ||
- isa<OpaqueType>(ty)) &&
+ assert((VTy->isFirstClassType() || VTy->isVoidTy() ||
+ ty->isOpaqueTy()) &&
"Cannot create non-first-class values except for constants!");
}
// a <badref>
//
if (!use_empty()) {
- errs() << "While deleting: " << *VTy << " %" << getNameStr() << "\n";
+ dbgs() << "While deleting: " << *VTy << " %" << getNameStr() << "\n";
for (use_iterator I = use_begin(), E = use_end(); I != E; ++I)
- errs() << "Use still stuck around after Def is destroyed:"
+ dbgs() << "Use still stuck around after Def is destroyed:"
<< **I << "\n";
}
#endif
/// hasNUses - Return true if this Value has exactly N users.
///
bool Value::hasNUses(unsigned N) const {
- use_const_iterator UI = use_begin(), E = use_end();
+ const_use_iterator UI = use_begin(), E = use_end();
for (; N; --N, ++UI)
if (UI == E) return false; // Too few.
/// logically equivalent to getNumUses() >= N.
///
bool Value::hasNUsesOrMore(unsigned N) const {
- use_const_iterator UI = use_begin(), E = use_end();
+ const_use_iterator UI = use_begin(), E = use_end();
for (; N; --N, ++UI)
if (UI == E) return false; // Too few.
/// isUsedInBasicBlock - Return true if this value is used in the specified
/// basic block.
bool Value::isUsedInBasicBlock(const BasicBlock *BB) const {
- for (use_const_iterator I = use_begin(), E = use_end(); I != E; ++I) {
+ for (const_use_iterator I = use_begin(), E = use_end(); I != E; ++I) {
const Instruction *User = dyn_cast<Instruction>(*I);
if (User && User->getParent() == BB)
return true;
return;
SmallString<256> NameData;
- NewName.toVector(NameData);
-
- const char *NameStr = NameData.data();
- unsigned NameLen = NameData.size();
+ StringRef NameRef = NewName.toStringRef(NameData);
// Name isn't changing?
- if (getName() == StringRef(NameStr, NameLen))
+ if (getName() == NameRef)
return;
- assert(getType() != Type::getVoidTy(getContext()) &&
- "Cannot assign a name to void values!");
+ assert(!getType()->isVoidTy() && "Cannot assign a name to void values!");
// Get the symbol table to update for this object.
ValueSymbolTable *ST;
return; // Cannot set a name on this value (e.g. constant).
if (!ST) { // No symbol table to update? Just do the change.
- if (NameLen == 0) {
+ if (NameRef.empty()) {
// Free the name for this value.
Name->Destroy();
Name = 0;
// then reallocated.
// Create the new name.
- Name = ValueName::Create(NameStr, NameStr+NameLen);
+ Name = ValueName::Create(NameRef.begin(), NameRef.end());
Name->setValue(this);
return;
}
Name->Destroy();
Name = 0;
- if (NameLen == 0)
+ if (NameRef.empty())
return;
}
// Name is changing to something new.
- Name = ST->createValueName(StringRef(NameStr, NameLen), this);
+ Name = ST->createValueName(NameRef, this);
}
if (HasValueHandle)
ValueHandleBase::ValueIsRAUWd(this, New);
- // FIXME: It doesn't make sense at all for metadata to follow RAUW.
- if (Instruction *I = dyn_cast<Instruction>(this))
- if (I->hasMetadata()) {
- LLVMContext &Context = getContext();
- // FIXME: NUKE ValueIsRAUWd??
- Context.pImpl->TheMetadata.ValueIsRAUWd(this, New);
- }
-
while (!use_empty()) {
Use &U = *UseList;
// Must handle Constants specially, we cannot call replaceUsesOfWith on a
}
Value *Value::stripPointerCasts() {
- if (!isa<PointerType>(getType()))
+ if (!getType()->isPointerTy())
return this;
+
+ // Even though we don't look through PHI nodes, we could be called on an
+ // instruction in an unreachable block, which may be on a cycle.
+ SmallPtrSet<Value *, 4> Visited;
+
Value *V = this;
+ Visited.insert(V);
do {
if (GEPOperator *GEP = dyn_cast<GEPOperator>(V)) {
if (!GEP->hasAllZeroIndices())
} else {
return V;
}
- assert(isa<PointerType>(V->getType()) && "Unexpected operand type!");
- } while (1);
+ assert(V->getType()->isPointerTy() && "Unexpected operand type!");
+ } while (Visited.insert(V));
+
+ return V;
}
-Value *Value::getUnderlyingObject() {
- if (!isa<PointerType>(getType()))
+Value *Value::getUnderlyingObject(unsigned MaxLookup) {
+ if (!getType()->isPointerTy())
return this;
Value *V = this;
- unsigned MaxLookup = 6;
- do {
+ for (unsigned Count = 0; MaxLookup == 0 || Count < MaxLookup; ++Count) {
if (GEPOperator *GEP = dyn_cast<GEPOperator>(V)) {
V = GEP->getPointerOperand();
} else if (Operator::getOpcode(V) == Instruction::BitCast) {
} else {
return V;
}
- assert(isa<PointerType>(V->getType()) && "Unexpected operand type!");
- } while (--MaxLookup);
+ assert(V->getType()->isPointerTy() && "Unexpected operand type!");
+ }
return V;
}
// All callbacks, weak references, and assertingVHs should be dropped by now.
if (V->HasValueHandle) {
#ifndef NDEBUG // Only in +Asserts mode...
- errs() << "While deleting: " << *V->getType() << " %" << V->getNameStr()
+ dbgs() << "While deleting: " << *V->getType() << " %" << V->getNameStr()
<< "\n";
if (pImpl->ValueHandles[V]->getKind() == Assert)
llvm_unreachable("An asserting value handle still pointed to this"