From eeef0c06e2a17f49ce3bdf8ae78b9bf1cd05a077 Mon Sep 17 00:00:00 2001 From: Chuanqi Xu Date: Thu, 13 Jun 2024 11:41:49 +0800 Subject: [PATCH] [Serialization] Use 32 bit aligned decl id instead of unaligned decl id See the post commit message in https://github.com/llvm/llvm-project/pull/92083. I suspect the compile time regression in AArch64 is related to alignments. --- .../include/clang/Serialization/ASTBitCodes.h | 20 +++++++++-------- clang/include/clang/Serialization/ASTReader.h | 10 ++++----- .../include/clang/Serialization/ModuleFile.h | 2 +- clang/lib/Serialization/ASTReader.cpp | 22 +++++++++---------- 4 files changed, 28 insertions(+), 26 deletions(-) diff --git a/clang/include/clang/Serialization/ASTBitCodes.h b/clang/include/clang/Serialization/ASTBitCodes.h index 52a6c5e10f8025..be5b6c4e3b9bd2 100644 --- a/clang/include/clang/Serialization/ASTBitCodes.h +++ b/clang/include/clang/Serialization/ASTBitCodes.h @@ -168,13 +168,17 @@ const unsigned int NUM_PREDEF_SUBMODULE_IDS = 1; /// because blobs in bitstream are 32-bit aligned). This structure is /// serialized "as is" to the AST file. class UnalignedUInt64 { - uint32_t BitLow = 0; - uint32_t BitHigh = 0; + uint32_t BitLow; + uint32_t BitHigh; public: UnalignedUInt64() = default; UnalignedUInt64(uint64_t BitOffset) { set(BitOffset); } + operator uint64_t() const { + return get(); + } + void set(uint64_t Offset) { BitLow = Offset; BitHigh = Offset >> 32; @@ -255,11 +259,9 @@ class DeclOffset { } }; -// The unaligned decl ID used in the Blobs of bistreams. -using unaligned_decl_id_t = - llvm::support::detail::packed_endian_specific_integral< - serialization::DeclID, llvm::endianness::native, - llvm::support::unaligned>; +// The 32 bits aligned decl ID used in the Blobs of bistreams due the blobs +// are 32 bits aligned. +using SerializedDeclID = UnalignedUInt64; /// The number of predefined preprocessed entity IDs. const unsigned int NUM_PREDEF_PP_ENTITY_IDS = 1; @@ -1986,9 +1988,9 @@ enum CleanupObjectKind { COK_Block, COK_CompoundLiteral }; /// Describes the categories of an Objective-C class. struct ObjCCategoriesInfo { - // The ID of the definition. Use unaligned_decl_id_t to keep + // The ID of the definition. Use SerializedDeclID to keep // ObjCCategoriesInfo 32-bit aligned. - unaligned_decl_id_t DefinitionID; + SerializedDeclID DefinitionID; // Offset into the array of category lists. unsigned Offset; diff --git a/clang/include/clang/Serialization/ASTReader.h b/clang/include/clang/Serialization/ASTReader.h index 0a9006223dcbd5..07c4f3b624441f 100644 --- a/clang/include/clang/Serialization/ASTReader.h +++ b/clang/include/clang/Serialization/ASTReader.h @@ -586,11 +586,11 @@ class ASTReader struct FileDeclsInfo { ModuleFile *Mod = nullptr; - ArrayRef Decls; + ArrayRef Decls; FileDeclsInfo() = default; FileDeclsInfo(ModuleFile *Mod, - ArrayRef Decls) + ArrayRef Decls) : Mod(Mod), Decls(Decls) {} }; @@ -599,7 +599,7 @@ class ASTReader /// An array of lexical contents of a declaration context, as a sequence of /// Decl::Kind, DeclID pairs. - using LexicalContents = ArrayRef; + using LexicalContents = ArrayRef; /// Map from a DeclContext to its lexical contents. llvm::DenseMap> @@ -1482,7 +1482,7 @@ class ASTReader public: class ModuleDeclIterator : public llvm::iterator_adaptor_base< - ModuleDeclIterator, const serialization::unaligned_decl_id_t *, + ModuleDeclIterator, const serialization::SerializedDeclID *, std::random_access_iterator_tag, const Decl *, ptrdiff_t, const Decl *, const Decl *> { ASTReader *Reader = nullptr; @@ -1492,7 +1492,7 @@ class ASTReader ModuleDeclIterator() : iterator_adaptor_base(nullptr) {} ModuleDeclIterator(ASTReader *Reader, ModuleFile *Mod, - const serialization::unaligned_decl_id_t *Pos) + const serialization::SerializedDeclID *Pos) : iterator_adaptor_base(Pos), Reader(Reader), Mod(Mod) {} value_type operator*() const { diff --git a/clang/include/clang/Serialization/ModuleFile.h b/clang/include/clang/Serialization/ModuleFile.h index 56193d44dd6f33..a9cbd4bb267aae 100644 --- a/clang/include/clang/Serialization/ModuleFile.h +++ b/clang/include/clang/Serialization/ModuleFile.h @@ -458,7 +458,7 @@ class ModuleFile { unsigned BaseDeclIndex = 0; /// Array of file-level DeclIDs sorted by file. - const serialization::unaligned_decl_id_t *FileSortedDecls = nullptr; + const serialization::SerializedDeclID *FileSortedDecls = nullptr; unsigned NumFileSortedDecls = 0; /// Array of category list location information within this diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 59338b44db32f3..6ef74296c829d4 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -1266,7 +1266,7 @@ bool ASTReader::ReadLexicalDeclContextStorage(ModuleFile &M, if (!Lex.first) { Lex = std::make_pair( &M, llvm::ArrayRef( - reinterpret_cast(Blob.data()), + reinterpret_cast(Blob.data()), Blob.size() / sizeof(DeclID))); } DC->setHasExternalLexicalStorage(true); @@ -1658,7 +1658,7 @@ bool ASTReader::ReadSLocEntry(int ID) { unsigned NumFileDecls = Record[7]; if (NumFileDecls && ContextObj) { - const unaligned_decl_id_t *FirstDecl = F->FileSortedDecls + Record[6]; + const SerializedDeclID *FirstDecl = F->FileSortedDecls + Record[6]; assert(F->FileSortedDecls && "FILE_SORTED_DECLS not encountered yet ?"); FileDeclIDs[FID] = FileDeclsInfo(F, llvm::ArrayRef(FirstDecl, NumFileDecls)); @@ -3388,7 +3388,7 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, case TU_UPDATE_LEXICAL: { DeclContext *TU = ContextObj->getTranslationUnitDecl(); LexicalContents Contents( - reinterpret_cast(Blob.data()), + reinterpret_cast(Blob.data()), static_cast(Blob.size() / sizeof(DeclID))); TULexicalDecls.push_back(std::make_pair(&F, Contents)); TU->setHasExternalLexicalStorage(true); @@ -3616,7 +3616,7 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F, break; case FILE_SORTED_DECLS: - F.FileSortedDecls = (const unaligned_decl_id_t *)Blob.data(); + F.FileSortedDecls = (const SerializedDeclID *)Blob.data(); F.NumFileSortedDecls = Record[0]; break; @@ -7911,23 +7911,23 @@ class UnalignedDeclIDComp { UnalignedDeclIDComp(ASTReader &Reader, ModuleFile &M) : Reader(Reader), Mod(M) {} - bool operator()(unaligned_decl_id_t L, unaligned_decl_id_t R) const { + bool operator()(SerializedDeclID L, SerializedDeclID R) const { SourceLocation LHS = getLocation(L); SourceLocation RHS = getLocation(R); return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); } - bool operator()(SourceLocation LHS, unaligned_decl_id_t R) const { + bool operator()(SourceLocation LHS, SerializedDeclID R) const { SourceLocation RHS = getLocation(R); return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); } - bool operator()(unaligned_decl_id_t L, SourceLocation RHS) const { + bool operator()(SerializedDeclID L, SourceLocation RHS) const { SourceLocation LHS = getLocation(L); return Reader.getSourceManager().isBeforeInTranslationUnit(LHS, RHS); } - SourceLocation getLocation(unaligned_decl_id_t ID) const { + SourceLocation getLocation(SerializedDeclID ID) const { return Reader.getSourceManager().getFileLoc( Reader.getSourceLocationForDeclID( Reader.getGlobalDeclID(Mod, (LocalDeclID)ID))); @@ -7954,7 +7954,7 @@ void ASTReader::FindFileRegionDecls(FileID File, SourceLocation EndLoc = BeginLoc.getLocWithOffset(Length); UnalignedDeclIDComp DIDComp(*this, *DInfo.Mod); - ArrayRef::iterator BeginIt = + ArrayRef::iterator BeginIt = llvm::lower_bound(DInfo.Decls, BeginLoc, DIDComp); if (BeginIt != DInfo.Decls.begin()) --BeginIt; @@ -7967,12 +7967,12 @@ void ASTReader::FindFileRegionDecls(FileID File, ->isTopLevelDeclInObjCContainer()) --BeginIt; - ArrayRef::iterator EndIt = + ArrayRef::iterator EndIt = llvm::upper_bound(DInfo.Decls, EndLoc, DIDComp); if (EndIt != DInfo.Decls.end()) ++EndIt; - for (ArrayRef::iterator DIt = BeginIt; DIt != EndIt; + for (ArrayRef::iterator DIt = BeginIt; DIt != EndIt; ++DIt) Decls.push_back(GetDecl(getGlobalDeclID(*DInfo.Mod, (LocalDeclID)(*DIt)))); }