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 | 61336ae001e07c6d68454b1494e45954d373fb51 (patch) | |
tree | 3405e69a31ba002ace3432c8b1abd2dff10fff64 /lib/VMCore | |
parent | b45218f7c8c53ed77bc35563b2a300781be3cdd0 (diff) | |
download | external_llvm-61336ae001e07c6d68454b1494e45954d373fb51.zip external_llvm-61336ae001e07c6d68454b1494e45954d373fb51.tar.gz external_llvm-61336ae001e07c6d68454b1494e45954d373fb51.tar.bz2 |
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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@100088 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/VMCore')
-rw-r--r-- | lib/VMCore/Instruction.cpp | 4 | ||||
-rw-r--r-- | lib/VMCore/Metadata.cpp | 32 |
2 files changed, 28 insertions, 8 deletions
diff --git a/lib/VMCore/Instruction.cpp b/lib/VMCore/Instruction.cpp index ee75a97..a37fe07 100644 --- a/lib/VMCore/Instruction.cpp +++ b/lib/VMCore/Instruction.cpp @@ -22,7 +22,7 @@ using namespace llvm; Instruction::Instruction(const Type *ty, unsigned it, Use *Ops, unsigned NumOps, Instruction *InsertBefore) - : User(ty, Value::InstructionVal + it, Ops, NumOps), Parent(0), DbgInfo(0) { + : User(ty, Value::InstructionVal + it, Ops, NumOps), Parent(0) { // Make sure that we get added to a basicblock LeakDetector::addGarbageObject(this); @@ -36,7 +36,7 @@ Instruction::Instruction(const Type *ty, unsigned it, Use *Ops, unsigned NumOps, Instruction::Instruction(const Type *ty, unsigned it, Use *Ops, unsigned NumOps, BasicBlock *InsertAtEnd) - : User(ty, Value::InstructionVal + it, Ops, NumOps), Parent(0), DbgInfo(0) { + : User(ty, Value::InstructionVal + it, Ops, NumOps), Parent(0) { // Make sure that we get added to a basicblock LeakDetector::addGarbageObject(this); diff --git a/lib/VMCore/Metadata.cpp b/lib/VMCore/Metadata.cpp index 6f794da..73e6091 100644 --- a/lib/VMCore/Metadata.cpp +++ b/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); |