mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-16 12:24:03 +00:00
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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@224073 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -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);
|
||||
|
Reference in New Issue
Block a user