diff options
Diffstat (limited to 'lib/VMCore/Value.cpp')
| -rw-r--r-- | lib/VMCore/Value.cpp | 337 | 
1 files changed, 181 insertions, 156 deletions
diff --git a/lib/VMCore/Value.cpp b/lib/VMCore/Value.cpp index c952b7888cdd..ba72af635cdc 100644 --- a/lib/VMCore/Value.cpp +++ b/lib/VMCore/Value.cpp @@ -11,17 +11,23 @@  //  //===----------------------------------------------------------------------===// +#include "LLVMContextImpl.h"  #include "llvm/Constant.h"  #include "llvm/Constants.h"  #include "llvm/DerivedTypes.h"  #include "llvm/InstrTypes.h"  #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" +#include "llvm/Support/ErrorHandling.h"  #include "llvm/Support/LeakDetector.h"  #include "llvm/Support/ManagedStatic.h"  #include "llvm/Support/ValueHandle.h" +#include "llvm/Support/raw_ostream.h"  #include "llvm/System/RWMutex.h"  #include "llvm/System/Threading.h"  #include "llvm/ADT/DenseMap.h" @@ -38,23 +44,31 @@ static inline const Type *checkType(const Type *Ty) {  }  Value::Value(const Type *ty, unsigned scid) -  : SubclassID(scid), HasValueHandle(0), SubclassData(0), VTy(checkType(ty)), +  : SubclassID(scid), HasValueHandle(0), HasMetadata(0), +    SubclassOptionalData(0), SubclassData(0), VTy(checkType(ty)),      UseList(0), Name(0) {    if (isa<CallInst>(this) || isa<InvokeInst>(this)) -    assert((VTy->isFirstClassType() || VTy == Type::VoidTy || +    assert((VTy->isFirstClassType() || +            VTy == Type::getVoidTy(ty->getContext()) ||              isa<OpaqueType>(ty) || VTy->getTypeID() == Type::StructTyID) &&             "invalid CallInst  type!");    else if (!isa<Constant>(this) && !isa<BasicBlock>(this)) -    assert((VTy->isFirstClassType() || VTy == Type::VoidTy || +    assert((VTy->isFirstClassType() || +            VTy == Type::getVoidTy(ty->getContext()) ||             isa<OpaqueType>(ty)) &&             "Cannot create non-first-class values except for constants!");  }  Value::~Value() { +  if (HasMetadata) { +    LLVMContext &Context = getContext(); +    Context.pImpl->TheMetadata.ValueIsDeleted(this); +  } +    // Notify all ValueHandles (if present) that this value is going away.    if (HasValueHandle)      ValueHandleBase::ValueIsDeleted(this); -   +  #ifndef NDEBUG      // Only in -g mode...    // Check to make sure that there are no uses of this value that are still    // around when the value is destroyed.  If there are, then we have a dangling @@ -63,9 +77,9 @@ Value::~Value() {    // a <badref>    //    if (!use_empty()) { -    cerr << "While deleting: " << *VTy << " %" << getNameStr() << "\n"; +    errs() << "While deleting: " << *VTy << " %" << getNameStr() << "\n";      for (use_iterator I = use_begin(), E = use_end(); I != E; ++I) -      cerr << "Use still stuck around after Def is destroyed:" +      errs() << "Use still stuck around after Def is destroyed:"             << **I << "\n";    }  #endif @@ -75,7 +89,7 @@ Value::~Value() {    // at this point.    if (Name)      Name->Destroy(); -   +    // There should be no uses of this object anymore, remove it.    LeakDetector::removeGarbageObject(this);  } @@ -128,61 +142,57 @@ static bool getSymTab(Value *V, ValueSymbolTable *&ST) {        if (Function *PP = P->getParent())          ST = &PP->getValueSymbolTable();    } else if (BasicBlock *BB = dyn_cast<BasicBlock>(V)) { -    if (Function *P = BB->getParent())  +    if (Function *P = BB->getParent())        ST = &P->getValueSymbolTable();    } else if (GlobalValue *GV = dyn_cast<GlobalValue>(V)) { -    if (Module *P = GV->getParent())  +    if (Module *P = GV->getParent())        ST = &P->getValueSymbolTable();    } else if (Argument *A = dyn_cast<Argument>(V)) { -    if (Function *P = A->getParent())  +    if (Function *P = A->getParent()) +      ST = &P->getValueSymbolTable(); +  } else if (NamedMDNode *N = dyn_cast<NamedMDNode>(V)) { +    if (Module *P = N->getParent()) {        ST = &P->getValueSymbolTable(); -  } else { +    } +  } else if (isa<MDString>(V)) +    return true; +  else {      assert(isa<Constant>(V) && "Unknown value type!");      return true;  // no name is setable for this.    }    return false;  } -/// getNameStart - Return a pointer to a null terminated string for this name. -/// Note that names can have null characters within the string as well as at -/// their end.  This always returns a non-null pointer. -const char *Value::getNameStart() const { -  if (Name == 0) return ""; -  return Name->getKeyData(); +StringRef Value::getName() const { +  // Make sure the empty string is still a C string. For historical reasons, +  // some clients want to call .data() on the result and expect it to be null +  // terminated. +  if (!Name) return StringRef("", 0); +  return Name->getKey();  } -/// getNameLen - Return the length of the string, correctly handling nul -/// characters embedded into them. -unsigned Value::getNameLen() const { -  return Name ? Name->getKeyLength() : 0; +std::string Value::getNameStr() const { +  return getName().str();  } -/// isName - Return true if this value has the name specified by the provided -/// nul terminated string. -bool Value::isName(const char *N) const { -  unsigned InLen = strlen(N); -  return InLen == getNameLen() && memcmp(getNameStart(), N, InLen) == 0; -} +void Value::setName(const Twine &NewName) { +  // Fast path for common IRBuilder case of setName("") when there is no name. +  if (NewName.isTriviallyEmpty() && !hasName()) +    return; +  SmallString<256> NameData; +  NewName.toVector(NameData); -std::string Value::getNameStr() const { -  if (Name == 0) return ""; -  return std::string(Name->getKeyData(), -                     Name->getKeyData()+Name->getKeyLength()); -} +  const char *NameStr = NameData.data(); +  unsigned NameLen = NameData.size(); -void Value::setName(const std::string &name) { -  setName(&name[0], name.size()); -} +  // Name isn't changing? +  if (getName() == StringRef(NameStr, NameLen)) +    return; -void Value::setName(const char *Name) { -  setName(Name, Name ? strlen(Name) : 0); -} +  assert(getType() != Type::getVoidTy(getContext()) && +         "Cannot assign a name to void values!"); -void Value::setName(const char *NameStr, unsigned NameLen) { -  if (NameLen == 0 && !hasName()) return; -  assert(getType() != Type::VoidTy && "Cannot assign a name to void values!"); -      // Get the symbol table to update for this object.    ValueSymbolTable *ST;    if (getSymTab(this, ST)) @@ -195,32 +205,22 @@ void Value::setName(const char *NameStr, unsigned NameLen) {        Name = 0;        return;      } -     -    if (Name) { -      // Name isn't changing? -      if (NameLen == Name->getKeyLength() && -          !memcmp(Name->getKeyData(), NameStr, NameLen)) -        return; + +    if (Name)        Name->Destroy(); -    } -     +      // NOTE: Could optimize for the case the name is shrinking to not deallocate      // then reallocated. -       +      // Create the new name.      Name = ValueName::Create(NameStr, NameStr+NameLen);      Name->setValue(this);      return;    } -   +    // NOTE: Could optimize for the case the name is shrinking to not deallocate    // then reallocated.    if (hasName()) { -    // Name isn't changing? -    if (NameLen == Name->getKeyLength() && -        !memcmp(Name->getKeyData(), NameStr, NameLen)) -      return; -      // Remove old name.      ST->removeValueName(Name);      Name->Destroy(); @@ -231,12 +231,12 @@ void Value::setName(const char *NameStr, unsigned NameLen) {    }    // Name is changing to something new. -  Name = ST->createValueName(NameStr, NameLen, this); +  Name = ST->createValueName(StringRef(NameStr, NameLen), this);  }  /// takeName - transfer the name from V to this value, setting V's name to -/// empty.  It is an error to call V->takeName(V).  +/// empty.  It is an error to call V->takeName(V).  void Value::takeName(Value *V) {    ValueSymbolTable *ST = 0;    // If this value has a name, drop it. @@ -245,36 +245,36 @@ void Value::takeName(Value *V) {      if (getSymTab(this, ST)) {        // We can't set a name on this value, but we need to clear V's name if        // it has one. -      if (V->hasName()) V->setName(0, 0); +      if (V->hasName()) V->setName("");        return;  // Cannot set a name on this value (e.g. constant).      } -     +      // Remove old name.      if (ST)        ST->removeValueName(Name);      Name->Destroy();      Name = 0; -  }  -   +  } +    // Now we know that this has no name. -   +    // If V has no name either, we're done.    if (!V->hasName()) return; -    +    // Get this's symtab if we didn't before.    if (!ST) {      if (getSymTab(this, ST)) {        // Clear V's name. -      V->setName(0, 0); +      V->setName("");        return;  // Cannot set a name on this value (e.g. constant).      }    } -   +    // Get V's ST, this should always succed, because V has a name.    ValueSymbolTable *VST;    bool Failure = getSymTab(V, VST);    assert(!Failure && "V has a name, so it should have a ST!"); Failure=Failure; -   +    // If these values are both in the same symtab, we can do this very fast.    // This works even if both values have no symtab yet.    if (ST == VST) { @@ -284,16 +284,16 @@ void Value::takeName(Value *V) {      Name->setValue(this);      return;    } -   +    // Otherwise, things are slightly more complex.  Remove V's name from VST and    // then reinsert it into ST. -   +    if (VST)      VST->removeValueName(V->Name);    Name = V->Name;    V->Name = 0;    Name->setValue(this); -   +    if (ST)      ST->reinsertValue(this);  } @@ -309,7 +309,11 @@ void Value::uncheckedReplaceAllUsesWith(Value *New) {    // Notify all ValueHandles (if present) that this value is going away.    if (HasValueHandle)      ValueHandleBase::ValueIsRAUWd(this, New); -  +  if (HasMetadata) { +    LLVMContext &Context = getContext(); +    Context.pImpl->TheMetadata.ValueIsRAUWd(this, New); +  } +    while (!use_empty()) {      Use &U = *UseList;      // Must handle Constants specially, we cannot call replaceUsesOfWith on a @@ -320,7 +324,7 @@ void Value::uncheckedReplaceAllUsesWith(Value *New) {          continue;        }      } -     +      U.set(New);    }  } @@ -339,23 +343,16 @@ Value *Value::stripPointerCasts() {      return this;    Value *V = this;    do { -    if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) { -      if (CE->getOpcode() == Instruction::GetElementPtr) { -        for (unsigned i = 1, e = CE->getNumOperands(); i != e; ++i) -          if (!CE->getOperand(i)->isNullValue()) -            return V; -        V = CE->getOperand(0); -      } else if (CE->getOpcode() == Instruction::BitCast) { -        V = CE->getOperand(0); -      } else { -        return V; -      } -    } else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(V)) { +    if (GEPOperator *GEP = dyn_cast<GEPOperator>(V)) {        if (!GEP->hasAllZeroIndices())          return V; -      V = GEP->getOperand(0); -    } else if (BitCastInst *CI = dyn_cast<BitCastInst>(V)) { -      V = CI->getOperand(0); +      V = GEP->getPointerOperand(); +    } else if (Operator::getOpcode(V) == Instruction::BitCast) { +      V = cast<Operator>(V)->getOperand(0); +    } else if (GlobalAlias *GA = dyn_cast<GlobalAlias>(V)) { +      if (GA->mayBeOverridden()) +        return V; +      V = GA->getAliasee();      } else {        return V;      } @@ -369,15 +366,14 @@ Value *Value::getUnderlyingObject() {    Value *V = this;    unsigned MaxLookup = 6;    do { -    if (Instruction *I = dyn_cast<Instruction>(V)) { -      if (!isa<BitCastInst>(I) && !isa<GetElementPtrInst>(I)) -        return V; -      V = I->getOperand(0); -    } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(V)) { -      if (CE->getOpcode() != Instruction::BitCast && -          CE->getOpcode() != Instruction::GetElementPtr) +    if (GEPOperator *GEP = dyn_cast<GEPOperator>(V)) { +      V = GEP->getPointerOperand(); +    } else if (Operator::getOpcode(V) == Instruction::BitCast) { +      V = cast<Operator>(V)->getOperand(0); +    } else if (GlobalAlias *GA = dyn_cast<GlobalAlias>(V)) { +      if (GA->mayBeOverridden())          return V; -      V = CE->getOperand(0); +      V = GA->getAliasee();      } else {        return V;      } @@ -390,7 +386,7 @@ Value *Value::getUnderlyingObject() {  /// return the value in the PHI node corresponding to PredBB.  If not, return  /// ourself.  This is useful if you want to know the value something has in a  /// predecessor block. -Value *Value::DoPHITranslation(const BasicBlock *CurBB,  +Value *Value::DoPHITranslation(const BasicBlock *CurBB,                                 const BasicBlock *PredBB) {    PHINode *PN = dyn_cast<PHINode>(this);    if (PN && PN->getParent() == CurBB) @@ -398,22 +394,17 @@ Value *Value::DoPHITranslation(const BasicBlock *CurBB,    return this;  } +LLVMContext &Value::getContext() const { return VTy->getContext(); } +  //===----------------------------------------------------------------------===//  //                             ValueHandleBase Class  //===----------------------------------------------------------------------===// -/// ValueHandles - This map keeps track of all of the value handles that are -/// watching a Value*.  The Value::HasValueHandle bit is used to know whether or -/// not a value has an entry in this map. -typedef DenseMap<Value*, ValueHandleBase*> ValueHandlesTy; -static ManagedStatic<ValueHandlesTy> ValueHandles; -static ManagedStatic<sys::SmartRWMutex<true> > ValueHandlesLock; -  /// AddToExistingUseList - Add this ValueHandle to the use list for VP, where  /// List is known to point into the existing use list.  void ValueHandleBase::AddToExistingUseList(ValueHandleBase **List) {    assert(List && "Handle list is null?"); -   +    // Splice ourselves into the list.    Next = *List;    *List = this; @@ -424,43 +415,54 @@ void ValueHandleBase::AddToExistingUseList(ValueHandleBase **List) {    }  } +void ValueHandleBase::AddToExistingUseListAfter(ValueHandleBase *List) { +  assert(List && "Must insert after existing node"); + +  Next = List->Next; +  setPrevPtr(&List->Next); +  List->Next = this; +  if (Next) +    Next->setPrevPtr(&Next); +} +  /// AddToUseList - Add this ValueHandle to the use list for VP.  void ValueHandleBase::AddToUseList() {    assert(VP && "Null pointer doesn't have a use list!"); + +  LLVMContextImpl *pImpl = VP->getContext().pImpl; +    if (VP->HasValueHandle) {      // If this value already has a ValueHandle, then it must be in the      // ValueHandles map already. -    sys::SmartScopedReader<true> Reader(&*ValueHandlesLock); -    ValueHandleBase *&Entry = (*ValueHandles)[VP]; +    ValueHandleBase *&Entry = pImpl->ValueHandles[VP];      assert(Entry != 0 && "Value doesn't have any handles?");      AddToExistingUseList(&Entry);      return;    } -   +    // Ok, it doesn't have any handles yet, so we must insert it into the    // DenseMap.  However, doing this insertion could cause the DenseMap to    // reallocate itself, which would invalidate all of the PrevP pointers that    // point into the old table.  Handle this by checking for reallocation and    // updating the stale pointers only if needed. -  sys::SmartScopedWriter<true> Writer(&*ValueHandlesLock); -  ValueHandlesTy &Handles = *ValueHandles; +  DenseMap<Value*, ValueHandleBase*> &Handles = pImpl->ValueHandles;    const void *OldBucketPtr = Handles.getPointerIntoBucketsArray(); -   +    ValueHandleBase *&Entry = Handles[VP];    assert(Entry == 0 && "Value really did already have handles?");    AddToExistingUseList(&Entry);    VP->HasValueHandle = true; -   +    // If reallocation didn't happen or if this was the first insertion, don't    // walk the table. -  if (Handles.isPointerIntoBucketsArray(OldBucketPtr) ||  +  if (Handles.isPointerIntoBucketsArray(OldBucketPtr) ||        Handles.size() == 1) {      return;    } -   +    // Okay, reallocation did happen.  Fix the Prev Pointers. -  for (ValueHandlesTy::iterator I = Handles.begin(), E = Handles.end(); -       I != E; ++I) { +  for (DenseMap<Value*, ValueHandleBase*>::iterator I = Handles.begin(), +       E = Handles.end(); I != E; ++I) {      assert(I->second && I->first == I->second->VP && "List invariant broken!");      I->second->setPrevPtr(&I->second);    } @@ -473,19 +475,19 @@ void ValueHandleBase::RemoveFromUseList() {    // Unlink this from its use list.    ValueHandleBase **PrevPtr = getPrevPtr();    assert(*PrevPtr == this && "List invariant broken"); -   +    *PrevPtr = Next;    if (Next) {      assert(Next->getPrevPtr() == &Next && "List invariant broken");      Next->setPrevPtr(PrevPtr);      return;    } -   +    // If the Next pointer was null, then it is possible that this was the last    // ValueHandle watching VP.  If so, delete its entry from the ValueHandles    // map. -  sys::SmartScopedWriter<true> Writer(&*ValueHandlesLock); -  ValueHandlesTy &Handles = *ValueHandles; +  LLVMContextImpl *pImpl = VP->getContext().pImpl; +  DenseMap<Value*, ValueHandleBase*> &Handles = pImpl->ValueHandles;    if (Handles.isPointerIntoBucketsArray(PrevPtr)) {      Handles.erase(VP);      VP->HasValueHandle = false; @@ -498,67 +500,91 @@ void ValueHandleBase::ValueIsDeleted(Value *V) {    // Get the linked list base, which is guaranteed to exist since the    // HasValueHandle flag is set. -  ValueHandlesLock->reader_acquire(); -  ValueHandleBase *Entry = (*ValueHandles)[V]; -  ValueHandlesLock->reader_release(); +  LLVMContextImpl *pImpl = V->getContext().pImpl; +  ValueHandleBase *Entry = pImpl->ValueHandles[V];    assert(Entry && "Value bit set but no entries exist"); -   -  while (Entry) { -    // Advance pointer to avoid invalidation. -    ValueHandleBase *ThisNode = Entry; -    Entry = Entry->Next; -     -    switch (ThisNode->getKind()) { + +  // We use a local ValueHandleBase as an iterator so that +  // ValueHandles can add and remove themselves from the list without +  // breaking our iteration.  This is not really an AssertingVH; we +  // just have to give ValueHandleBase some kind. +  for (ValueHandleBase Iterator(Assert, *Entry); Entry; Entry = Iterator.Next) { +    Iterator.RemoveFromUseList(); +    Iterator.AddToExistingUseListAfter(Entry); +    assert(Entry->Next == &Iterator && "Loop invariant broken."); + +    switch (Entry->getKind()) {      case Assert: -#ifndef NDEBUG      // Only in -g mode... -      cerr << "While deleting: " << *V->getType() << " %" << V->getNameStr() -           << "\n"; -#endif -      cerr << "An asserting value handle still pointed to this value!\n"; -      abort(); +      break; +    case Tracking: +      // Mark that this value has been deleted by setting it to an invalid Value +      // pointer. +      Entry->operator=(DenseMapInfo<Value *>::getTombstoneKey()); +      break;      case Weak:        // Weak just goes to null, which will unlink it from the list. -      ThisNode->operator=(0); +      Entry->operator=(0);        break;      case Callback:        // Forward to the subclass's implementation. -      static_cast<CallbackVH*>(ThisNode)->deleted(); +      static_cast<CallbackVH*>(Entry)->deleted();        break;      }    } -   -  // All callbacks and weak references should be dropped by now. -  assert(!V->HasValueHandle && "All references to V were not removed?"); + +  // 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() +           << "\n"; +    if (pImpl->ValueHandles[V]->getKind() == Assert) +      llvm_unreachable("An asserting value handle still pointed to this" +                       " value!"); + +#endif +    llvm_unreachable("All references to V were not removed?"); +  }  }  void ValueHandleBase::ValueIsRAUWd(Value *Old, Value *New) {    assert(Old->HasValueHandle &&"Should only be called if ValueHandles present");    assert(Old != New && "Changing value into itself!"); -   +    // Get the linked list base, which is guaranteed to exist since the    // HasValueHandle flag is set. -  ValueHandlesLock->reader_acquire(); -  ValueHandleBase *Entry = (*ValueHandles)[Old]; -  ValueHandlesLock->reader_release(); +  LLVMContextImpl *pImpl = Old->getContext().pImpl; +  ValueHandleBase *Entry = pImpl->ValueHandles[Old]; +    assert(Entry && "Value bit set but no entries exist"); -   -  while (Entry) { -    // Advance pointer to avoid invalidation. -    ValueHandleBase *ThisNode = Entry; -    Entry = Entry->Next; -     -    switch (ThisNode->getKind()) { + +  // We use a local ValueHandleBase as an iterator so that +  // ValueHandles can add and remove themselves from the list without +  // breaking our iteration.  This is not really an AssertingVH; we +  // just have to give ValueHandleBase some kind. +  for (ValueHandleBase Iterator(Assert, *Entry); Entry; Entry = Iterator.Next) { +    Iterator.RemoveFromUseList(); +    Iterator.AddToExistingUseListAfter(Entry); +    assert(Entry->Next == &Iterator && "Loop invariant broken."); + +    switch (Entry->getKind()) {      case Assert:        // Asserting handle does not follow RAUW implicitly.        break; +    case Tracking: +      // Tracking goes to new value like a WeakVH. Note that this may make it +      // something incompatible with its templated type. We don't want to have a +      // virtual (or inline) interface to handle this though, so instead we make +      // the TrackingVH accessors guarantee that a client never sees this value. + +      // FALLTHROUGH      case Weak:        // Weak goes to the new value, which will unlink it from Old's list. -      ThisNode->operator=(New); +      Entry->operator=(New);        break;      case Callback:        // Forward to the subclass's implementation. -      static_cast<CallbackVH*>(ThisNode)->allUsesReplacedWith(New); +      static_cast<CallbackVH*>(Entry)->allUsesReplacedWith(New);        break;      }    } @@ -580,7 +606,7 @@ void User::replaceUsesOfWith(Value *From, Value *To) {    if (From == To) return;   // Duh what?    assert((!isa<Constant>(this) || isa<GlobalValue>(this)) && -         "Cannot call User::replaceUsesofWith on a constant!"); +         "Cannot call User::replaceUsesOfWith on a constant!");    for (unsigned i = 0, E = getNumOperands(); i != E; ++i)      if (getOperand(i) == From) {  // Is This operand is pointing to oldval? @@ -590,4 +616,3 @@ void User::replaceUsesOfWith(Value *From, Value *To) {        setOperand(i, To); // Fix it now...      }  } -  | 
