diff options
author | Devang Patel <dpatel@apple.com> | 2009-07-29 22:34:41 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2009-07-29 22:34:41 +0000 |
commit | aa993142518648c1ffa61e7f52ff6d3a95d413fb (patch) | |
tree | 66b8db375a3310bedc27056dba65816ed7d9ac26 /lib/Bitcode/Reader/BitcodeReader.cpp | |
parent | debcb01b0f0a15f568ca69e8f288fade4bfc7297 (diff) |
Read and write NamedMDNode.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@77517 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Bitcode/Reader/BitcodeReader.cpp')
-rw-r--r-- | lib/Bitcode/Reader/BitcodeReader.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp index 1e6f5b6dd4..35fe7b27c5 100644 --- a/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/lib/Bitcode/Reader/BitcodeReader.cpp @@ -734,6 +734,33 @@ bool BitcodeReader::ParseMetadata() { switch (Stream.ReadRecord(Code, Record)) { default: // Default behavior: ignore. break; + case bitc::METADATA_NAME: { + // Read named of the named metadata. + unsigned NameLength = Record.size(); + SmallString<8> Name; + Name.resize(NameLength); + for (unsigned i = 0; i != NameLength; ++i) + Name[i] = Record[i]; + Record.clear(); + Code = Stream.ReadCode(); + + // METADATA_NAME is always followed by METADATA_NAMED_NODE. + if (Stream.ReadRecord(Code, Record) != bitc::METADATA_NAMED_NODE) + assert ( 0 && "Inavlid Named Metadata record"); + + // Read named metadata elements. + unsigned Size = Record.size(); + SmallVector<MetadataBase*, 8> Elts; + for (unsigned i = 0; i != Size; ++i) { + Value *MD = ValueList.getValueFwdRef(Record[i], Type::MetadataTy); + if (MetadataBase *B = dyn_cast<MetadataBase>(MD)) + Elts.push_back(B); + } + Value *V = NamedMDNode::Create(Name.c_str(), Elts.data(), Elts.size(), + TheModule); + ValueList.AssignValue(V, NextValueNo++); + break; + } case bitc::METADATA_NODE: { if (Record.empty() || Record.size() % 2 == 1) return Error("Invalid METADATA_NODE record"); |