diff options
| author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-12-11 23:02:24 +0000 |
|---|---|---|
| committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2014-12-11 23:02:24 +0000 |
| commit | 5c7006e06283a61b26783a8141936466ad3dd3c7 (patch) | |
| tree | 53ee96f7df23bd560147b7b6c3ab955d20c54b6a /llvm/lib/Bitcode/Reader | |
| parent | c9e266b8cf4abd43167b70609df6039da3ecd9b4 (diff) | |
| download | bcm5719-llvm-5c7006e06283a61b26783a8141936466ad3dd3c7.tar.gz bcm5719-llvm-5c7006e06283a61b26783a8141936466ad3dd3c7.zip | |
Bitcode: Add METADATA_NODE and METADATA_VALUE
This reflects the typelessness of `Metadata` in the bitcode format,
removing types from all metadata operands.
`METADATA_VALUE` represents a `ValueAsMetadata`, and always has two
fields: the type and the value.
`METADATA_NODE` represents an `MDNode`, and unlike `METADATA_OLD_NODE`,
doesn't store types. It stores operands at their ID+1 so that `0` can
reference `nullptr` operands.
Part of PR21532.
llvm-svn: 224073
Diffstat (limited to 'llvm/lib/Bitcode/Reader')
| -rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index a92b9c83dfc..4265bf7edf1 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -1166,6 +1166,27 @@ std::error_code BitcodeReader::ParseMetadata() { MDValueList.AssignValue(MDNode::get(Context, Elts), NextMDValueNo++); break; } + case bitc::METADATA_VALUE: { + if (Record.size() != 2) + return Error(BitcodeError::InvalidRecord); + + Type *Ty = getTypeByID(Record[0]); + if (Ty->isMetadataTy() || Ty->isVoidTy()) + return Error(BitcodeError::InvalidRecord); + + MDValueList.AssignValue( + ValueAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)), + NextMDValueNo++); + break; + } + case bitc::METADATA_NODE: { + SmallVector<Metadata *, 8> Elts; + Elts.reserve(Record.size()); + for (unsigned ID : Record) + Elts.push_back(ID ? MDValueList.getValueFwdRef(ID - 1) : nullptr); + MDValueList.AssignValue(MDNode::get(Context, Elts), NextMDValueNo++); + break; + } case bitc::METADATA_STRING: { std::string String(Record.begin(), Record.end()); llvm::UpgradeMDStringConstant(String); |

