[clang] [WIP] Fix the crash when dump the deserialized decl (PR #133395)
Haojian Wu via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 28 01:33:51 PDT 2025
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.wu at 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();
}
}
More information about the cfe-commits
mailing list