summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2009-10-22 18:55:16 +0000
committerDevang Patel <dpatel@apple.com>2009-10-22 18:55:16 +0000
commitf61b2371c8ec6e0ff2da8f2bd2a606ba755bb2fe (patch)
tree4e70cd3cb36311326f54ad5a9d293bfc33590a89
parentb5681b22937440dcb8007f4b125f3325d6341fe0 (diff)
downloadexternal_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.h2
-rw-r--r--lib/Bitcode/Writer/BitcodeWriter.cpp10
-rw-r--r--lib/Bitcode/Writer/ValueEnumerator.cpp12
-rw-r--r--lib/VMCore/AsmWriter.cpp25
-rw-r--r--lib/VMCore/Metadata.cpp12
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