diff options
Diffstat (limited to 'llvm/lib/Bitcode/Reader/MetadataLoader.cpp')
-rw-r--r-- | llvm/lib/Bitcode/Reader/MetadataLoader.cpp | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp index d28ab7d..690341f 100644 --- a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp +++ b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp @@ -2242,14 +2242,28 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( break; } case bitc::METADATA_LABEL: { - if (Record.size() != 5) + if (Record.size() < 5 || Record.size() > 7) return error("Invalid record"); IsDistinct = Record[0] & 1; + uint64_t Line = Record[4]; + uint64_t Column = Record.size() > 5 ? Record[5] : 0; + bool IsArtificial = Record[0] & 2; + std::optional<unsigned> CoroSuspendIdx; + if (Record.size() > 6) { + uint64_t RawSuspendIdx = Record[6]; + if (RawSuspendIdx != std::numeric_limits<uint64_t>::max()) { + if (RawSuspendIdx > (uint64_t)std::numeric_limits<unsigned>::max()) + return error("CoroSuspendIdx value is too large"); + CoroSuspendIdx = RawSuspendIdx; + } + } + MetadataList.assignValue( - GET_OR_DISTINCT(DILabel, (Context, getMDOrNull(Record[1]), - getMDString(Record[2]), - getMDOrNull(Record[3]), Record[4])), + GET_OR_DISTINCT(DILabel, + (Context, getMDOrNull(Record[1]), + getMDString(Record[2]), getMDOrNull(Record[3]), Line, + Column, IsArtificial, CoroSuspendIdx)), NextMetadataNo); NextMetadataNo++; break; |