diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2020-10-23 18:51:02 -0400 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2020-10-26 18:47:25 -0400 |
commit | b2b7cf39d596b1528cd64015575b3f5d1461c011 (patch) | |
tree | 8758948e3315303443d5356d3e1f39459084b11a /llvm/lib/IR/Constants.cpp | |
parent | db4863ffd1ff0beaf8b13a50beb81d22c8f1137d (diff) | |
download | llvm-b2b7cf39d596b1528cd64015575b3f5d1461c011.zip llvm-b2b7cf39d596b1528cd64015575b3f5d1461c011.tar.gz llvm-b2b7cf39d596b1528cd64015575b3f5d1461c011.tar.bz2 |
IR: Clarify ownership of ConstantDataSequentials, NFC
Change `ConstantDataSequential::Next` to a
`unique_ptr<ConstantDataSequential>` and update `CDSConstants` to a
`StringMap<unique_ptr<ConstantDataSequential>>`, making the ownership
more obvious.
Differential Revision: https://reviews.llvm.org/D90083
Diffstat (limited to 'llvm/lib/IR/Constants.cpp')
-rw-r--r-- | llvm/lib/IR/Constants.cpp | 53 |
1 files changed, 26 insertions, 27 deletions
diff --git a/llvm/lib/IR/Constants.cpp b/llvm/lib/IR/Constants.cpp index 7eca7dd..cfefd33 100644 --- a/llvm/lib/IR/Constants.cpp +++ b/llvm/lib/IR/Constants.cpp @@ -2783,56 +2783,55 @@ Constant *ConstantDataSequential::getImpl(StringRef Elements, Type *Ty) { // body but different types. For example, 0,0,0,1 could be a 4 element array // of i8, or a 1-element array of i32. They'll both end up in the same /// StringMap bucket, linked up by their Next pointers. Walk the list. - ConstantDataSequential **Entry = &Slot.second; - for (ConstantDataSequential *Node = *Entry; Node; - Entry = &Node->Next, Node = *Entry) + std::unique_ptr<ConstantDataSequential> *Entry = &Slot.second; + for (ConstantDataSequential *Node = Entry->get(); Node; + Entry = &Node->Next, Node = Entry->get()) if (Node->getType() == Ty) return Node; // Okay, we didn't get a hit. Create a node of the right class, link it in, // and return it. - if (isa<ArrayType>(Ty)) - return *Entry = new ConstantDataArray(Ty, Slot.first().data()); + if (isa<ArrayType>(Ty)) { + Entry->reset(new ConstantDataArray(Ty, Slot.first().data())); + return Entry->get(); + } assert(isa<VectorType>(Ty)); - return *Entry = new ConstantDataVector(Ty, Slot.first().data()); + Entry->reset(new ConstantDataVector(Ty, Slot.first().data())); + return Entry->get(); } void ConstantDataSequential::destroyConstantImpl() { // Remove the constant from the StringMap. - StringMap<ConstantDataSequential*> &CDSConstants = - getType()->getContext().pImpl->CDSConstants; + StringMap<std::unique_ptr<ConstantDataSequential>> &CDSConstants = + getType()->getContext().pImpl->CDSConstants; - StringMap<ConstantDataSequential*>::iterator Slot = - CDSConstants.find(getRawDataValues()); + auto Slot = CDSConstants.find(getRawDataValues()); assert(Slot != CDSConstants.end() && "CDS not found in uniquing table"); - ConstantDataSequential **Entry = &Slot->getValue(); + std::unique_ptr<ConstantDataSequential> *Entry = &Slot->getValue(); // Remove the entry from the hash table. if (!(*Entry)->Next) { // If there is only one value in the bucket (common case) it must be this // entry, and removing the entry should remove the bucket completely. - assert((*Entry) == this && "Hash mismatch in ConstantDataSequential"); + assert(Entry->get() == this && "Hash mismatch in ConstantDataSequential"); getContext().pImpl->CDSConstants.erase(Slot); - } else { - // Otherwise, there are multiple entries linked off the bucket, unlink the - // node we care about but keep the bucket around. - for (ConstantDataSequential *Node = *Entry; ; - Entry = &Node->Next, Node = *Entry) { - assert(Node && "Didn't find entry in its uniquing hash table!"); - // If we found our entry, unlink it from the list and we're done. - if (Node == this) { - *Entry = Node->Next; - break; - } - } + return; } - // If we were part of a list, make sure that we don't delete the list that is - // still owned by the uniquing map. - Next = nullptr; + // Otherwise, there are multiple entries linked off the bucket, unlink the + // node we care about but keep the bucket around. + for (ConstantDataSequential *Node = Entry->get();; + Entry = &Node->Next, Node = Entry->get()) { + assert(Node && "Didn't find entry in its uniquing hash table!"); + // If we found our entry, unlink it from the list and we're done. + if (Node == this) { + *Entry = std::move(Node->Next); + return; + } + } } /// getFP() constructors - Return a constant of array type with a float |