diff options
author | Devang Patel <dpatel@apple.com> | 2009-10-22 18:55:16 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2009-10-22 18:55:16 +0000 |
commit | f61b2371c8ec6e0ff2da8f2bd2a606ba755bb2fe (patch) | |
tree | 4e70cd3cb36311326f54ad5a9d293bfc33590a89 | |
parent | b5681b22937440dcb8007f4b125f3325d6341fe0 (diff) | |
download | external_llvm-f61b2371c8ec6e0ff2da8f2bd2a606ba755bb2fe.zip external_llvm-f61b2371c8ec6e0ff2da8f2bd2a606ba755bb2fe.tar.gz external_llvm-f61b2371c8ec6e0ff2da8f2bd2a606ba755bb2fe.tar.bz2 |
Fix getMDs() interface such that it does not expose implementation details.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@84885 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Metadata.h | 2 | ||||
-rw-r--r-- | lib/Bitcode/Writer/BitcodeWriter.cpp | 10 | ||||
-rw-r--r-- | lib/Bitcode/Writer/ValueEnumerator.cpp | 12 | ||||
-rw-r--r-- | lib/VMCore/AsmWriter.cpp | 25 | ||||
-rw-r--r-- | lib/VMCore/Metadata.cpp | 12 |
5 files changed, 35 insertions, 26 deletions
diff --git a/include/llvm/Metadata.h b/include/llvm/Metadata.h index 63b9e5a..d16b7dc 100644 --- a/include/llvm/Metadata.h +++ b/include/llvm/Metadata.h @@ -254,7 +254,7 @@ public: MDNode *getMD(unsigned Kind, const Instruction *Inst); /// getMDs - Get the metadata attached to an Instruction. - const MDMapTy *getMDs(const Instruction *Inst); + void getMDs(const Instruction *Inst, SmallVectorImpl<MDPairTy> &MDs) const; /// addMD - Attach the metadata of given kind to an Instruction. void addMD(unsigned Kind, MDNode *Node, Instruction *Inst); diff --git a/lib/Bitcode/Writer/BitcodeWriter.cpp b/lib/Bitcode/Writer/BitcodeWriter.cpp index c8cb595..037854e 100644 --- a/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -561,14 +561,16 @@ static void WriteMetadataAttachment(const Function &F, // Write metadata attachments // METADATA_ATTACHMENT - [m x [value, [n x [id, mdnode]]] MetadataContext &TheMetadata = F.getContext().getMetadata(); + typedef SmallVector<std::pair<unsigned, TrackingVH<MDNode> >, 2> MDMapTy; + MDMapTy MDs; for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB) for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I != E; ++I) { - const MetadataContext::MDMapTy *P = TheMetadata.getMDs(I); - if (!P) continue; + MDs.clear(); + TheMetadata.getMDs(I, MDs); bool RecordedInstruction = false; - for (MetadataContext::MDMapTy::const_iterator PI = P->begin(), - PE = P->end(); PI != PE; ++PI) { + for (MDMapTy::const_iterator PI = MDs.begin(), PE = MDs.end(); + PI != PE; ++PI) { if (RecordedInstruction == false) { Record.push_back(VE.getInstructionID(I)); RecordedInstruction = true; diff --git a/lib/Bitcode/Writer/ValueEnumerator.cpp b/lib/Bitcode/Writer/ValueEnumerator.cpp index 4257281..85aa5fa 100644 --- a/lib/Bitcode/Writer/ValueEnumerator.cpp +++ b/lib/Bitcode/Writer/ValueEnumerator.cpp @@ -87,6 +87,8 @@ ValueEnumerator::ValueEnumerator(const Module *M) { EnumerateType(I->getType()); MetadataContext &TheMetadata = F->getContext().getMetadata(); + typedef SmallVector<std::pair<unsigned, TrackingVH<MDNode> >, 2> MDMapTy; + MDMapTy MDs; for (Function::const_iterator BB = F->begin(), E = F->end(); BB != E; ++BB) for (BasicBlock::const_iterator I = BB->begin(), E = BB->end(); I!=E;++I){ for (User::const_op_iterator OI = I->op_begin(), E = I->op_end(); @@ -99,11 +101,11 @@ ValueEnumerator::ValueEnumerator(const Module *M) { EnumerateAttributes(II->getAttributes()); // Enumerate metadata attached with this instruction. - const MetadataContext::MDMapTy *MDs = TheMetadata.getMDs(I); - if (MDs) - for (MetadataContext::MDMapTy::const_iterator MI = MDs->begin(), - ME = MDs->end(); MI != ME; ++MI) - EnumerateMetadata(MI->second); + MDs.clear(); + TheMetadata.getMDs(I, MDs); + for (MDMapTy::const_iterator MI = MDs.begin(), ME = MDs.end(); MI != ME; + ++MI) + EnumerateMetadata(MI->second); } } diff --git a/lib/VMCore/AsmWriter.cpp b/lib/VMCore/AsmWriter.cpp index fb1b1ac..d8a708d 100644 --- a/lib/VMCore/AsmWriter.cpp +++ b/lib/VMCore/AsmWriter.cpp @@ -680,6 +680,8 @@ void SlotTracker::processFunction() { ST_DEBUG("Inserting Instructions:\n"); MetadataContext &TheMetadata = TheFunction->getContext().getMetadata(); + typedef SmallVector<std::pair<unsigned, TrackingVH<MDNode> >, 2> MDMapTy; + MDMapTy MDs; // Add all of the basic blocks and instructions with no names. for (Function::const_iterator BB = TheFunction->begin(), @@ -696,11 +698,11 @@ void SlotTracker::processFunction() { CreateMetadataSlot(N); // Process metadata attached with this instruction. - const MetadataContext::MDMapTy *MDs = TheMetadata.getMDs(I); - if (MDs) - for (MetadataContext::MDMapTy::const_iterator MI = MDs->begin(), - ME = MDs->end(); MI != ME; ++MI) - CreateMetadataSlot(MI->second); + MDs.clear(); + TheMetadata.getMDs(I, MDs); + for (MDMapTy::const_iterator MI = MDs.begin(), ME = MDs.end(); MI != ME; + ++MI) + CreateMetadataSlot(MI->second); } } @@ -2034,12 +2036,13 @@ void AssemblyWriter::printInstruction(const Instruction &I) { // Print Metadata info if (!MDNames.empty()) { MetadataContext &TheMetadata = I.getContext().getMetadata(); - const MetadataContext::MDMapTy *MDMap = TheMetadata.getMDs(&I); - if (MDMap) - for (MetadataContext::MDMapTy::const_iterator MI = MDMap->begin(), - ME = MDMap->end(); MI != ME; ++MI) - Out << ", !" << MDNames[MI->first] - << " !" << Machine.getMetadataSlot(MI->second); + typedef SmallVector<std::pair<unsigned, TrackingVH<MDNode> >, 2> MDMapTy; + MDMapTy MDs; + TheMetadata.getMDs(&I, MDs); + for (MDMapTy::const_iterator MI = MDs.begin(), ME = MDs.end(); MI != ME; + ++MI) + Out << ", !" << MDNames[MI->first] + << " !" << Machine.getMetadataSlot(MI->second); } printInfoComment(I); } diff --git a/lib/VMCore/Metadata.cpp b/lib/VMCore/Metadata.cpp index f4d6071..fdac408 100644 --- a/lib/VMCore/Metadata.cpp +++ b/lib/VMCore/Metadata.cpp @@ -294,13 +294,15 @@ MDNode *MetadataContext::getMD(unsigned MDKind, const Instruction *Inst) { } /// getMDs - Get the metadata attached to an Instruction. -const MetadataContext::MDMapTy * -MetadataContext::getMDs(const Instruction *Inst) { +void MetadataContext:: +getMDs(const Instruction *Inst, SmallVectorImpl<MDPairTy> &MDs) const { MDStoreTy::iterator I = MetadataStore.find(Inst); if (I == MetadataStore.end()) - return NULL; - - return &I->second; + return; + for (MDMapTy::iterator MI = I->second.begin(), ME = I->second.end(); + MI != ME; ++MI) + MDs.push_back(std::make_pair(MI->first, MI->second)); + std::sort(MDs.begin(), MDs.end()); } /// getHandlerNames - Populate client supplied smallvector using custome |