diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/AsmParser/LLParser.cpp | 6 | ||||
| -rw-r--r-- | llvm/lib/AsmParser/LLParser.h | 2 | ||||
| -rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 11 | ||||
| -rw-r--r-- | llvm/lib/IR/DebugInfo.cpp | 6 | ||||
| -rw-r--r-- | llvm/lib/IR/Metadata.cpp | 24 | ||||
| -rw-r--r-- | llvm/lib/IR/Verifier.cpp | 2 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Utils/InlineFunction.cpp | 7 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Utils/ValueMapper.cpp | 8 |
8 files changed, 36 insertions, 30 deletions
diff --git a/llvm/lib/AsmParser/LLParser.cpp b/llvm/lib/AsmParser/LLParser.cpp index 11a5983c8ad..ce195381cfb 100644 --- a/llvm/lib/AsmParser/LLParser.cpp +++ b/llvm/lib/AsmParser/LLParser.cpp @@ -531,7 +531,7 @@ bool LLParser::ParseMDNodeID(MDNode *&Result) { } // Otherwise, create MDNode forward reference. - MDNodeFwdDecl *FwdNode = MDNodeFwdDecl::get(Context, None); + MDTuple *FwdNode = MDTuple::getTemporary(Context, None); ForwardRefMDNodes[MID] = std::make_pair(FwdNode, Lex.getLoc()); if (NumberedMetadata.size() <= MID) @@ -597,9 +597,9 @@ bool LLParser::ParseStandaloneMetadata() { // See if this was forward referenced, if so, handle it. auto FI = ForwardRefMDNodes.find(MetadataID); if (FI != ForwardRefMDNodes.end()) { - MDNodeFwdDecl *Temp = FI->second.first; + MDTuple *Temp = FI->second.first; Temp->replaceAllUsesWith(Init); - delete Temp; + MDNode::deleteTemporary(Temp); ForwardRefMDNodes.erase(FI); assert(NumberedMetadata[MetadataID] == Init && "Tracking VH didn't work"); diff --git a/llvm/lib/AsmParser/LLParser.h b/llvm/lib/AsmParser/LLParser.h index 220562d66fc..54e0d5bf020 100644 --- a/llvm/lib/AsmParser/LLParser.h +++ b/llvm/lib/AsmParser/LLParser.h @@ -136,7 +136,7 @@ namespace llvm { std::vector<std::pair<Type*, LocTy> > NumberedTypes; std::vector<TrackingMDNodeRef> NumberedMetadata; - std::map<unsigned, std::pair<MDNodeFwdDecl *, LocTy>> ForwardRefMDNodes; + std::map<unsigned, std::pair<MDTuple *, LocTy>> ForwardRefMDNodes; // Global Value reference information. std::map<std::string, std::pair<GlobalValue*, LocTy> > ForwardRefVals; diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index fe48c254d24..a9adaf4febe 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -541,7 +541,7 @@ void BitcodeReaderMDValueList::AssignValue(Metadata *MD, unsigned Idx) { } // If there was a forward reference to this value, replace it. - MDNodeFwdDecl *PrevMD = cast<MDNodeFwdDecl>(OldMD.get()); + MDTuple *PrevMD = cast<MDTuple>(OldMD.get()); PrevMD->replaceAllUsesWith(MD); MDNode::deleteTemporary(PrevMD); --NumFwdRefs; @@ -573,9 +573,12 @@ void BitcodeReaderMDValueList::tryToResolveCycles() { // Resolve any cycles. for (auto &MD : MDValuePtrs) { - assert(!(MD && isa<MDNodeFwdDecl>(MD)) && "Unexpected forward reference"); - if (auto *N = dyn_cast_or_null<UniquableMDNode>(MD)) - N->resolveCycles(); + auto *N = dyn_cast_or_null<UniquableMDNode>(MD); + if (!N) + continue; + + assert(!N->isTemporary() && "Unexpected forward reference"); + N->resolveCycles(); } } diff --git a/llvm/lib/IR/DebugInfo.cpp b/llvm/lib/IR/DebugInfo.cpp index 290dbe29c70..c5c11157971 100644 --- a/llvm/lib/IR/DebugInfo.cpp +++ b/llvm/lib/IR/DebugInfo.cpp @@ -337,7 +337,8 @@ void DIDescriptor::replaceAllUsesWith(LLVMContext &VMContext, DIDescriptor D) { DN = MDNode::get(VMContext, Ops); } - auto *Node = cast<MDNodeFwdDecl>(const_cast<MDNode *>(DbgNode)); + assert(DbgNode->isTemporary() && "Expected temporary node"); + auto *Node = const_cast<MDNode *>(DbgNode); Node->replaceAllUsesWith(const_cast<MDNode *>(DN)); MDNode::deleteTemporary(Node); DbgNode = DN; @@ -346,7 +347,8 @@ void DIDescriptor::replaceAllUsesWith(LLVMContext &VMContext, DIDescriptor D) { void DIDescriptor::replaceAllUsesWith(MDNode *D) { assert(DbgNode && "Trying to replace an unverified type!"); assert(DbgNode != D && "This replacement should always happen"); - auto *Node = cast<MDNodeFwdDecl>(const_cast<MDNode *>(DbgNode)); + assert(DbgNode->isTemporary() && "Expected temporary node"); + auto *Node = const_cast<MDNode *>(DbgNode); Node->replaceAllUsesWith(D); MDNode::deleteTemporary(Node); } diff --git a/llvm/lib/IR/Metadata.cpp b/llvm/lib/IR/Metadata.cpp index 8d83e1652cd..01394137e8e 100644 --- a/llvm/lib/IR/Metadata.cpp +++ b/llvm/lib/IR/Metadata.cpp @@ -155,7 +155,8 @@ void ReplaceableMetadataImpl::moveRef(void *Ref, void *New, } void ReplaceableMetadataImpl::replaceAllUsesWith(Metadata *MD) { - assert(!(MD && isa<MDNodeFwdDecl>(MD)) && "Expected non-temp node"); + assert(!(MD && isa<MDNode>(MD) && cast<MDNode>(MD)->isTemporary()) && + "Expected non-temp node"); if (UseMap.empty()) return; @@ -471,13 +472,14 @@ void UniquableMDNode::resolveCycles() { // Resolve all operands. for (const auto &Op : operands()) { - if (!Op) + auto *N = dyn_cast_or_null<UniquableMDNode>(Op); + if (!N) continue; - assert(!isa<MDNodeFwdDecl>(Op) && + + assert(!N->isTemporary() && "Expected all forward declarations to be resolved"); - if (auto *N = dyn_cast<UniquableMDNode>(Op)) - if (!N->isResolved()) - N->resolveCycles(); + if (!N->isResolved()) + N->resolveCycles(); } } @@ -621,7 +623,7 @@ T *UniquableMDNode::storeImpl(T *N, StorageType Storage, StoreT &Store) { N->storeDistinctInContext(); break; case Temporary: - llvm_unreachable("Unexpected temporary node"); + break; } return N; } @@ -723,13 +725,11 @@ void MDLocation::eraseFromStoreImpl() { getContext().pImpl->MDLocations.erase(this); } -MDNodeFwdDecl *MDNode::getTemporary(LLVMContext &Context, - ArrayRef<Metadata *> MDs) { - return MDNodeFwdDecl::get(Context, MDs); +void MDNode::deleteTemporary(MDNode *N) { + assert(N->isTemporary() && "Expected temporary node"); + cast<UniquableMDNode>(N)->deleteAsSubclass(); } -void MDNode::deleteTemporary(MDNode *N) { delete cast<MDNodeFwdDecl>(N); } - void UniquableMDNode::storeDistinctInContext() { assert(isResolved() && "Expected resolved nodes"); Storage = Distinct; diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp index 4bf2d1a6dc6..f0a149354ae 100644 --- a/llvm/lib/IR/Verifier.cpp +++ b/llvm/lib/IR/Verifier.cpp @@ -617,7 +617,7 @@ void Verifier::visitMDNode(MDNode &MD) { } // Check these last, so we diagnose problems in operands first. - Assert1(!isa<MDNodeFwdDecl>(MD), "Expected no forward declarations!", &MD); + Assert1(!MD.isTemporary(), "Expected no forward declarations!", &MD); Assert1(MD.isResolved(), "All nodes should be resolved!", &MD); } diff --git a/llvm/lib/Transforms/Utils/InlineFunction.cpp b/llvm/lib/Transforms/Utils/InlineFunction.cpp index 2a86eb598d4..3cebd232984 100644 --- a/llvm/lib/Transforms/Utils/InlineFunction.cpp +++ b/llvm/lib/Transforms/Utils/InlineFunction.cpp @@ -319,11 +319,11 @@ static void CloneAliasScopeMetadata(CallSite CS, ValueToValueMapTy &VMap) { // Now we have a complete set of all metadata in the chains used to specify // the noalias scopes and the lists of those scopes. - SmallVector<MDNode *, 16> DummyNodes; + SmallVector<MDTuple *, 16> DummyNodes; DenseMap<const MDNode *, TrackingMDNodeRef> MDMap; for (SetVector<const MDNode *>::iterator I = MD.begin(), IE = MD.end(); I != IE; ++I) { - MDNode *Dummy = MDNode::getTemporary(CalledFunc->getContext(), None); + MDTuple *Dummy = MDTuple::getTemporary(CalledFunc->getContext(), None); DummyNodes.push_back(Dummy); MDMap[*I].reset(Dummy); } @@ -343,7 +343,8 @@ static void CloneAliasScopeMetadata(CallSite CS, ValueToValueMapTy &VMap) { } MDNode *NewM = MDNode::get(CalledFunc->getContext(), NewOps); - MDNodeFwdDecl *TempM = cast<MDNodeFwdDecl>(MDMap[*I]); + MDTuple *TempM = cast<MDTuple>(MDMap[*I]); + assert(TempM->isTemporary() && "Expected temporary node"); TempM->replaceAllUsesWith(NewM); } diff --git a/llvm/lib/Transforms/Utils/ValueMapper.cpp b/llvm/lib/Transforms/Utils/ValueMapper.cpp index 5d89858e527..b195c6349b7 100644 --- a/llvm/lib/Transforms/Utils/ValueMapper.cpp +++ b/llvm/lib/Transforms/Utils/ValueMapper.cpp @@ -249,12 +249,12 @@ static Metadata *mapDistinctNode(const UniquableMDNode *Node, // In general we need a dummy node, since whether the operands are null can // affect the size of the node. - std::unique_ptr<MDNodeFwdDecl> Dummy( - MDNode::getTemporary(Node->getContext(), None)); - mapToMetadata(VM, Node, Dummy.get()); + MDTuple *Dummy = MDTuple::getTemporary(Node->getContext(), None); + mapToMetadata(VM, Node, Dummy); Metadata *NewMD = cloneMDNode(Node, VM, Flags, TypeMapper, Materializer, /* IsDistinct */ true); Dummy->replaceAllUsesWith(NewMD); + MDNode::deleteTemporary(Dummy); return mapToMetadata(VM, Node, NewMD); } @@ -285,7 +285,7 @@ static Metadata *mapUniquedNode(const UniquableMDNode *Node, assert(Node->isUniqued() && "Expected uniqued node"); // Create a dummy node in case we have a metadata cycle. - MDNodeFwdDecl *Dummy = MDNode::getTemporary(Node->getContext(), None); + MDTuple *Dummy = MDTuple::getTemporary(Node->getContext(), None); mapToMetadata(VM, Node, Dummy); // Check all operands to see if any need to be remapped. |

