https://github.com/ChuanqiXu9 updated https://github.com/llvm/llvm-project/pull/95897
>From 0e6b0ee59605d28bb031d8c2fb70fb853d853605 Mon Sep 17 00:00:00 2001 From: Chuanqi Xu <yedeng...@linux.alibaba.com> Date: Tue, 18 Jun 2024 11:28:03 +0800 Subject: [PATCH] [Serialization] Store DeclID in two slots to utilize VBR6 format --- .../include/clang/Serialization/ASTBitCodes.h | 3 + clang/include/clang/Serialization/ASTReader.h | 5 +- .../clang/Serialization/ASTRecordReader.h | 19 +++ .../clang/Serialization/ASTRecordWriter.h | 27 +++++ clang/lib/Serialization/ASTReader.cpp | 44 +++---- clang/lib/Serialization/ASTReaderDecl.cpp | 18 ++- clang/lib/Serialization/ASTReaderStmt.cpp | 9 +- clang/lib/Serialization/ASTWriter.cpp | 28 +++-- clang/lib/Serialization/ASTWriterDecl.cpp | 112 ++++++++++-------- clang/test/Modules/codegen-nodep.test | 2 +- clang/test/Modules/decl-params-determinisim.m | 16 +-- 11 files changed, 175 insertions(+), 108 deletions(-) diff --git a/clang/include/clang/Serialization/ASTBitCodes.h b/clang/include/clang/Serialization/ASTBitCodes.h index 38502a23f805e..977fa7359ef1b 100644 --- a/clang/include/clang/Serialization/ASTBitCodes.h +++ b/clang/include/clang/Serialization/ASTBitCodes.h @@ -285,6 +285,9 @@ using unaligned_decl_id_t = serialization::DeclID, llvm::endianness::native, llvm::support::unaligned>; +/// The number of slots needed to record a DeclID in bitstreams. +const unsigned int DeclIDSerialiazedSize = 2; + /// The number of predefined preprocessed entity IDs. const unsigned int NUM_PREDEF_PP_ENTITY_IDS = 1; diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index f41c473c97cd9..ab257314e2c74 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -592,7 +592,7 @@ class ASTReader /// An array of lexical contents of a declaration context, as a sequence of /// Decl::Kind, DeclID pairs. - using LexicalContents = ArrayRef<serialization::unaligned_decl_id_t>; + using LexicalContents = ArrayRef<uint32_t>; /// Map from a DeclContext to its lexical contents. llvm::DenseMap<const DeclContext*, std::pair<ModuleFile*, LexicalContents>> @@ -945,8 +945,7 @@ class ASTReader SmallVector<uint64_t, 8> DelayedDeleteExprs; // A list of late parsed template function data with their module files. - SmallVector<std::pair<ModuleFile *, SmallVector<uint64_t, 1>>, 4> - LateParsedTemplates; + SmallVector<std::pair<ModuleFile *, RecordData>, 4> LateParsedTemplates; /// The IDs of all decls to be checked for deferred diags. /// diff --git a/clang/include/clang/Serialization/ASTRecordReader.h b/clang/include/clang/Serialization/ASTRecordReader.h index 2561418b78ca7..ae0254214d0c9 100644 --- a/clang/include/clang/Serialization/ASTRecordReader.h +++ b/clang/include/clang/Serialization/ASTRecordReader.h @@ -86,6 +86,11 @@ class ASTRecordReader /// Skips the specified number of values. void skipInts(unsigned N) { Idx += N; } + /// Skips the specified number of DeclIDs. + void skipDeclRefs(unsigned N) { + Idx += N * serialization::DeclIDSerialiazedSize; + } + /// Retrieve the global submodule ID its local ID number. serialization::SubmoduleID getGlobalSubmoduleID(unsigned LocalID) { @@ -187,12 +192,26 @@ class ASTRecordReader /// Reads a declaration from the given position in a record in the /// given module, advancing Idx. Decl *readDecl() { +#ifndef NDEBUG + unsigned OldIdx = Idx; + Decl *D = Reader->ReadDecl(*F, Record, Idx); + assert(Idx - OldIdx == serialization::DeclIDSerialiazedSize); + return D; +#endif return Reader->ReadDecl(*F, Record, Idx); } Decl *readDeclRef() { return readDecl(); } + template <class DeclKind, class Func> void readDeclArray(Func &&ConsumeFunc) { + unsigned LengthOfArray = readInt(); + unsigned End = Idx + LengthOfArray; + + while (Idx < End) + ConsumeFunc(readDeclAs<DeclKind>()); + } + /// Reads a declaration from the given position in the record, /// advancing Idx. /// diff --git a/clang/include/clang/Serialization/ASTRecordWriter.h b/clang/include/clang/Serialization/ASTRecordWriter.h index 0c8ac75fc40f4..30e786510ac14 100644 --- a/clang/include/clang/Serialization/ASTRecordWriter.h +++ b/clang/include/clang/Serialization/ASTRecordWriter.h @@ -234,12 +234,39 @@ class ASTRecordWriter /// Emit a reference to a declaration. void AddDeclRef(const Decl *D) { +#ifndef NDEBUG + unsigned OldSize = size(); + Writer->AddDeclRef(D, *Record); + assert(size() - OldSize == serialization::DeclIDSerialiazedSize); + return; +#endif return Writer->AddDeclRef(D, *Record); } void writeDeclRef(const Decl *D) { AddDeclRef(D); } + void writeNullDeclRef() { +#ifndef NDEBUG + unsigned OldSize = size(); +#endif + + push_back(0); + push_back(0); + +#ifndef NDEBUG + assert(size() - OldSize == serialization::DeclIDSerialiazedSize); +#endif + } + + template <class DeclKind> void writeDeclArray(ArrayRef<DeclKind *> Array) { + unsigned ElementNum = Array.size(); + push_back(ElementNum * serialization::DeclIDSerialiazedSize); + + for (DeclKind *D : Array) + AddDeclRef(D); + } + /// Emit a declaration name. void AddDeclarationName(DeclarationName Name) { writeDeclarationName(Name); diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 079ac3f0e3545..b2bf0f3a46194 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -1306,9 +1306,8 @@ bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M, auto &Lex = LexicalDecls[DC]; if (!Lex.first) { Lex = std::make_pair( - &M, llvm::ArrayRef( - reinterpret_cast<const unaligned_decl_id_t *>(Blob.data()), - Blob.size() / sizeof(DeclID))); + &M, llvm::ArrayRef(reinterpret_cast<const uint32_t *>(Blob.data()), + Blob.size() / sizeof(uint32_t))); } DC->setHasExternalLexicalStorage(true); return false; @@ -3422,8 +3421,8 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, case TU_UPDATE_LEXICAL: { DeclContext *TU = ContextObj->getTranslationUnitDecl(); LexicalContents Contents( - reinterpret_cast<const unaligned_decl_id_t *>(Blob.data()), - static_cast<unsigned int>(Blob.size() / sizeof(DeclID))); + reinterpret_cast<const uint32_t *>(Blob.data()), + static_cast<unsigned int>(Blob.size() / sizeof(uint32_t))); TULexicalDecls.push_back(std::make_pair(&F, Contents)); TU->setHasExternalLexicalStorage(true); break; @@ -3696,7 +3695,7 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, break; case VTABLE_USES: - if (Record.size() % 3 != 0) + if (Record.size() % (DeclIDSerialiazedSize + 1 + 1) != 0) return llvm::createStringError(std::errc::illegal_byte_sequence, "Invalid VTABLE_USES record"); @@ -3714,8 +3713,7 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, break; case PENDING_IMPLICIT_INSTANTIATIONS: - - if (Record.size() % 2 != 0) + if (Record.size() % (DeclIDSerialiazedSize + 1) != 0) return llvm::createStringError( std::errc::illegal_byte_sequence, "Invalid PENDING_IMPLICIT_INSTANTIATIONS block"); @@ -3728,7 +3726,7 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, break; case SEMA_DECL_REFS: - if (Record.size() != 3) + if (Record.size() != 3 * serialization::DeclIDSerialiazedSize) return llvm::createStringError(std::errc::illegal_byte_sequence, "Invalid SEMA_DECL_REFS block"); for (unsigned I = 0, N = Record.size(); I != N; /*in loop*/) @@ -3786,7 +3784,7 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, } case DECL_UPDATE_OFFSETS: - if (Record.size() % 2 != 0) + if (Record.size() % (DeclIDSerialiazedSize + 1) != 0) return llvm::createStringError( std::errc::illegal_byte_sequence, "invalid DECL_UPDATE_OFFSETS block in AST file"); @@ -3803,7 +3801,7 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, break; case DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD: { - if (Record.size() % 3 != 0) + if (Record.size() % (DeclIDSerialiazedSize + 2) != 0) return llvm::createStringError( std::errc::illegal_byte_sequence, "invalid DELAYED_NAMESPACE_LEXICAL_VISIBLE_RECORD block in AST " @@ -3898,7 +3896,7 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, break; case UNDEFINED_BUT_USED: - if (Record.size() % 2 != 0) + if (Record.size() % (DeclIDSerialiazedSize + 1) != 0) return llvm::createStringError(std::errc::illegal_byte_sequence, "invalid undefined-but-used record"); for (unsigned I = 0, N = Record.size(); I != N; /* in loop */) { @@ -7893,7 +7891,10 @@ GlobalDeclID ASTReader::ReadDeclID(ModuleFile &F, const RecordDataImpl &Record, return GlobalDeclID(0); } - return getGlobalDeclID(F, LocalDeclID::get(*this, F, Record[Idx++])); + uint32_t ModuleFileIndex = Record[Idx++]; + uint32_t LocalDeclIndex = Record[Idx++]; + return getGlobalDeclID( + F, LocalDeclID::get(*this, F, ModuleFileIndex, LocalDeclIndex)); } /// Resolve the offset of a statement into a statement. @@ -7922,25 +7923,26 @@ void ASTReader::FindExternalLexicalDecls( SmallVectorImpl<Decl *> &Decls) { bool PredefsVisited[NUM_PREDEF_DECL_IDS] = {}; - auto Visit = [&] (ModuleFile *M, LexicalContents LexicalDecls) { - assert(LexicalDecls.size() % 2 == 0 && "expected an even number of entries"); - for (int I = 0, N = LexicalDecls.size(); I != N; I += 2) { + auto Visit = [&](ModuleFile *M, LexicalContents LexicalDecls) { + assert(LexicalDecls.size() % 3 == 0 && "incorrect number of entries"); + for (int I = 0, N = LexicalDecls.size(); I != N; I += 3) { auto K = (Decl::Kind)+LexicalDecls[I]; if (!IsKindWeWant(K)) continue; - auto ID = (DeclID) + LexicalDecls[I + 1]; + LocalDeclID ID = + LocalDeclID::get(*this, *M, LexicalDecls[I + 1], LexicalDecls[I + 2]); // Don't add predefined declarations to the lexical context more // than once. if (ID < NUM_PREDEF_DECL_IDS) { - if (PredefsVisited[ID]) + if (PredefsVisited[ID.getRawValue()]) continue; - PredefsVisited[ID] = true; + PredefsVisited[ID.getRawValue()] = true; } - if (Decl *D = GetLocalDecl(*M, LocalDeclID::get(*this, *M, ID))) { + if (Decl *D = GetLocalDecl(*M, ID)) { assert(D->getKind() == K && "wrong kind for lexical decl"); if (!DC->isDeclInLexicalTraversal(D)) Decls.push_back(D); @@ -8837,7 +8839,7 @@ void ASTReader::ReadLateParsedTemplates( &LPTMap) { for (auto &LPT : LateParsedTemplates) { ModuleFile *FMod = LPT.first; - RecordDataImpl &LateParsed = LPT.second; + RecordData &LateParsed = LPT.second; for (unsigned Idx = 0, N = LateParsed.size(); Idx < N; /* In loop */) { FunctionDecl *FD = ReadDeclAs<FunctionDecl>(*FMod, LateParsed, Idx); diff --git a/clang/lib/Serialization/ASTReaderDecl.cpp b/clang/lib/Serialization/ASTReaderDecl.cpp index 4b8b515c02c70..0e55c831ce34c 100644 --- a/clang/lib/Serialization/ASTReaderDecl.cpp +++ b/clang/lib/Serialization/ASTReaderDecl.cpp @@ -1020,9 +1020,8 @@ void ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) { case FunctionDecl::TK_DependentFunctionTemplateSpecialization: { // Templates. UnresolvedSet<8> Candidates; - unsigned NumCandidates = Record.readInt(); - while (NumCandidates--) - Candidates.addDecl(readDeclAs<NamedDecl>()); + Record.readDeclArray<NamedDecl>( + [&Candidates](NamedDecl *ND) { Candidates.addDecl(ND); }); // Templates args. TemplateArgumentListInfo TemplArgsWritten; @@ -1152,11 +1151,9 @@ void ASTDeclReader::VisitFunctionDecl(FunctionDecl *FD) { FD->setIsPureVirtual(Pure); // Read in the parameters. - unsigned NumParams = Record.readInt(); SmallVector<ParmVarDecl *, 16> Params; - Params.reserve(NumParams); - for (unsigned I = 0; I != NumParams; ++I) - Params.push_back(readDeclAs<ParmVarDecl>()); + Record.readDeclArray<ParmVarDecl>( + [&Params](ParmVarDecl *ParmD) { Params.push_back(ParmD); }); FD->setParams(Reader.getContext(), Params); } @@ -2309,7 +2306,7 @@ void ASTDeclReader::VisitCXXMethodDecl(CXXMethodDecl *D) { } else { // We don't care about which declarations this used to override; we get // the relevant information from the canonical declaration. - Record.skipInts(NumOverridenMethods); + Record.skipDeclRefs(NumOverridenMethods); } } @@ -4354,8 +4351,9 @@ void ASTReader::loadPendingDeclChain(Decl *FirstLocal, uint64_t LocalOffset) { // FIXME: We have several different dispatches on decl kind here; maybe // we should instead generate one loop per kind and dispatch up-front? Decl *MostRecent = FirstLocal; - for (unsigned I = 0, N = Record.size(); I != N; ++I) { - unsigned Idx = N - I - 1; + for (unsigned I = 0, N = Record.size(); I != N; + I += serialization::DeclIDSerialiazedSize) { + unsigned Idx = N - I - serialization::DeclIDSerialiazedSize; auto *D = ReadDecl(*M, Record, Idx); ASTDeclReader::attachPreviousDecl(*this, D, MostRecent, CanonDecl); MostRecent = D; diff --git a/clang/lib/Serialization/ASTReaderStmt.cpp b/clang/lib/Serialization/ASTReaderStmt.cpp index e23ceffb10bfe..975f03391935f 100644 --- a/clang/lib/Serialization/ASTReaderStmt.cpp +++ b/clang/lib/Serialization/ASTReaderStmt.cpp @@ -351,14 +351,15 @@ void ASTStmtReader::VisitDeclStmt(DeclStmt *S) { S->setStartLoc(readSourceLocation()); S->setEndLoc(readSourceLocation()); - if (Record.size() - Record.getIdx() == 1) { + unsigned NumDecls = + (Record.size() - Record.getIdx()) / serialization::DeclIDSerialiazedSize; + if (NumDecls == 1) { // Single declaration S->setDeclGroup(DeclGroupRef(readDecl())); } else { SmallVector<Decl *, 16> Decls; - int N = Record.size() - Record.getIdx(); - Decls.reserve(N); - for (int I = 0; I < N; ++I) + Decls.reserve(NumDecls); + for (unsigned I = 0; I < NumDecls; ++I) Decls.push_back(readDecl()); S->setDeclGroup(DeclGroupRef(DeclGroup::Create(Record.getContext(), Decls.data(), diff --git a/clang/lib/Serialization/ASTWriter.cpp b/clang/lib/Serialization/ASTWriter.cpp index 5b39055cf9f27..ef358ac9dca55 100644 --- a/clang/lib/Serialization/ASTWriter.cpp +++ b/clang/lib/Serialization/ASTWriter.cpp @@ -3321,7 +3321,7 @@ uint64_t ASTWriter::WriteDeclContextLexicalBlock(ASTContext &Context, return 0; uint64_t Offset = Stream.GetCurrentBitNo(); - SmallVector<DeclID, 128> KindDeclPairs; + SmallVector<uint32_t, 128> KindDeclPairs; for (const auto *D : DC->decls()) { if (DoneWritingDeclsAndTypes && !wasDeclEmitted(D)) continue; @@ -3336,7 +3336,9 @@ uint64_t ASTWriter::WriteDeclContextLexicalBlock(ASTContext &Context, continue; KindDeclPairs.push_back(D->getKind()); - KindDeclPairs.push_back(GetDeclRef(D).getRawValue()); + LocalDeclID ID = GetDeclRef(D); + KindDeclPairs.push_back(ID.getModuleFileIndex()); + KindDeclPairs.push_back(ID.getLocalDeclIndex()); } ++NumLexicalDeclContexts; @@ -4451,8 +4453,9 @@ void ASTWriter::WriteDeclContextVisibleUpdate(const DeclContext *DC) { DC = cast<DeclContext>(Chain->getKeyDeclaration(cast<Decl>(DC))); // Write the lookup table - RecordData::value_type Record[] = {UPDATE_VISIBLE, - getDeclID(cast<Decl>(DC)).getRawValue()}; + LocalDeclID ID = getDeclID(cast<Decl>(DC)); + RecordData::value_type Record[] = {UPDATE_VISIBLE, ID.getModuleFileIndex(), + ID.getLocalDeclIndex()}; Stream.EmitRecordWithBlob(UpdateVisibleAbbrev, Record, LookupTable); } @@ -5243,9 +5246,10 @@ void ASTWriter::WriteSpecialDeclRecords(Sema &SemaRef) { RecordData SemaDeclRefs; if (SemaRef.StdNamespace || SemaRef.StdBadAlloc || SemaRef.StdAlignValT) { auto AddEmittedDeclRefOrZero = [this, &SemaDeclRefs](Decl *D) { - if (!D || !wasDeclEmitted(D)) + if (!D || !wasDeclEmitted(D)) { SemaDeclRefs.push_back(0); - else + SemaDeclRefs.push_back(0); + } else AddDeclRef(D, SemaDeclRefs); }; @@ -5679,7 +5683,7 @@ void ASTWriter::WriteDeclAndTypes(ASTContext &Context) { const TranslationUnitDecl *TU = Context.getTranslationUnitDecl(); // Create a lexical update block containing all of the declarations in the // translation unit that do not come from other AST files. - SmallVector<DeclID, 128> NewGlobalKindDeclPairs; + SmallVector<uint32_t, 128> NewGlobalKindDeclPairs; for (const auto *D : TU->noload_decls()) { if (D->isFromASTFile()) continue; @@ -5689,7 +5693,9 @@ void ASTWriter::WriteDeclAndTypes(ASTContext &Context) { continue; NewGlobalKindDeclPairs.push_back(D->getKind()); - NewGlobalKindDeclPairs.push_back(GetDeclRef(D).getRawValue()); + LocalDeclID ID = GetDeclRef(D); + NewGlobalKindDeclPairs.push_back(ID.getModuleFileIndex()); + NewGlobalKindDeclPairs.push_back(ID.getLocalDeclIndex()); } auto Abv = std::make_shared<llvm::BitCodeAbbrev>(); @@ -5704,6 +5710,7 @@ void ASTWriter::WriteDeclAndTypes(ASTContext &Context) { Abv = std::make_shared<llvm::BitCodeAbbrev>(); Abv->Add(llvm::BitCodeAbbrevOp(UPDATE_VISIBLE)); Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6)); + Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::VBR, 6)); Abv->Add(llvm::BitCodeAbbrevOp(llvm::BitCodeAbbrevOp::Blob)); UpdateVisibleAbbrev = Stream.EmitAbbrev(std::move(Abv)); @@ -6195,7 +6202,10 @@ void ASTWriter::AddEmittedDeclRef(const Decl *D, RecordDataImpl &Record) { } void ASTWriter::AddDeclRef(const Decl *D, RecordDataImpl &Record) { - Record.push_back(GetDeclRef(D).getRawValue()); + LocalDeclID ID = GetDeclRef(D); + + Record.push_back(ID.getModuleFileIndex()); + Record.push_back(ID.getLocalDeclIndex()); } LocalDeclID ASTWriter::GetDeclRef(const Decl *D) { diff --git a/clang/lib/Serialization/ASTWriterDecl.cpp b/clang/lib/Serialization/ASTWriterDecl.cpp index 59d94c3d79824..3a64f831755a4 100644 --- a/clang/lib/Serialization/ASTWriterDecl.cpp +++ b/clang/lib/Serialization/ASTWriterDecl.cpp @@ -243,12 +243,15 @@ namespace clang { assert(D->isCanonicalDecl() && "non-canonical decl in set"); AddFirstDeclFromEachModule(D, /*IncludeLocal*/true); } - Record.append( - DeclIDIterator<GlobalDeclID, DeclID>(LazySpecializations.begin()), - DeclIDIterator<GlobalDeclID, DeclID>(LazySpecializations.end())); + + for (GlobalDeclID LazyID : LazySpecializations) { + Record.push_back(LazyID.getModuleFileIndex()); + Record.push_back(LazyID.getLocalDeclIndex()); + } // Update the size entry we added earlier. - Record[I] = Record.size() - I - 1; + Record[I] = + (Record.size() - I - 1) / serialization::DeclIDSerialiazedSize; } /// Ensure that this template specialization is associated with the specified @@ -695,9 +698,7 @@ void ASTDeclWriter::VisitFunctionDecl(FunctionDecl *D) { DFTSInfo = D->getDependentSpecializationInfo(); // Candidates. - Record.push_back(DFTSInfo->getCandidates().size()); - for (FunctionTemplateDecl *FTD : DFTSInfo->getCandidates()) - Record.AddDeclRef(FTD); + Record.writeDeclArray(DFTSInfo->getCandidates()); // Templates args. Record.push_back(DFTSInfo->TemplateArgumentsAsWritten != nullptr); @@ -769,9 +770,7 @@ void ASTDeclWriter::VisitFunctionDecl(FunctionDecl *D) { } } - Record.push_back(D->param_size()); - for (auto *P : D->parameters()) - Record.AddDeclRef(P); + Record.writeDeclArray(D->parameters()); Code = serialization::DECL_FUNCTION; } @@ -1527,7 +1526,7 @@ void ASTDeclWriter::VisitCXXRecordDecl(CXXRecordDecl *D) { Record.AddDeclRef(Context); Record.push_back(D->getLambdaIndexInContext()); } else { - Record.push_back(0); + Record.writeNullDeclRef(); } } else { Record.push_back(CXXRecNotTemplate); @@ -2060,7 +2059,8 @@ void ASTDeclWriter::VisitRedeclarable(Redeclarable<T> *D) { if (Writer.Chain) AddFirstDeclFromEachModule(DAsT, /*IncludeLocal*/false); // This is the number of imported first declarations + 1. - Record[I] = Record.size() - I; + Record[I] = + ((Record.size() - I - 1) / serialization::DeclIDSerialiazedSize) + 1; // Collect the set of local redeclarations of this declaration, from // newest to oldest. @@ -2091,8 +2091,8 @@ void ASTDeclWriter::VisitRedeclarable(Redeclarable<T> *D) { (void)Writer.GetDeclRef(D->getPreviousDecl()); (void)Writer.GetDeclRef(MostRecent); } else { - // We use the sentinel value 0 to indicate an only declaration. - Record.push_back(0); + // Use the null decl to indicate an only declaration. + Record.writeNullDeclRef(); } } @@ -2161,6 +2161,17 @@ void ASTDeclWriter::VisitOMPCapturedExprDecl(OMPCapturedExprDecl *D) { //===----------------------------------------------------------------------===// namespace { +void AddNullDeclarationAbbrev(std::shared_ptr<llvm::BitCodeAbbrev> &Abv) { + using namespace llvm; + Abv->Add(BitCodeAbbrevOp(0)); + Abv->Add(BitCodeAbbrevOp(0)); +} + +void AddDeclarationAbbrev(std::shared_ptr<llvm::BitCodeAbbrev> &Abv) { + using namespace llvm; + Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); + Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); +} template <FunctionDecl::TemplatedKind Kind> std::shared_ptr<llvm::BitCodeAbbrev> getFunctionDeclAbbrev(serialization::DeclCode Code) { @@ -2169,24 +2180,24 @@ getFunctionDeclAbbrev(serialization::DeclCode Code) { auto Abv = std::make_shared<BitCodeAbbrev>(); Abv->Add(BitCodeAbbrevOp(Code)); // RedeclarableDecl - Abv->Add(BitCodeAbbrevOp(0)); // CanonicalDecl + AddNullDeclarationAbbrev(Abv); // No Redeclaration Abv->Add(BitCodeAbbrevOp(Kind)); if constexpr (Kind == FunctionDecl::TK_NonTemplate) { } else if constexpr (Kind == FunctionDecl::TK_FunctionTemplate) { - // DescribedFunctionTemplate - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); + AddDeclarationAbbrev(Abv); // DescribedFunctionTemplate } else if constexpr (Kind == FunctionDecl::TK_DependentNonTemplate) { - // Instantiated From Decl - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); + AddDeclarationAbbrev(Abv); // Instantiated From Decl } else if constexpr (Kind == FunctionDecl::TK_MemberSpecialization) { - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InstantiatedFrom + // InstantiatedFrom + AddDeclarationAbbrev(Abv); Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // TemplateSpecializationKind Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Specialized Location } else if constexpr (Kind == FunctionDecl::TK_FunctionTemplateSpecialization) { - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Template + // Template + AddDeclarationAbbrev(Abv); Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 3)); // TemplateSpecializationKind Abv->Add(BitCodeAbbrevOp(1)); // Template Argument Size @@ -2197,8 +2208,7 @@ getFunctionDeclAbbrev(serialization::DeclCode Code) { Abv->Add(BitCodeAbbrevOp(0)); // TemplateArgumentsAsWritten Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SourceLocation Abv->Add(BitCodeAbbrevOp(0)); - Abv->Add( - BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Canonical Decl of template + AddDeclarationAbbrev(Abv); // Canonical Decl of template } else if constexpr (Kind == FunctionDecl:: TK_DependentFunctionTemplateSpecialization) { // Candidates of specialization @@ -2217,7 +2227,7 @@ getFunctionDeclAbbrev(serialization::DeclCode Code) { // HasStandaloneLexicalDC, HasAttrs, // TopLevelDeclInObjCContainer, // isInvalidDecl - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext + AddDeclarationAbbrev(Abv); // DeclContext Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID // NamedDecl Abv->Add(BitCodeAbbrevOp(DeclarationName::Identifier)); // NameKind @@ -2278,7 +2288,7 @@ void ASTWriter::WriteDeclAbbrevs() { // isImplicit, HasStandaloneLexicalDC, HasAttrs, // TopLevelDeclInObjCContainer, // isInvalidDecl - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext + AddDeclarationAbbrev(Abv); // DeclContext Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID // NamedDecl Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier @@ -2307,7 +2317,7 @@ void ASTWriter::WriteDeclAbbrevs() { // isInvalidDecl, HasAttrs, isImplicit, isUsed, // isReferenced, TopLevelDeclInObjCContainer, // AccessSpecifier, ModuleOwnershipKind - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext + AddDeclarationAbbrev(Abv); // DeclContext Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID // NamedDecl Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier @@ -2333,8 +2343,8 @@ void ASTWriter::WriteDeclAbbrevs() { // Abbreviation for DECL_ENUM Abv = std::make_shared<BitCodeAbbrev>(); Abv->Add(BitCodeAbbrevOp(serialization::DECL_ENUM)); - // Redeclarable - Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration + // RedeclarableDecl + AddNullDeclarationAbbrev(Abv); // No Redeclaration // Decl Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7)); // Packed DeclBits: ModuleOwnershipKind, @@ -2344,7 +2354,7 @@ void ASTWriter::WriteDeclAbbrevs() { // isImplicit, HasStandaloneLexicalDC, HasAttrs, // TopLevelDeclInObjCContainer, // isInvalidDecl - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext + AddDeclarationAbbrev(Abv); // DeclContext Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID // NamedDecl Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier @@ -2368,7 +2378,7 @@ void ASTWriter::WriteDeclAbbrevs() { Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // getPromotionType Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 20)); // Enum Decl Bits Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 32));// ODRHash - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // InstantiatedMembEnum + AddDeclarationAbbrev(Abv); // InstantiatedMembEnum // DC Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalOffset Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // VisibleOffset @@ -2377,8 +2387,8 @@ void ASTWriter::WriteDeclAbbrevs() { // Abbreviation for DECL_RECORD Abv = std::make_shared<BitCodeAbbrev>(); Abv->Add(BitCodeAbbrevOp(serialization::DECL_RECORD)); - // Redeclarable - Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration + // RedeclarableDecl + AddNullDeclarationAbbrev(Abv); // No Redeclaration // Decl Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7)); // Packed DeclBits: ModuleOwnershipKind, @@ -2388,7 +2398,7 @@ void ASTWriter::WriteDeclAbbrevs() { // isImplicit, HasStandaloneLexicalDC, HasAttrs, // TopLevelDeclInObjCContainer, // isInvalidDecl - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext + AddDeclarationAbbrev(Abv); // DeclContext Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID // NamedDecl Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier @@ -2419,7 +2429,6 @@ void ASTWriter::WriteDeclAbbrevs() { // getArgPassingRestrictions // ODRHash Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 26)); - // DC Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // LexicalOffset Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // VisibleOffset @@ -2428,8 +2437,8 @@ void ASTWriter::WriteDeclAbbrevs() { // Abbreviation for DECL_PARM_VAR Abv = std::make_shared<BitCodeAbbrev>(); Abv->Add(BitCodeAbbrevOp(serialization::DECL_PARM_VAR)); - // Redeclarable - Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration + // RedeclarableDecl + AddNullDeclarationAbbrev(Abv); // No Redeclaration // Decl Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 8)); // Packed DeclBits: ModuleOwnershipKind, isUsed, @@ -2437,7 +2446,7 @@ void ASTWriter::WriteDeclAbbrevs() { // HasStandaloneLexicalDC, HasAttrs, isImplicit, // TopLevelDeclInObjCContainer, // isInvalidDecl, - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext + AddDeclarationAbbrev(Abv); // DeclContext Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID // NamedDecl Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier @@ -2470,8 +2479,8 @@ void ASTWriter::WriteDeclAbbrevs() { // Abbreviation for DECL_TYPEDEF Abv = std::make_shared<BitCodeAbbrev>(); Abv->Add(BitCodeAbbrevOp(serialization::DECL_TYPEDEF)); - // Redeclarable - Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration + // RedeclarableDecl + AddNullDeclarationAbbrev(Abv); // No Redeclaration // Decl Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 7)); // Packed DeclBits: ModuleOwnershipKind, @@ -2479,7 +2488,7 @@ void ASTWriter::WriteDeclAbbrevs() { // higher bits should be 0: isImplicit, // HasStandaloneLexicalDC, HasAttrs, // TopLevelDeclInObjCContainer, isInvalidDecl - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext + AddDeclarationAbbrev(Abv); // DeclContext Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID // NamedDecl Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier @@ -2496,15 +2505,15 @@ void ASTWriter::WriteDeclAbbrevs() { // Abbreviation for DECL_VAR Abv = std::make_shared<BitCodeAbbrev>(); Abv->Add(BitCodeAbbrevOp(serialization::DECL_VAR)); - // Redeclarable - Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration + // RedeclarableDecl + AddNullDeclarationAbbrev(Abv); // No Redeclaration // Decl Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 12)); // Packed DeclBits: HasStandaloneLexicalDC, // isInvalidDecl, HasAttrs, isImplicit, isUsed, // isReferenced, TopLevelDeclInObjCContainer, // AccessSpecifier, ModuleOwnershipKind - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext + AddDeclarationAbbrev(Abv); // DeclContext Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID // NamedDecl Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier @@ -2558,7 +2567,7 @@ void ASTWriter::WriteDeclAbbrevs() { // higher bits should be 0: isImplicit, // HasStandaloneLexicalDC, HasAttrs, // TopLevelDeclInObjCContainer, isInvalidDecl - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext + AddDeclarationAbbrev(Abv); // DeclContext Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID // NamedDecl Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier @@ -2576,26 +2585,25 @@ void ASTWriter::WriteDeclAbbrevs() { // Abbreviation for DECL_USING_SHADOW Abv = std::make_shared<BitCodeAbbrev>(); Abv->Add(BitCodeAbbrevOp(serialization::DECL_USING_SHADOW)); - // Redeclarable - Abv->Add(BitCodeAbbrevOp(0)); // No redeclaration + // RedeclarableDecl + AddNullDeclarationAbbrev(Abv); // No Redeclaration // Decl Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 12)); // Packed DeclBits: HasStandaloneLexicalDC, // isInvalidDecl, HasAttrs, isImplicit, isUsed, // isReferenced, TopLevelDeclInObjCContainer, // AccessSpecifier, ModuleOwnershipKind - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclContext + AddDeclarationAbbrev(Abv); // DeclContext Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // SubmoduleID // NamedDecl Abv->Add(BitCodeAbbrevOp(0)); // NameKind = Identifier Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Name Abv->Add(BitCodeAbbrevOp(0)); // UsingShadowDecl - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // TargetDecl + AddDeclarationAbbrev(Abv); // TargetDecl Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 11)); // IDNS - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // UsingOrNextShadow - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, - 6)); // InstantiatedFromUsingShadowDecl + AddDeclarationAbbrev(Abv); // UsingOrNextShadow + AddDeclarationAbbrev(Abv); // InstantiatedFromUsingShadowDecl DeclUsingShadowAbbrev = Stream.EmitAbbrev(std::move(Abv)); // Abbreviation for EXPR_DECL_REF @@ -2611,7 +2619,7 @@ void ASTWriter::WriteDeclAbbrevs() { // IsImmediateEscalating, NonOdrUseReason. // GetDeclFound, HasQualifier and ExplicitTemplateArgs should be 0. Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Fixed, 5)); - Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // DeclRef + AddDeclarationAbbrev(Abv); // DeclRef Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // Location DeclRefExprAbbrev = Stream.EmitAbbrev(std::move(Abv)); diff --git a/clang/test/Modules/codegen-nodep.test b/clang/test/Modules/codegen-nodep.test index 9b718ca9a3cf0..c46874354c116 100644 --- a/clang/test/Modules/codegen-nodep.test +++ b/clang/test/Modules/codegen-nodep.test @@ -10,4 +10,4 @@ RUN: | FileCheck %s Ensure there are only two modular codegen decls (one for the class, one for the function - none for the class and function templates). -CHECK: <MODULAR_CODEGEN_DECLS op0={{[0-9]+}} op1={{[0-9]+}}/> +CHECK: <MODULAR_CODEGEN_DECLS op0={{[0-9]+}} op1={{[0-9]+}} op2={{[0-9]+}} op3={{[0-9]+}}/> diff --git a/clang/test/Modules/decl-params-determinisim.m b/clang/test/Modules/decl-params-determinisim.m index db4ed33265388..acc34adb253f2 100644 --- a/clang/test/Modules/decl-params-determinisim.m +++ b/clang/test/Modules/decl-params-determinisim.m @@ -28,23 +28,23 @@ // CHECK: <TYPE_FUNCTION_PROTO // CHECK-NEXT: <DECL_PARM_VAR -// CHECK-SAME: op5=13 +// CHECK-SAME: op7=13 // CHECK-NEXT: <DECL_PARM_VAR -// CHECK-SAME: op5=14 +// CHECK-SAME: op7=14 // CHECK-NEXT: <DECL_PARM_VAR -// CHECK-SAME: op5=15 +// CHECK-SAME: op7=15 // CHECK-NEXT: <DECL_PARM_VAR -// CHECK-SAME: op5=16 +// CHECK-SAME: op7=16 /// Decl records start at 43 // CHECK: <DECL_RECORD -// CHECK-SAME: op5=54 +// CHECK-SAME: op7=54 // CHECK-NEXT: <DECL_RECORD -// CHECK-SAME: op5=55 +// CHECK-SAME: op7=55 // CHECK-NEXT: <DECL_RECORD -// CHECK-SAME: op5=56 +// CHECK-SAME: op7=56 // CHECK-NEXT: <DECL_RECORD -// CHECK-SAME: op5=57 +// CHECK-SAME: op7=57 //--- headers/a.h void f(struct A0 *a0, _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits