diff options
Diffstat (limited to 'llvm/lib')
-rw-r--r-- | llvm/lib/Bitcode/Writer/BitcodeWriter.cpp | 9 | ||||
-rw-r--r-- | llvm/lib/Bitcode/Writer/ValueEnumerator.cpp | 1 | ||||
-rw-r--r-- | llvm/lib/Bitcode/Writer/ValueEnumerator.h | 19 |
3 files changed, 17 insertions, 12 deletions
diff --git a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp index 4ee53b51f70..26f0ac65884 100644 --- a/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp +++ b/llvm/lib/Bitcode/Writer/BitcodeWriter.cpp @@ -1429,7 +1429,7 @@ static void writeMetadataRecords(ArrayRef<const Metadata *> MDs, static void writeModuleMetadata(const Module &M, const ValueEnumerator &VE, BitstreamWriter &Stream) { - if (VE.getMDs().empty() && M.named_metadata_empty()) + if (!VE.hasMDs() && M.named_metadata_empty()) return; Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3); @@ -1442,13 +1442,14 @@ static void writeModuleMetadata(const Module &M, static void writeFunctionMetadata(const Function &F, const ValueEnumerator &VE, BitstreamWriter &Stream) { - ArrayRef<const Metadata *> MDs = VE.getFunctionMDs(); - if (MDs.empty()) + if (!VE.hasMDs()) return; Stream.EnterSubblock(bitc::METADATA_BLOCK_ID, 3); SmallVector<uint64_t, 64> Record; - writeMetadataRecords(MDs, VE, Stream, Record); + assert(VE.getMDStrings().empty() && + "Unexpected strings at the function-level"); + writeMetadataRecords(VE.getNonMDStrings(), VE, Stream, Record); Stream.ExitBlock(); } diff --git a/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp b/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp index 4e0a9dad2f8..5c5f05ca8f9 100644 --- a/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp +++ b/llvm/lib/Bitcode/Writer/ValueEnumerator.cpp @@ -709,6 +709,7 @@ void ValueEnumerator::incorporateFunction(const Function &F) { InstructionCount = 0; NumModuleValues = Values.size(); NumModuleMDs = MDs.size(); + NumMDStrings = 0; // Adding function arguments to the value table. for (const auto &I : F.args()) diff --git a/llvm/lib/Bitcode/Writer/ValueEnumerator.h b/llvm/lib/Bitcode/Writer/ValueEnumerator.h index 7bfe9d98655..0592382913a 100644 --- a/llvm/lib/Bitcode/Writer/ValueEnumerator.h +++ b/llvm/lib/Bitcode/Writer/ValueEnumerator.h @@ -65,7 +65,6 @@ private: std::vector<const Metadata *> MDs; typedef DenseMap<const Metadata *, unsigned> MetadataMapType; MetadataMapType MetadataMap; - unsigned NumMDStrings = 0; bool ShouldPreserveUseListOrder; typedef DenseMap<AttributeSet, unsigned> AttributeGroupMapType; @@ -94,7 +93,8 @@ private: /// When a function is incorporated, this is the size of the Metadatas list /// before incorporation. - unsigned NumModuleMDs; + unsigned NumModuleMDs = 0; + unsigned NumMDStrings = 0; unsigned FirstFuncConstantID; unsigned FirstInstID; @@ -153,15 +153,18 @@ public: } const ValueList &getValues() const { return Values; } - const std::vector<const Metadata *> &getMDs() const { return MDs; } + + /// Check whether the current block has any metadata to emit. + bool hasMDs() const { return NumModuleMDs < MDs.size(); } + + // Get the MDString metadata for this block. ArrayRef<const Metadata *> getMDStrings() const { - return makeArrayRef(MDs).slice(0, NumMDStrings); + return makeArrayRef(MDs).slice(NumModuleMDs, NumMDStrings); } + + // Get the non-MDString metadata for this block. ArrayRef<const Metadata *> getNonMDStrings() const { - return makeArrayRef(MDs).slice(NumMDStrings); - } - ArrayRef<const Metadata *> getFunctionMDs() const { - return makeArrayRef(MDs).slice(NumModuleMDs); + return makeArrayRef(MDs).slice(NumModuleMDs).slice(NumMDStrings); } const TypeList &getTypes() const { return Types; } |