const unsigned char SubclassID;
protected:
+ /// \brief Active type of storage.
+ enum StorageType { Uniqued, Distinct, Temporary };
+
/// \brief Storage flag for non-uniqued, otherwise unowned, metadata.
- bool IsDistinctInContext : 1;
+ StorageType Storage : 2;
// TODO: expose remaining bits to subclasses.
unsigned short SubclassData16;
};
protected:
- Metadata(unsigned ID)
- : SubclassID(ID), IsDistinctInContext(false), SubclassData16(0),
- SubclassData32(0) {}
+ Metadata(unsigned ID, StorageType Storage)
+ : SubclassID(ID), Storage(Storage), SubclassData16(0), SubclassData32(0) {
+ }
~Metadata() {}
/// \brief Store this in a big non-uniqued untyped bucket.
- bool isStoredDistinctInContext() const { return IsDistinctInContext; }
+ bool isStoredDistinctInContext() const { return Storage == Distinct; }
/// \brief Default handling of a changed operand, which asserts.
///
protected:
ValueAsMetadata(unsigned ID, Value *V)
- : Metadata(ID), V(V) {
+ : Metadata(ID, Uniqued), V(V) {
assert(V && "Expected valid value");
}
~ValueAsMetadata() {}
MDString &operator=(const MDString &) LLVM_DELETED_FUNCTION;
StringMapEntry<MDString> *Entry;
- MDString() : Metadata(MDStringKind), Entry(nullptr) {}
- MDString(MDString &&) : Metadata(MDStringKind) {}
+ MDString() : Metadata(MDStringKind, Uniqued), Entry(nullptr) {}
+ MDString(MDString &&) : Metadata(MDStringKind, Uniqued) {}
public:
static MDString *get(LLVMContext &Context, StringRef Str);
llvm_unreachable("Constructor throws?");
}
- MDNode(LLVMContext &Context, unsigned ID, ArrayRef<Metadata *> MDs);
+ MDNode(LLVMContext &Context, unsigned ID, StorageType Storage,
+ ArrayRef<Metadata *> MDs);
~MDNode() {}
void dropAllReferences();
/// If \c AllowRAUW, then if any operands are unresolved support RAUW. RAUW
/// will be dropped once all operands have been resolved (or if \a
/// resolveCycles() is called).
- UniquableMDNode(LLVMContext &C, unsigned ID, ArrayRef<Metadata *> Vals,
- bool AllowRAUW);
+ UniquableMDNode(LLVMContext &C, unsigned ID, StorageType Storage,
+ ArrayRef<Metadata *> Vals);
~UniquableMDNode() {}
void storeDistinctInContext();
friend class LLVMContextImpl;
friend class UniquableMDNode;
- MDTuple(LLVMContext &C, ArrayRef<Metadata *> Vals, bool AllowRAUW)
- : UniquableMDNode(C, MDTupleKind, Vals, AllowRAUW) {}
+ MDTuple(LLVMContext &C, StorageType Storage, ArrayRef<Metadata *> Vals)
+ : UniquableMDNode(C, MDTupleKind, Storage, Vals) {}
~MDTuple() { dropAllReferences(); }
void setHash(unsigned Hash) { MDNodeSubclassData = Hash; }
friend class LLVMContextImpl;
friend class UniquableMDNode;
- MDLocation(LLVMContext &C, unsigned Line, unsigned Column,
- ArrayRef<Metadata *> MDs, bool AllowRAUW);
+ MDLocation(LLVMContext &C, StorageType Storage, unsigned Line,
+ unsigned Column, ArrayRef<Metadata *> MDs);
~MDLocation() { dropAllReferences(); }
- static MDLocation *constructHelper(LLVMContext &Context, unsigned Line,
- unsigned Column, Metadata *Scope,
- Metadata *InlinedAt, bool AllowRAUW);
+ static MDLocation *constructHelper(LLVMContext &Context, StorageType Storage,
+ unsigned Line, unsigned Column,
+ Metadata *Scope, Metadata *InlinedAt);
static MDLocation *getImpl(LLVMContext &Context, unsigned Line,
unsigned Column, Metadata *Scope,
friend class ReplaceableMetadataImpl;
MDNodeFwdDecl(LLVMContext &C, ArrayRef<Metadata *> Vals)
- : MDNode(C, MDNodeFwdDeclKind, Vals) {}
+ : MDNode(C, MDNodeFwdDeclKind, Temporary, Vals) {}
public:
~MDNodeFwdDecl() { dropAllReferences(); }
::operator delete(O);
}
-MDNode::MDNode(LLVMContext &Context, unsigned ID, ArrayRef<Metadata *> MDs)
- : Metadata(ID), Context(Context), NumOperands(MDs.size()),
+MDNode::MDNode(LLVMContext &Context, unsigned ID, StorageType Storage,
+ ArrayRef<Metadata *> MDs)
+ : Metadata(ID, Storage), Context(Context), NumOperands(MDs.size()),
MDNodeSubclassData(0) {
for (unsigned I = 0, E = MDs.size(); I != E; ++I)
setOperand(I, MDs[I]);
}
UniquableMDNode::UniquableMDNode(LLVMContext &C, unsigned ID,
- ArrayRef<Metadata *> Vals, bool AllowRAUW)
- : MDNode(C, ID, Vals) {
- if (!AllowRAUW)
+ StorageType Storage, ArrayRef<Metadata *> Vals)
+ : MDNode(C, ID, Storage, Vals) {
+ if (Storage != Uniqued)
return;
// Check whether any operands are unresolved, requiring re-uniquing.
return nullptr;
// Coallocate space for the node and Operands together, then placement new.
- auto *N = new (MDs.size()) MDTuple(Context, MDs, /* AllowRAUW */ true);
+ auto *N = new (MDs.size()) MDTuple(Context, Uniqued, MDs);
N->setHash(Key.Hash);
Store.insert(N);
return N;
}
MDTuple *MDTuple::getDistinct(LLVMContext &Context, ArrayRef<Metadata *> MDs) {
- auto *N = new (MDs.size()) MDTuple(Context, MDs, /* AllowRAUW */ false);
+ auto *N = new (MDs.size()) MDTuple(Context, Distinct, MDs);
N->storeDistinctInContext();
return N;
}
void MDTuple::eraseFromStoreImpl() { getContext().pImpl->MDTuples.erase(this); }
-MDLocation::MDLocation(LLVMContext &C, unsigned Line, unsigned Column,
- ArrayRef<Metadata *> MDs, bool AllowRAUW)
- : UniquableMDNode(C, MDLocationKind, MDs, AllowRAUW) {
+MDLocation::MDLocation(LLVMContext &C, StorageType Storage, unsigned Line,
+ unsigned Column, ArrayRef<Metadata *> MDs)
+ : UniquableMDNode(C, MDLocationKind, Storage, MDs) {
assert((MDs.size() == 1 || MDs.size() == 2) &&
"Expected a scope and optional inlined-at");
SubclassData16 = Column;
}
-MDLocation *MDLocation::constructHelper(LLVMContext &Context, unsigned Line,
+MDLocation *MDLocation::constructHelper(LLVMContext &Context,
+ StorageType Storage, unsigned Line,
unsigned Column, Metadata *Scope,
- Metadata *InlinedAt, bool AllowRAUW) {
+ Metadata *InlinedAt) {
SmallVector<Metadata *, 2> Ops;
Ops.push_back(Scope);
if (InlinedAt)
Ops.push_back(InlinedAt);
- return new (Ops.size()) MDLocation(Context, Line, Column, Ops, AllowRAUW);
+ return new (Ops.size()) MDLocation(Context, Storage, Line, Column, Ops);
}
static void adjustLine(unsigned &Line) {
if (!ShouldCreate)
return nullptr;
- auto *N = constructHelper(Context, Line, Column, Scope, InlinedAt,
- /* AllowRAUW */ true);
+ auto *N = constructHelper(Context, Uniqued, Line, Column, Scope, InlinedAt);
Store.insert(N);
return N;
}
adjustLine(Line);
adjustColumn(Column);
- auto *N = constructHelper(Context, Line, Column, Scope, InlinedAt,
- /* AllowRAUW */ false);
+ auto *N = constructHelper(Context, Distinct, Line, Column, Scope, InlinedAt);
N->storeDistinctInContext();
return N;
}
void MDNode::deleteTemporary(MDNode *N) { delete cast<MDNodeFwdDecl>(N); }
void UniquableMDNode::storeDistinctInContext() {
- assert(!IsDistinctInContext && "Expected newly distinct metadata");
- IsDistinctInContext = true;
+ Storage = Distinct;
if (auto *T = dyn_cast<MDTuple>(this))
T->setHash(0);
getContext().pImpl->DistinctMDNodes.insert(this);