https://github.com/hokein created https://github.com/llvm/llvm-project/pull/133395
None >From 4095be6747a5d6f3cd619c644490c4170ab44d89 Mon Sep 17 00:00:00 2001 From: Haojian Wu <hokein...@gmail.com> Date: Fri, 28 Mar 2025 09:32:50 +0100 Subject: [PATCH] [WIP] Fix the crash when dump the deserialized decl --- .../ASTDeserializationListener.h | 4 ++ clang/lib/Frontend/FrontendAction.cpp | 42 ++++++++++++++++--- clang/lib/Serialization/ASTReader.cpp | 2 + 3 files changed, 42 insertions(+), 6 deletions(-) diff --git a/clang/include/clang/Serialization/ASTDeserializationListener.h b/clang/include/clang/Serialization/ASTDeserializationListener.h index ea96faa07c191..0ea96ecb01c50 100644 --- a/clang/include/clang/Serialization/ASTDeserializationListener.h +++ b/clang/include/clang/Serialization/ASTDeserializationListener.h @@ -27,6 +27,8 @@ class MacroInfo; class Module; class SourceLocation; +// IMPORTANT: when you add a new interface to this class, please update the +// DelegatingDeserializationListener in FrontendAction.cpp class ASTDeserializationListener { public: virtual ~ASTDeserializationListener(); @@ -57,6 +59,8 @@ class ASTDeserializationListener { /// A module import was read from the AST file. virtual void ModuleImportRead(serialization::SubmoduleID ID, SourceLocation ImportLoc) {} + /// The deserialization of the AST file was finished + virtual void FinishedDeserializing() {} }; } diff --git a/clang/lib/Frontend/FrontendAction.cpp b/clang/lib/Frontend/FrontendAction.cpp index 9f789f093f55d..f6ad89c4d2821 100644 --- a/clang/lib/Frontend/FrontendAction.cpp +++ b/clang/lib/Frontend/FrontendAction.cpp @@ -76,6 +76,10 @@ class DelegatingDeserializationListener : public ASTDeserializationListener { if (Previous) Previous->IdentifierRead(ID, II); } + void MacroRead(serialization::MacroID ID, MacroInfo *MI) override { + if (Previous) + Previous->MacroRead(ID, MI); + } void TypeRead(serialization::TypeIdx Idx, QualType T) override { if (Previous) Previous->TypeRead(Idx, T); @@ -93,6 +97,19 @@ class DelegatingDeserializationListener : public ASTDeserializationListener { if (Previous) Previous->MacroDefinitionRead(PPID, MD); } + void ModuleRead(serialization::SubmoduleID ID, Module *Mod) override { + if (Previous) + Previous->ModuleRead(ID, Mod); + } + void ModuleImportRead(serialization::SubmoduleID ID, + SourceLocation ImportLoc) override { + if (Previous) + Previous->ModuleImportRead(ID, ImportLoc); + } + void FinishedDeserializing() override { + if (Previous) + Previous->FinishedDeserializing(); + } }; /// Dumps deserialized declarations. @@ -103,15 +120,28 @@ class DeserializedDeclsDumper : public DelegatingDeserializationListener { : DelegatingDeserializationListener(Previous, DeletePrevious) {} void DeclRead(GlobalDeclID ID, const Decl *D) override { - llvm::outs() << "PCH DECL: " << D->getDeclKindName(); - if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) { - llvm::outs() << " - "; - ND->printQualifiedName(llvm::outs()); + PendingDecls.push_back(D); + DelegatingDeserializationListener::DeclRead(ID, D); + } + void FinishedDeserializing() override { + auto Decls = std::move(PendingDecls); + for (const auto *D : Decls) { + llvm::outs() << "PCH DECL: " << D->getDeclKindName(); + if (const NamedDecl *ND = dyn_cast<NamedDecl>(D)) { + llvm::outs() << " - "; + ND->printQualifiedName(llvm::outs()); + } + llvm::outs() << "\n"; } - llvm::outs() << "\n"; - DelegatingDeserializationListener::DeclRead(ID, D); + if (!PendingDecls.empty()) { + llvm::errs() << "triger deseralization more!\n"; + PendingDecls.clear(); + } + DelegatingDeserializationListener::FinishedDeserializing(); } +private: + std::vector<const Decl*> PendingDecls; }; /// Checks deserialized declarations and emits error if a name diff --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp index 0cd2cedb48dd9..9e3712226491a 100644 --- a/clang/lib/Serialization/ASTReader.cpp +++ b/clang/lib/Serialization/ASTReader.cpp @@ -10877,6 +10877,8 @@ void ASTReader::FinishedDeserializing() { // decls to the consumer. if (Consumer) PassInterestingDeclsToConsumer(); + if (DeserializationListener) + DeserializationListener->FinishedDeserializing(); } } _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits