diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-01-19 18:36:18 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-01-19 18:36:18 +0000 |
commit | f13404536548c6de78369726250fd252f534808b (patch) | |
tree | 8c0948717fd89f26554bfbce0bfc14f432b9eb48 /llvm/lib/IR/Metadata.cpp | |
parent | 9327bdad2f784a72e32fa97f7b3ca21d5d25082c (diff) | |
download | bcm5719-llvm-f13404536548c6de78369726250fd252f534808b.tar.gz bcm5719-llvm-f13404536548c6de78369726250fd252f534808b.zip |
IR: Use an enum to describe Metadata storage, NFC
More clearly describe the type of storage used for `Metadata`.
- `Uniqued`: uniqued, stored in the context.
- `Distinct`: distinct, stored in the context.
- `Temporary`: not owned by anyone.
This is the first in a series of commits to fix a design problem with
`MDNodeFwdDecl` that I need to solve for PR22235. While `MDNodeFwdDecl`
works well as a forward declaration, we use `MDNode::getTemporary()` for
more than forward declarations -- we also need to create early versions
of nodes (with fields not filled in) that we'll fill out later (see
`DIBuilder::finalize()` and `CGDebugInfo::finalize()` for examples).
This was a blind spot I had when I introduced `MDNodeFwdDecl` (which
David Blaikie (indirectly) highlighted in an unrelated review [1]).
[1]: http://lists.cs.uiuc.edu/pipermail/llvm-commits/Week-of-Mon-20150112/252381.html
In general, we need `MDTuple::getTemporary()` to give a temporary tuple
(like `MDNodeFwdDecl`), `MDLocation::getTemporary()` to give a temporary
location, and (the problem at hand) `GenericDebugMDNode::getTemporary()`
to give a temporary generic debug node.
So I need to fold the idea of "temporary" nodes back into
`UniquableMDNode`. (More commits to follow as I refactor.)
llvm-svn: 226481
Diffstat (limited to 'llvm/lib/IR/Metadata.cpp')
-rw-r--r-- | llvm/lib/IR/Metadata.cpp | 37 |
1 files changed, 18 insertions, 19 deletions
diff --git a/llvm/lib/IR/Metadata.cpp b/llvm/lib/IR/Metadata.cpp index de204d58764..714b17e974e 100644 --- a/llvm/lib/IR/Metadata.cpp +++ b/llvm/lib/IR/Metadata.cpp @@ -395,8 +395,9 @@ void MDNode::operator delete(void *Mem) { ::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]); @@ -415,9 +416,9 @@ static bool isOperandUnresolved(Metadata *Op) { } 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. @@ -618,14 +619,14 @@ MDTuple *MDTuple::getImpl(LLVMContext &Context, ArrayRef<Metadata *> MDs, 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; } @@ -645,9 +646,9 @@ MDTuple *MDTuple::uniquifyImpl() { 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"); @@ -659,14 +660,15 @@ MDLocation::MDLocation(LLVMContext &C, unsigned Line, unsigned Column, 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) { @@ -697,8 +699,7 @@ MDLocation *MDLocation::getImpl(LLVMContext &Context, 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; } @@ -710,8 +711,7 @@ MDLocation *MDLocation::getDistinct(LLVMContext &Context, unsigned Line, 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; } @@ -740,8 +740,7 @@ MDNodeFwdDecl *MDNode::getTemporary(LLVMContext &Context, 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); |