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
This commit is contained in:
Duncan P. N. Exon Smith 2020-10-23 18:51:02 -04:00
parent db4863ffd1
commit b2b7cf39d5
4 changed files with 29 additions and 34 deletions

View File

@ -592,14 +592,13 @@ class ConstantDataSequential : public ConstantData {
/// the same value but different type. 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.
ConstantDataSequential *Next;
std::unique_ptr<ConstantDataSequential> Next;
void destroyConstantImpl();
protected:
explicit ConstantDataSequential(Type *ty, ValueTy VT, const char *Data)
: ConstantData(ty, VT), DataElements(Data), Next(nullptr) {}
~ConstantDataSequential() { delete Next; }
: ConstantData(ty, VT), DataElements(Data) {}
static Constant *getImpl(StringRef Bytes, Type *Ty);

View File

@ -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

View File

@ -99,9 +99,6 @@ LLVMContextImpl::~LLVMContextImpl() {
UVConstants.clear();
IntConstants.clear();
FPConstants.clear();
for (auto &CDSConstant : CDSConstants)
delete CDSConstant.second;
CDSConstants.clear();
// Destroy attribute node lists.

View File

@ -1346,7 +1346,7 @@ public:
DenseMap<Type *, std::unique_ptr<UndefValue>> UVConstants;
StringMap<ConstantDataSequential*> CDSConstants;
StringMap<std::unique_ptr<ConstantDataSequential>> CDSConstants;
DenseMap<std::pair<const Function *, const BasicBlock *>, BlockAddress *>
BlockAddresses;