aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Bitcode/Reader/MetadataLoader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Bitcode/Reader/MetadataLoader.cpp')
-rw-r--r--llvm/lib/Bitcode/Reader/MetadataLoader.cpp10
1 files changed, 8 insertions, 2 deletions
diff --git a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp
index 67144d4..0f41115 100644
--- a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp
+++ b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp
@@ -1423,15 +1423,21 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
break;
}
case bitc::METADATA_STRING_TYPE: {
- if (Record.size() != 8)
+ if (Record.size() > 9 || Record.size() < 8)
return error("Invalid record");
IsDistinct = Record[0];
+ bool SizeIs8 = Record.size() == 8;
+ // StringLocationExp (i.e. Record[5]) is added at a later time
+ // than the other fields. The code here enables backward compatibility.
+ Metadata *StringLocationExp = SizeIs8 ? nullptr : getMDOrNull(Record[5]);
+ unsigned Offset = SizeIs8 ? 5 : 6;
MetadataList.assignValue(
GET_OR_DISTINCT(DIStringType,
(Context, Record[1], getMDString(Record[2]),
getMDOrNull(Record[3]), getMDOrNull(Record[4]),
- Record[5], Record[6], Record[7])),
+ StringLocationExp, Record[Offset], Record[Offset + 1],
+ Record[Offset + 2])),
NextMetadataNo);
NextMetadataNo++;
break;