diff options
author | Chris Lattner <sabre@nondot.org> | 2010-04-01 05:23:13 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2010-04-01 05:23:13 +0000 |
commit | c0f5ce32d5ec06b22788feda4da25e1c394a9670 (patch) | |
tree | b48c17271baee6af0be8e869e655e7e984c115e9 /llvm/lib/VMCore/Metadata.cpp | |
parent | e04505e717123484bdde8f51d4f6a4ac7607f797 (diff) | |
download | bcm5719-llvm-c0f5ce32d5ec06b22788feda4da25e1c394a9670.tar.gz bcm5719-llvm-c0f5ce32d5ec06b22788feda4da25e1c394a9670.zip |
Switch the representation of the location in instruction from
being a TrackingVH<MDNode> to a NewDebugLoc, shrinking
sizeof(Instruction) a lot, and providing clients the ability
to deal with locations in terms of NewDebugLoc instead of
having to deal with Metadata. This is still fully compatible
with all clients that *do* use MDNodes for everything of
course.
No functionality change.
llvm-svn: 100088
Diffstat (limited to 'llvm/lib/VMCore/Metadata.cpp')
-rw-r--r-- | llvm/lib/VMCore/Metadata.cpp | 32 |
1 files changed, 26 insertions, 6 deletions
diff --git a/llvm/lib/VMCore/Metadata.cpp b/llvm/lib/VMCore/Metadata.cpp index 6f794da9110..73e60912e43 100644 --- a/llvm/lib/VMCore/Metadata.cpp +++ b/llvm/lib/VMCore/Metadata.cpp @@ -425,7 +425,7 @@ MDNode *Instruction::getMetadataImpl(const char *Kind) const { } void Instruction::setDbgMetadata(MDNode *Node) { - DbgInfo = Node; + DbgLoc = NewDebugLoc::getFromDILocation(Node); } /// setMetadata - Set the metadata of of the specified kind to the specified @@ -436,7 +436,7 @@ void Instruction::setMetadata(unsigned KindID, MDNode *Node) { // Handle 'dbg' as a special case since it is not stored in the hash table. if (KindID == LLVMContext::MD_dbg) { - DbgInfo = Node; + DbgLoc = NewDebugLoc::getFromDILocation(Node); return; } @@ -488,7 +488,7 @@ void Instruction::setMetadata(unsigned KindID, MDNode *Node) { MDNode *Instruction::getMetadataImpl(unsigned KindID) const { // Handle 'dbg' as a special case since it is not stored in the hash table. if (KindID == LLVMContext::MD_dbg) - return DbgInfo; + return DbgLoc.getAsMDNode(getContext()); if (!hasMetadataHashEntry()) return 0; @@ -507,8 +507,9 @@ void Instruction::getAllMetadataImpl(SmallVectorImpl<std::pair<unsigned, Result.clear(); // Handle 'dbg' as a special case since it is not stored in the hash table. - if (DbgInfo) { - Result.push_back(std::make_pair((unsigned)LLVMContext::MD_dbg, DbgInfo)); + if (!DbgLoc.isUnknown()) { + Result.push_back(std::make_pair((unsigned)LLVMContext::MD_dbg, + DbgLoc.getAsMDNode(getContext()))); if (!hasMetadataHashEntry()) return; } @@ -526,10 +527,29 @@ void Instruction::getAllMetadataImpl(SmallVectorImpl<std::pair<unsigned, array_pod_sort(Result.begin(), Result.end()); } +void Instruction:: +getAllMetadataOtherThanDebugLocImpl(SmallVectorImpl<std::pair<unsigned, + MDNode*> > &Result) const { + Result.clear(); + assert(hasMetadataHashEntry() && + getContext().pImpl->MetadataStore.count(this) && + "Shouldn't have called this"); + const LLVMContextImpl::MDMapTy &Info = + getContext().pImpl->MetadataStore.find(this)->second; + assert(!Info.empty() && "Shouldn't have called this"); + + Result.append(Info.begin(), Info.end()); + + // Sort the resulting array so it is stable. + if (Result.size() > 1) + array_pod_sort(Result.begin(), Result.end()); +} + + /// removeAllMetadata - Remove all metadata from this instruction. void Instruction::removeAllMetadata() { assert(hasMetadata() && "Caller should check"); - DbgInfo = 0; + DbgLoc = NewDebugLoc(); if (hasMetadataHashEntry()) { getContext().pImpl->MetadataStore.erase(this); setHasMetadataHashEntry(false); |