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.cpp61
1 files changed, 46 insertions, 15 deletions
diff --git a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp
index 1cd1797..a9467d1 100644
--- a/llvm/lib/Bitcode/Reader/MetadataLoader.cpp
+++ b/llvm/lib/Bitcode/Reader/MetadataLoader.cpp
@@ -1287,6 +1287,14 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
return MetadataList.upgradeTypeRef(getMDOrNull(ID));
};
+ auto getMetadataOrConstant = [&](bool IsMetadata,
+ uint64_t Entry) -> Metadata * {
+ if (IsMetadata)
+ return getMDOrNull(Entry);
+ return ConstantAsMetadata::get(
+ ConstantInt::get(Type::getInt64Ty(Context), Entry));
+ };
+
#define GET_OR_DISTINCT(CLASS, ARGS) \
(IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
@@ -1525,15 +1533,18 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
if (Record.size() < 6 || Record.size() > 8)
return error("Invalid record");
- IsDistinct = Record[0];
+ IsDistinct = Record[0] & 1;
+ bool SizeIsMetadata = Record[0] & 2;
DINode::DIFlags Flags = (Record.size() > 6)
? static_cast<DINode::DIFlags>(Record[6])
: DINode::FlagZero;
uint32_t NumExtraInhabitants = (Record.size() > 7) ? Record[7] : 0;
+ Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[3]);
+
MetadataList.assignValue(
GET_OR_DISTINCT(DIBasicType,
- (Context, Record[1], getMDString(Record[2]), Record[3],
+ (Context, Record[1], getMDString(Record[2]), SizeInBits,
Record[4], Record[5], NumExtraInhabitants, Flags)),
NextMetadataNo);
NextMetadataNo++;
@@ -1543,9 +1554,12 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
if (Record.size() < 11)
return error("Invalid record");
- IsDistinct = Record[0];
+ IsDistinct = Record[0] & 1;
+ bool SizeIsMetadata = Record[0] & 2;
DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[6]);
+ Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[3]);
+
size_t Offset = 9;
auto ReadWideInt = [&]() {
@@ -1565,7 +1579,7 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
MetadataList.assignValue(
GET_OR_DISTINCT(DIFixedPointType,
- (Context, Record[1], getMDString(Record[2]), Record[3],
+ (Context, Record[1], getMDString(Record[2]), SizeInBits,
Record[4], Record[5], Flags, Record[7], Record[8],
Numerator, Denominator)),
NextMetadataNo);
@@ -1576,17 +1590,21 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
if (Record.size() > 9 || Record.size() < 8)
return error("Invalid record");
- IsDistinct = Record[0];
+ IsDistinct = Record[0] & 1;
+ bool SizeIsMetadata = Record[0] & 2;
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;
+ Metadata *SizeInBits =
+ getMetadataOrConstant(SizeIsMetadata, Record[Offset]);
+
MetadataList.assignValue(
GET_OR_DISTINCT(DIStringType,
(Context, Record[1], getMDString(Record[2]),
getMDOrNull(Record[3]), getMDOrNull(Record[4]),
- StringLocationExp, Record[Offset], Record[Offset + 1],
+ StringLocationExp, SizeInBits, Record[Offset + 1],
Record[Offset + 2])),
NextMetadataNo);
NextMetadataNo++;
@@ -1615,15 +1633,20 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
PtrAuthData.emplace(Record[14]);
}
- IsDistinct = Record[0];
+ IsDistinct = Record[0] & 1;
+ bool SizeIsMetadata = Record[0] & 2;
DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
+
+ Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[7]);
+ Metadata *OffsetInBits = getMetadataOrConstant(SizeIsMetadata, Record[9]);
+
MetadataList.assignValue(
GET_OR_DISTINCT(DIDerivedType,
(Context, Record[1], getMDString(Record[2]),
getMDOrNull(Record[3]), Record[4],
getDITypeRefOrNull(Record[5]),
- getDITypeRefOrNull(Record[6]), Record[7], Record[8],
- Record[9], DWARFAddressSpace, PtrAuthData, Flags,
+ getDITypeRefOrNull(Record[6]), SizeInBits, Record[8],
+ OffsetInBits, DWARFAddressSpace, PtrAuthData, Flags,
getDITypeRefOrNull(Record[11]), Annotations)),
NextMetadataNo);
NextMetadataNo++;
@@ -1633,13 +1656,17 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
if (Record.size() != 13)
return error("Invalid record");
- IsDistinct = Record[0];
+ IsDistinct = Record[0] & 1;
+ bool SizeIsMetadata = Record[0] & 2;
DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[7]);
+
+ Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[5]);
+
MetadataList.assignValue(
GET_OR_DISTINCT(DISubrangeType,
(Context, getMDString(Record[1]),
getMDOrNull(Record[2]), Record[3],
- getMDOrNull(Record[4]), Record[5], Record[6], Flags,
+ getMDOrNull(Record[4]), SizeInBits, Record[6], Flags,
getDITypeRefOrNull(Record[8]), getMDOrNull(Record[9]),
getMDOrNull(Record[10]), getMDOrNull(Record[11]),
getMDOrNull(Record[12]))),
@@ -1654,18 +1681,18 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
// If we have a UUID and this is not a forward declaration, lookup the
// mapping.
IsDistinct = Record[0] & 0x1;
- bool IsNotUsedInTypeRef = Record[0] >= 2;
+ bool IsNotUsedInTypeRef = Record[0] & 2;
+ bool SizeIsMetadata = Record[0] & 4;
unsigned Tag = Record[1];
MDString *Name = getMDString(Record[2]);
Metadata *File = getMDOrNull(Record[3]);
unsigned Line = Record[4];
Metadata *Scope = getDITypeRefOrNull(Record[5]);
Metadata *BaseType = nullptr;
- uint64_t SizeInBits = Record[7];
if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max())
return error("Alignment value is too large");
uint32_t AlignInBits = Record[8];
- uint64_t OffsetInBits = 0;
+ Metadata *OffsetInBits = nullptr;
uint32_t NumExtraInhabitants = (Record.size() > 22) ? Record[22] : 0;
DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
Metadata *Elements = nullptr;
@@ -1712,7 +1739,9 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
TemplateParams = getMDOrNull(Record[14]);
} else {
BaseType = getDITypeRefOrNull(Record[6]);
- OffsetInBits = Record[9];
+
+ OffsetInBits = getMetadataOrConstant(SizeIsMetadata, Record[9]);
+
Elements = getMDOrNull(Record[11]);
VTableHolder = getDITypeRefOrNull(Record[13]);
TemplateParams = getMDOrNull(Record[14]);
@@ -1740,6 +1769,8 @@ Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
if (Record.size() > 24 && Record[24] != dwarf::DW_APPLE_ENUM_KIND_invalid)
EnumKind = Record[24];
+ Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[7]);
+
DICompositeType *CT = nullptr;
if (Identifier)
CT = DICompositeType::buildODRType(