aboutsummaryrefslogtreecommitdiff
path: root/lib/Bitcode/Writer/BitcodeWriter.cpp
diff options
context:
space:
mode:
authorVictor Hernandez <vhernandez@apple.com>2010-01-14 19:38:44 +0000
committerVictor Hernandez <vhernandez@apple.com>2010-01-14 19:38:44 +0000
commit3cd7c3db9926c1db3b55599c01c75e8ecc6bd096 (patch)
treed757303271bb9007c96875a08ddf7bf720e89170 /lib/Bitcode/Writer/BitcodeWriter.cpp
parent09bf003983bb35190ce9932c4edc9a7635f379c0 (diff)
Avoid modifying ValueEnumerator's MD ValueList by choosing which function-local MD to write based on the function currently being written
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@93441 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Bitcode/Writer/BitcodeWriter.cpp')
-rw-r--r--lib/Bitcode/Writer/BitcodeWriter.cpp24
1 files changed, 8 insertions, 16 deletions
diff --git a/lib/Bitcode/Writer/BitcodeWriter.cpp b/lib/Bitcode/Writer/BitcodeWriter.cpp
index c71f676d4b..5a4a1b2920 100644
--- a/lib/Bitcode/Writer/BitcodeWriter.cpp
+++ b/lib/Bitcode/Writer/BitcodeWriter.cpp
@@ -554,30 +554,22 @@ static void WriteModuleMetadata(const ValueEnumerator &VE,
Stream.ExitBlock();
}
-static void WriteFunctionLocalMetadata(const ValueEnumerator &VE,
+static void WriteFunctionLocalMetadata(const Function &F,
+ const ValueEnumerator &VE,
BitstreamWriter &Stream) {
bool StartedMetadataBlock = false;
SmallVector<uint64_t, 64> Record;
- ValueEnumerator::ValueList Vals = VE.getMDValues();
- ValueEnumerator::ValueList::iterator it = Vals.begin();
- ValueEnumerator::ValueList::iterator end = Vals.end();
-
- while (it != end) {
- if (const MDNode *N = dyn_cast<MDNode>((*it).first)) {
- if (N->isFunctionLocal()) {
+ const ValueEnumerator::ValueList &Vals = VE.getMDValues();
+
+ for (unsigned i = 0, e = Vals.size(); i != e; ++i)
+ if (const MDNode *N = dyn_cast<MDNode>(Vals[i].first))
+ if (N->getFunction() == &F) {
if (!StartedMetadataBlock) {
Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3);
StartedMetadataBlock = true;
}
WriteMDNode(N, VE, Stream, Record);
- // Remove function-local MD, since it is not used outside of function.
- it = Vals.erase(it);
- end = Vals.end();
- continue;
}
- }
- ++it;
- }
if (StartedMetadataBlock)
Stream.ExitBlock();
@@ -1227,7 +1219,7 @@ static void WriteFunction(const Function &F, ValueEnumerator &VE,
WriteConstants(CstStart, CstEnd, VE, Stream, false);
// If there is function-local metadata, emit it now.
- WriteFunctionLocalMetadata(VE, Stream);
+ WriteFunctionLocalMetadata(F, VE, Stream);
// Keep a running idea of what the instruction ID is.
unsigned InstID = CstEnd;