Index: lib/Bitcode/Reader/BitcodeReader.cpp =================================================================== --- lib/Bitcode/Reader/BitcodeReader.cpp +++ lib/Bitcode/Reader/BitcodeReader.cpp @@ -2472,14 +2472,17 @@ return error("Invalid record"); IsDistinct = - Record[0] || Record[8]; // All definitions should be distinct. + (Record[0] & 1) || Record[8]; // All definitions should be distinct. + bool IsVersion3 = (Record[0] & (1 << 1)) == (1 << 1); + if (IsVersion3 && Record.size() != 19) + return error("Invalid record"); // Version 1 has a Function as Record[15]. // Version 2 has removed Record[15]. // Version 3 has the Unit as Record[15]. Metadata *CUorFn = getMDOrNull(Record[15]); unsigned Offset = Record.size() == 19 ? 1 : 0; - bool HasFn = Offset && dyn_cast_or_null(CUorFn); - bool HasCU = Offset && !HasFn; + bool HasFn = Offset && !IsVersion3; + bool HasCU = IsVersion3; DISubprogram *SP = GET_OR_DISTINCT( DISubprogram, (Context, getDITypeRefOrNull(Record[1]), getMDString(Record[2]), @@ -2493,7 +2496,7 @@ // Upgrade sp->function mapping to function->sp mapping. if (HasFn) { - if (auto *CMD = dyn_cast(CUorFn)) + if (auto *CMD = dyn_cast_or_null(CUorFn)) if (auto *F = dyn_cast(CMD->getValue())) { if (F->isMaterializable()) // Defer until materialized; unmaterialized functions may not have Index: lib/Bitcode/Writer/BitcodeWriter.cpp =================================================================== --- lib/Bitcode/Writer/BitcodeWriter.cpp +++ lib/Bitcode/Writer/BitcodeWriter.cpp @@ -1353,7 +1353,8 @@ void ModuleBitcodeWriter::writeDISubprogram(const DISubprogram *N, SmallVectorImpl &Record, unsigned Abbrev) { - Record.push_back(N->isDistinct()); + uint64_t IsVersion3 = 1 << 1; + Record.push_back(N->isDistinct() | IsVersion3); Record.push_back(VE.getMetadataOrNullID(N->getScope())); Record.push_back(VE.getMetadataOrNullID(N->getRawName())); Record.push_back(VE.getMetadataOrNullID(N->getRawLinkageName()));