[clang] [clang] Implement some missing interfaces for DelegatingDeserializationListener (PR #133424)
Haojian Wu via cfe-commits
cfe-commits at lists.llvm.org
Fri Mar 28 06:06:46 PDT 2025
https://github.com/hokein updated https://github.com/llvm/llvm-project/pull/133424
>From 8eda8337877f85a2e59cb71faeb0da3ed6bff9ee Mon Sep 17 00:00:00 2001
From: Haojian Wu <hokein.wu at gmail.com>
Date: Fri, 28 Mar 2025 12:05:41 +0100
Subject: [PATCH] [clang] Implement some missing interfaces for
DelegatingDeserializationListener
This patch also moves the DelegatingDeserializationListener close to
ASTDeserializationListener.
---
.../ASTDeserializationListener.h | 73 ++++++++++++++++++-
clang/lib/Frontend/FrontendAction.cpp | 46 ------------
2 files changed, 72 insertions(+), 47 deletions(-)
diff --git a/clang/include/clang/Serialization/ASTDeserializationListener.h b/clang/include/clang/Serialization/ASTDeserializationListener.h
index ea96faa07c191..7728ce04856f5 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 below.
class ASTDeserializationListener {
public:
virtual ~ASTDeserializationListener();
@@ -44,6 +46,11 @@ class ASTDeserializationListener {
/// unqualified.
virtual void TypeRead(serialization::TypeIdx Idx, QualType T) { }
/// A decl was deserialized from the AST file.
+ //
+ // Note: Implementors should be cautious when introducing additional
+ // serialization (e.g., printing the qualified name of the declaration) within
+ // the callback. Doing so may lead to unintended and complex side effects, or
+ // even cause a crash.
virtual void DeclRead(GlobalDeclID ID, const Decl *D) {}
/// A predefined decl was built during the serialization.
virtual void PredefinedDeclBuilt(PredefinedDeclIDs ID, const Decl *D) {}
@@ -58,6 +65,70 @@ class ASTDeserializationListener {
virtual void ModuleImportRead(serialization::SubmoduleID ID,
SourceLocation ImportLoc) {}
};
-}
+
+class DelegatingDeserializationListener : public ASTDeserializationListener {
+ ASTDeserializationListener *Previous;
+ bool DeletePrevious;
+
+public:
+ explicit DelegatingDeserializationListener(
+ ASTDeserializationListener *Previous, bool DeletePrevious)
+ : Previous(Previous), DeletePrevious(DeletePrevious) {}
+ ~DelegatingDeserializationListener() override {
+ if (DeletePrevious)
+ delete Previous;
+ }
+
+ DelegatingDeserializationListener(const DelegatingDeserializationListener &) =
+ delete;
+ DelegatingDeserializationListener &
+ operator=(const DelegatingDeserializationListener &) = delete;
+
+ void ReaderInitialized(ASTReader *Reader) override {
+ if (Previous)
+ Previous->ReaderInitialized(Reader);
+ }
+ void IdentifierRead(serialization::IdentifierID ID,
+ IdentifierInfo *II) override {
+ 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);
+ }
+ void DeclRead(GlobalDeclID ID, const Decl *D) override {
+ if (Previous)
+ Previous->DeclRead(ID, D);
+ }
+ void PredefinedDeclBuilt(PredefinedDeclIDs ID, const Decl *D) override {
+ if (Previous)
+ Previous->PredefinedDeclBuilt(ID, D);
+ }
+ void SelectorRead(serialization::SelectorID ID, Selector Sel) override {
+ if (Previous)
+ Previous->SelectorRead(ID, Sel);
+ }
+ void MacroDefinitionRead(serialization::PreprocessedEntityID PPID,
+ MacroDefinitionRecord *MD) override {
+ 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);
+ }
+};
+
+} // namespace clang
#endif
diff --git a/clang/lib/Frontend/FrontendAction.cpp b/clang/lib/Frontend/FrontendAction.cpp
index 9f789f093f55d..f6ad7c8dbd7ca 100644
--- a/clang/lib/Frontend/FrontendAction.cpp
+++ b/clang/lib/Frontend/FrontendAction.cpp
@@ -49,52 +49,6 @@ LLVM_INSTANTIATE_REGISTRY(FrontendPluginRegistry)
namespace {
-class DelegatingDeserializationListener : public ASTDeserializationListener {
- ASTDeserializationListener *Previous;
- bool DeletePrevious;
-
-public:
- explicit DelegatingDeserializationListener(
- ASTDeserializationListener *Previous, bool DeletePrevious)
- : Previous(Previous), DeletePrevious(DeletePrevious) {}
- ~DelegatingDeserializationListener() override {
- if (DeletePrevious)
- delete Previous;
- }
-
- DelegatingDeserializationListener(const DelegatingDeserializationListener &) =
- delete;
- DelegatingDeserializationListener &
- operator=(const DelegatingDeserializationListener &) = delete;
-
- void ReaderInitialized(ASTReader *Reader) override {
- if (Previous)
- Previous->ReaderInitialized(Reader);
- }
- void IdentifierRead(serialization::IdentifierID ID,
- IdentifierInfo *II) override {
- if (Previous)
- Previous->IdentifierRead(ID, II);
- }
- void TypeRead(serialization::TypeIdx Idx, QualType T) override {
- if (Previous)
- Previous->TypeRead(Idx, T);
- }
- void DeclRead(GlobalDeclID ID, const Decl *D) override {
- if (Previous)
- Previous->DeclRead(ID, D);
- }
- void SelectorRead(serialization::SelectorID ID, Selector Sel) override {
- if (Previous)
- Previous->SelectorRead(ID, Sel);
- }
- void MacroDefinitionRead(serialization::PreprocessedEntityID PPID,
- MacroDefinitionRecord *MD) override {
- if (Previous)
- Previous->MacroDefinitionRead(PPID, MD);
- }
-};
-
/// Dumps deserialized declarations.
class DeserializedDeclsDumper : public DelegatingDeserializationListener {
public:
More information about the cfe-commits
mailing list