From 7c8a33e441369a7e8e3bc5975ecf1efea1e8065b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20=C5=A0till?= Date: Mon, 27 May 2024 14:32:12 +0200 Subject: [PATCH 1/3] Facilitate inheritance from RenameSymbols pass, deduplicate code --- frontends/p4/uniqueNames.cpp | 71 ++++++++++-------------------------- frontends/p4/uniqueNames.h | 21 +++++++++++ 2 files changed, 40 insertions(+), 52 deletions(-) diff --git a/frontends/p4/uniqueNames.cpp b/frontends/p4/uniqueNames.cpp index f217cb744a..ec272d7895 100644 --- a/frontends/p4/uniqueNames.cpp +++ b/frontends/p4/uniqueNames.cpp @@ -64,14 +64,6 @@ class FindActionCalls : public Inspector { } // namespace -// Add a @name annotation ONLY if it does not already exist. -// Otherwise do nothing. -static const IR::Annotations *addNameAnnotation(cstring name, const IR::Annotations *annos) { - if (annos == nullptr) annos = IR::Annotations::empty; - return annos->addAnnotationIfNew(IR::Annotation::nameAnnotation, new IR::StringLiteral(name), - false); -} - UniqueNames::UniqueNames(ReferenceMap *refMap) : renameMap(new RenameMap) { setName("UniqueNames"); visitDagOnce = false; @@ -96,21 +88,25 @@ UniqueParameters::UniqueParameters(ReferenceMap *refMap, TypeMap *typeMap) /**************************************************************************/ IR::ID *RenameSymbols::getName() const { - auto orig = getOriginal(); - auto newName = renameMap->get(orig); + return getName(getOriginal()); +} + +IR::ID *RenameSymbols::getName(const IR::IDeclaration *decl) const { + auto newName = renameMap->get(decl); if (!newName.has_value()) return nullptr; - auto name = new IR::ID(orig->getName().srcInfo, *newName, orig->getName().originalName); + auto name = new IR::ID(decl->getName().srcInfo, *newName, decl->getName().originalName); return name; } +const IR::Annotations *RenameSymbols::addNameAnnotation(cstring name, + const IR::Annotations *annos) { + if (annos == nullptr) annos = IR::Annotations::empty; + return annos->addAnnotationIfNew(IR::Annotation::nameAnnotation, new IR::StringLiteral(name), + false); +} + const IR::Node *RenameSymbols::postorder(IR::Declaration_Variable *decl) { - auto name = getName(); - if (name != nullptr && *name != decl->name) { - auto annos = addNameAnnotation(decl->name, decl->annotations); - decl->name = *name; - decl->annotations = annos; - } - return decl; + return renameDeclWithNameAnno(decl); } const IR::Node *RenameSymbols::postorder(IR::Declaration_Constant *decl) { @@ -120,12 +116,7 @@ const IR::Node *RenameSymbols::postorder(IR::Declaration_Constant *decl) { } const IR::Node *RenameSymbols::postorder(IR::Parameter *param) { - auto name = getName(); - if (name != nullptr && *name != param->name.name) { - param->annotations = addNameAnnotation(param->name, param->annotations); - param->name = IR::ID(param->name.srcInfo, *name, param->name.originalName); - } - return param; + return renameDeclWithNameAnno(param); } const IR::Node *RenameSymbols::postorder(IR::PathExpression *expression) { @@ -142,43 +133,19 @@ const IR::Node *RenameSymbols::postorder(IR::PathExpression *expression) { } const IR::Node *RenameSymbols::postorder(IR::Declaration_Instance *decl) { - auto name = getName(); - if (name != nullptr && *name != decl->name) { - auto annos = addNameAnnotation(decl->name, decl->annotations); - decl->name = *name; - decl->annotations = annos; - } - return decl; + return renameDeclWithNameAnno(decl); } const IR::Node *RenameSymbols::postorder(IR::P4Table *decl) { - auto name = getName(); - if (name != nullptr && *name != decl->name) { - auto annos = addNameAnnotation(decl->name, decl->annotations); - decl->name = *name; - decl->annotations = annos; - } - return decl; + return renameDeclWithNameAnno(decl); } const IR::Node *RenameSymbols::postorder(IR::P4Action *decl) { - auto name = getName(); - if (name != nullptr && *name != decl->name) { - auto annos = addNameAnnotation(decl->name, decl->annotations); - decl->name = *name; - decl->annotations = annos; - } - return decl; + return renameDeclWithNameAnno(decl); } const IR::Node *RenameSymbols::postorder(IR::P4ValueSet *decl) { - auto name = getName(); - if (name != nullptr && *name != decl->name) { - auto annos = addNameAnnotation(decl->name, decl->annotations); - decl->name = *name; - decl->annotations = annos; - } - return decl; + return renameDeclWithNameAnno(decl); } const IR::Node *RenameSymbols::postorder(IR::Argument *arg) { diff --git a/frontends/p4/uniqueNames.h b/frontends/p4/uniqueNames.h index 3584cf3fae..bd5fc602cb 100644 --- a/frontends/p4/uniqueNames.h +++ b/frontends/p4/uniqueNames.h @@ -114,10 +114,31 @@ class FindSymbols : public Inspector { }; class RenameSymbols : public Transform { + protected: ReferenceMap *refMap; RenameMap *renameMap; + /// Get new name of the current declaration or nullptr if the declaration is not to be renamed. IR::ID *getName() const; + /// Get new name of the given declaration or nullptr if the declaration is not to be renamed. + /// @param decl Declaration *in the original/non-transformed* P4 IR. + IR::ID *getName(const IR::IDeclaration *decl) const; + + /// Add a @name annotation ONLY if it does not already exist. + /// Otherwise do nothing. + static const IR::Annotations *addNameAnnotation(cstring name, const IR::Annotations *annos); + + /// Rename any declaration where we want to add @name annotation with the original name. + /// Has to be a template as there is no common base for declarations with annotations member. + template + const IR::Node *renameDeclWithNameAnno(D *decl) { + auto name = getName(); + if (name != nullptr && *name != decl->name) { + decl->annotations = addNameAnnotation(decl->name, decl->annotations); + decl->name = *name; + } + return decl; + } public: RenameSymbols(ReferenceMap *refMap, RenameMap *renameMap) From 345f1917747d4dd1edc5ef69ad02aa7e7af71b77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20=C5=A0till?= Date: Mon, 27 May 2024 14:56:57 +0200 Subject: [PATCH 2/3] Fix formatting --- frontends/p4/uniqueNames.cpp | 8 ++------ frontends/p4/uniqueNames.h | 2 +- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/frontends/p4/uniqueNames.cpp b/frontends/p4/uniqueNames.cpp index ec272d7895..48037ca2ab 100644 --- a/frontends/p4/uniqueNames.cpp +++ b/frontends/p4/uniqueNames.cpp @@ -87,9 +87,7 @@ UniqueParameters::UniqueParameters(ReferenceMap *refMap, TypeMap *typeMap) /**************************************************************************/ -IR::ID *RenameSymbols::getName() const { - return getName(getOriginal()); -} +IR::ID *RenameSymbols::getName() const { return getName(getOriginal()); } IR::ID *RenameSymbols::getName(const IR::IDeclaration *decl) const { auto newName = renameMap->get(decl); @@ -136,9 +134,7 @@ const IR::Node *RenameSymbols::postorder(IR::Declaration_Instance *decl) { return renameDeclWithNameAnno(decl); } -const IR::Node *RenameSymbols::postorder(IR::P4Table *decl) { - return renameDeclWithNameAnno(decl); -} +const IR::Node *RenameSymbols::postorder(IR::P4Table *decl) { return renameDeclWithNameAnno(decl); } const IR::Node *RenameSymbols::postorder(IR::P4Action *decl) { return renameDeclWithNameAnno(decl); diff --git a/frontends/p4/uniqueNames.h b/frontends/p4/uniqueNames.h index bd5fc602cb..f849e82138 100644 --- a/frontends/p4/uniqueNames.h +++ b/frontends/p4/uniqueNames.h @@ -130,7 +130,7 @@ class RenameSymbols : public Transform { /// Rename any declaration where we want to add @name annotation with the original name. /// Has to be a template as there is no common base for declarations with annotations member. - template + template const IR::Node *renameDeclWithNameAnno(D *decl) { auto name = getName(); if (name != nullptr && *name != decl->name) { From ada5b736d037c08f8e114bdd8d4cb3e9b8b53baf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Vladim=C3=ADr=20=C5=A0till?= Date: Mon, 27 May 2024 15:19:58 +0200 Subject: [PATCH 3/3] Rename function --- frontends/p4/uniqueNames.cpp | 14 ++++++++------ frontends/p4/uniqueNames.h | 2 +- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/frontends/p4/uniqueNames.cpp b/frontends/p4/uniqueNames.cpp index 48037ca2ab..b48c64ff68 100644 --- a/frontends/p4/uniqueNames.cpp +++ b/frontends/p4/uniqueNames.cpp @@ -104,7 +104,7 @@ const IR::Annotations *RenameSymbols::addNameAnnotation(cstring name, } const IR::Node *RenameSymbols::postorder(IR::Declaration_Variable *decl) { - return renameDeclWithNameAnno(decl); + return renameDeclWithNameAnnotation(decl); } const IR::Node *RenameSymbols::postorder(IR::Declaration_Constant *decl) { @@ -114,7 +114,7 @@ const IR::Node *RenameSymbols::postorder(IR::Declaration_Constant *decl) { } const IR::Node *RenameSymbols::postorder(IR::Parameter *param) { - return renameDeclWithNameAnno(param); + return renameDeclWithNameAnnotation(param); } const IR::Node *RenameSymbols::postorder(IR::PathExpression *expression) { @@ -131,17 +131,19 @@ const IR::Node *RenameSymbols::postorder(IR::PathExpression *expression) { } const IR::Node *RenameSymbols::postorder(IR::Declaration_Instance *decl) { - return renameDeclWithNameAnno(decl); + return renameDeclWithNameAnnotation(decl); } -const IR::Node *RenameSymbols::postorder(IR::P4Table *decl) { return renameDeclWithNameAnno(decl); } +const IR::Node *RenameSymbols::postorder(IR::P4Table *decl) { + return renameDeclWithNameAnnotation(decl); +} const IR::Node *RenameSymbols::postorder(IR::P4Action *decl) { - return renameDeclWithNameAnno(decl); + return renameDeclWithNameAnnotation(decl); } const IR::Node *RenameSymbols::postorder(IR::P4ValueSet *decl) { - return renameDeclWithNameAnno(decl); + return renameDeclWithNameAnnotation(decl); } const IR::Node *RenameSymbols::postorder(IR::Argument *arg) { diff --git a/frontends/p4/uniqueNames.h b/frontends/p4/uniqueNames.h index f849e82138..039c4b5511 100644 --- a/frontends/p4/uniqueNames.h +++ b/frontends/p4/uniqueNames.h @@ -131,7 +131,7 @@ class RenameSymbols : public Transform { /// Rename any declaration where we want to add @name annotation with the original name. /// Has to be a template as there is no common base for declarations with annotations member. template - const IR::Node *renameDeclWithNameAnno(D *decl) { + const IR::Node *renameDeclWithNameAnnotation(D *decl) { auto name = getName(); if (name != nullptr && *name != decl->name) { decl->annotations = addNameAnnotation(decl->name, decl->annotations);