[Mlir-commits] [llvm] [mlir] [NFC][TableGen] Use `Twine` for Name argument in CodeGenHelpers (PR #163581)
Rahul Joshi
llvmlistbot at llvm.org
Fri Oct 17 10:00:40 PDT 2025
https://github.com/jurahul updated https://github.com/llvm/llvm-project/pull/163581
>From 2c8f2e697553c14f18737f09997bcf003f22e490 Mon Sep 17 00:00:00 2001
From: Rahul Joshi <rjoshi at nvidia.com>
Date: Wed, 15 Oct 2025 09:03:47 -0700
Subject: [PATCH 1/3] [NFC][TableGen] Use `Twine` for Name argument in
CodeGenHelpers
---
llvm/include/llvm/TableGen/CodeGenHelpers.h | 19 ++++++++++---------
.../utils/TableGen/Basic/DirectiveEmitter.cpp | 14 +++++---------
mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp | 7 ++-----
mlir/tools/mlir-tblgen/OpInterfacesGen.cpp | 4 ++--
4 files changed, 19 insertions(+), 25 deletions(-)
diff --git a/llvm/include/llvm/TableGen/CodeGenHelpers.h b/llvm/include/llvm/TableGen/CodeGenHelpers.h
index e22c6d4f6d390..d6fe36c8da4d3 100644
--- a/llvm/include/llvm/TableGen/CodeGenHelpers.h
+++ b/llvm/include/llvm/TableGen/CodeGenHelpers.h
@@ -13,9 +13,8 @@
#ifndef LLVM_TABLEGEN_CODEGENHELPERS_H
#define LLVM_TABLEGEN_CODEGENHELPERS_H
-#include "llvm/ADT/STLExtras.h"
-#include "llvm/ADT/StringExtras.h"
#include "llvm/ADT/StringRef.h"
+#include "llvm/ADT/Twine.h"
#include "llvm/Support/raw_ostream.h"
#include <string>
@@ -23,7 +22,7 @@ namespace llvm {
// Simple RAII helper for emitting ifdef-undef-endif scope.
class IfDefEmitter {
public:
- IfDefEmitter(raw_ostream &OS, StringRef Name) : Name(Name.str()), OS(OS) {
+ IfDefEmitter(raw_ostream &OS, const Twine &Name) : Name(Name.str()), OS(OS) {
OS << "#ifdef " << Name << "\n"
<< "#undef " << Name << "\n\n";
}
@@ -37,7 +36,7 @@ class IfDefEmitter {
// Simple RAII helper for emitting header include guard (ifndef-define-endif).
class IncludeGuardEmitter {
public:
- IncludeGuardEmitter(raw_ostream &OS, StringRef Name)
+ IncludeGuardEmitter(raw_ostream &OS, const Twine &Name)
: Name(Name.str()), OS(OS) {
OS << "#ifndef " << Name << "\n"
<< "#define " << Name << "\n\n";
@@ -54,8 +53,8 @@ class IncludeGuardEmitter {
// namespace scope.
class NamespaceEmitter {
public:
- NamespaceEmitter(raw_ostream &OS, StringRef NameUntrimmed)
- : Name(trim(NameUntrimmed).str()), OS(OS) {
+ NamespaceEmitter(raw_ostream &OS, const Twine &NameUntrimmed)
+ : Name(trim(NameUntrimmed)), OS(OS) {
if (!Name.empty())
OS << "namespace " << Name << " {\n";
}
@@ -77,9 +76,11 @@ class NamespaceEmitter {
// }
//
// and cannot use "namespace ::mlir::toy".
- static StringRef trim(StringRef Name) {
- Name.consume_front("::");
- return Name;
+ static std::string trim(const Twine &NameUntrimmed) {
+ std::string Name = NameUntrimmed.str();
+ StringRef StrRef = Name;
+ StrRef.consume_front("::");
+ return StrRef.str();
}
std::string Name;
raw_ostream &OS;
diff --git a/llvm/utils/TableGen/Basic/DirectiveEmitter.cpp b/llvm/utils/TableGen/Basic/DirectiveEmitter.cpp
index 3c6ff1132230b..bc9d281f8cbb9 100644
--- a/llvm/utils/TableGen/Basic/DirectiveEmitter.cpp
+++ b/llvm/utils/TableGen/Basic/DirectiveEmitter.cpp
@@ -266,7 +266,7 @@ static void emitDirectivesDecl(const RecordKeeper &Records, raw_ostream &OS) {
return;
StringRef Lang = DirLang.getName();
- IncludeGuardEmitter IncGuard(OS, (Twine("LLVM_") + Lang + "_INC").str());
+ IncludeGuardEmitter IncGuard(OS, Twine("LLVM_") + Lang + "_INC");
OS << "#include \"llvm/ADT/ArrayRef.h\"\n";
@@ -941,10 +941,8 @@ static void generateClauseSet(ArrayRef<const Record *> VerClauses,
static void generateDirectiveClauseSets(const DirectiveLanguage &DirLang,
Frontend FE, raw_ostream &OS) {
- std::string IfDefName{"GEN_"};
- IfDefName += getFESpelling(FE).upper();
- IfDefName += "_DIRECTIVE_CLAUSE_SETS";
- IfDefEmitter Scope(OS, IfDefName);
+ IfDefEmitter Scope(OS, "GEN_" + getFESpelling(FE).upper() +
+ "_DIRECTIVE_CLAUSE_SETS");
StringRef Namespace =
getFESpelling(FE == Frontend::Flang ? Frontend::LLVM : FE);
@@ -985,10 +983,8 @@ static void generateDirectiveClauseSets(const DirectiveLanguage &DirLang,
// allowances (allowed, allowed once, allowed exclusive and required).
static void generateDirectiveClauseMap(const DirectiveLanguage &DirLang,
Frontend FE, raw_ostream &OS) {
- std::string IfDefName{"GEN_"};
- IfDefName += getFESpelling(FE).upper();
- IfDefName += "_DIRECTIVE_CLAUSE_MAP";
- IfDefEmitter Scope(OS, IfDefName);
+ IfDefEmitter Scope(OS, "GEN_" + getFESpelling(FE).upper() +
+ "_DIRECTIVE_CLAUSE_MAP");
OS << "{\n";
diff --git a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
index 371864830a3c1..706fcd1699b0e 100644
--- a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
+++ b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
@@ -4938,10 +4938,7 @@ static void emitOpDefShard(const RecordKeeper &records,
ArrayRef<const Record *> defs,
const Dialect &dialect, unsigned shardIndex,
unsigned shardCount, raw_ostream &os) {
- std::string shardGuard = "GET_OP_DEFS_";
- std::string indexStr = std::to_string(shardIndex);
- shardGuard += indexStr;
- IfDefEmitter scope(os, shardGuard);
+ IfDefEmitter scope(os, Twine("GET_OP_DEFS_") + Twine(shardIndex));
// Emit the op registration hook in the first shard.
const char *const opRegistrationHook =
@@ -4968,7 +4965,7 @@ static void emitOpDefShard(const RecordKeeper &records,
os << "}\n";
// Generate the per-shard op definitions.
- emitOpClassDefs(records, defs, os, indexStr);
+ emitOpClassDefs(records, defs, os, std::to_string(shardIndex));
}
/// Emit op definitions for all op records.
diff --git a/mlir/tools/mlir-tblgen/OpInterfacesGen.cpp b/mlir/tools/mlir-tblgen/OpInterfacesGen.cpp
index ab8d534a99f19..f74cc05790042 100644
--- a/mlir/tools/mlir-tblgen/OpInterfacesGen.cpp
+++ b/mlir/tools/mlir-tblgen/OpInterfacesGen.cpp
@@ -442,8 +442,8 @@ void InterfaceGenerator::emitModelMethodsDef(const Interface &interface) {
}
void InterfaceGenerator::emitInterfaceTraitDecl(const Interface &interface) {
- auto cppNamespace = (interface.getCppNamespace() + "::detail").str();
- llvm::NamespaceEmitter ns(os, cppNamespace);
+ llvm::NamespaceEmitter ns(os,
+ Twine(interface.getCppNamespace()) + "::detail");
StringRef interfaceName = interface.getName();
auto interfaceTraitsName = (interfaceName + "InterfaceTraits").str();
>From 5e067b2197f02b37e1e22285a48b503c2486f622 Mon Sep 17 00:00:00 2001
From: Rahul Joshi <rjoshi at nvidia.com>
Date: Thu, 16 Oct 2025 12:36:53 -0700
Subject: [PATCH 2/3] No need of explicit Twine constructor
---
mlir/tools/mlir-tblgen/OpInterfacesGen.cpp | 3 +--
1 file changed, 1 insertion(+), 2 deletions(-)
diff --git a/mlir/tools/mlir-tblgen/OpInterfacesGen.cpp b/mlir/tools/mlir-tblgen/OpInterfacesGen.cpp
index f74cc05790042..77c1310aacb9c 100644
--- a/mlir/tools/mlir-tblgen/OpInterfacesGen.cpp
+++ b/mlir/tools/mlir-tblgen/OpInterfacesGen.cpp
@@ -442,8 +442,7 @@ void InterfaceGenerator::emitModelMethodsDef(const Interface &interface) {
}
void InterfaceGenerator::emitInterfaceTraitDecl(const Interface &interface) {
- llvm::NamespaceEmitter ns(os,
- Twine(interface.getCppNamespace()) + "::detail");
+ llvm::NamespaceEmitter ns(os, interface.getCppNamespace() + "::detail");
StringRef interfaceName = interface.getName();
auto interfaceTraitsName = (interfaceName + "InterfaceTraits").str();
>From 592e8758aab46b2e0c886fad3dac93f984616eb2 Mon Sep 17 00:00:00 2001
From: Rahul Joshi <rjoshi at nvidia.com>
Date: Thu, 16 Oct 2025 12:40:58 -0700
Subject: [PATCH 3/3] Do not serialize the input Twine more than once
---
llvm/include/llvm/TableGen/CodeGenHelpers.h | 23 +++++++++++----------
mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp | 2 +-
2 files changed, 13 insertions(+), 12 deletions(-)
diff --git a/llvm/include/llvm/TableGen/CodeGenHelpers.h b/llvm/include/llvm/TableGen/CodeGenHelpers.h
index d6fe36c8da4d3..b4cc59fa8cc35 100644
--- a/llvm/include/llvm/TableGen/CodeGenHelpers.h
+++ b/llvm/include/llvm/TableGen/CodeGenHelpers.h
@@ -13,6 +13,7 @@
#ifndef LLVM_TABLEGEN_CODEGENHELPERS_H
#define LLVM_TABLEGEN_CODEGENHELPERS_H
+#include "llvm/ADT/SmallString.h"
#include "llvm/ADT/StringRef.h"
#include "llvm/ADT/Twine.h"
#include "llvm/Support/raw_ostream.h"
@@ -23,8 +24,8 @@ namespace llvm {
class IfDefEmitter {
public:
IfDefEmitter(raw_ostream &OS, const Twine &Name) : Name(Name.str()), OS(OS) {
- OS << "#ifdef " << Name << "\n"
- << "#undef " << Name << "\n\n";
+ OS << "#ifdef " << this->Name << "\n"
+ << "#undef " << this->Name << "\n\n";
}
~IfDefEmitter() { OS << "\n#endif // " << Name << "\n\n"; }
@@ -38,8 +39,8 @@ class IncludeGuardEmitter {
public:
IncludeGuardEmitter(raw_ostream &OS, const Twine &Name)
: Name(Name.str()), OS(OS) {
- OS << "#ifndef " << Name << "\n"
- << "#define " << Name << "\n\n";
+ OS << "#ifndef " << this->Name << "\n"
+ << "#define " << this->Name << "\n\n";
}
~IncludeGuardEmitter() { OS << "\n#endif // " << Name << "\n"; }
@@ -53,10 +54,10 @@ class IncludeGuardEmitter {
// namespace scope.
class NamespaceEmitter {
public:
- NamespaceEmitter(raw_ostream &OS, const Twine &NameUntrimmed)
- : Name(trim(NameUntrimmed)), OS(OS) {
- if (!Name.empty())
- OS << "namespace " << Name << " {\n";
+ NamespaceEmitter(raw_ostream &OS, const Twine &Name)
+ : Name(trim(Name)), OS(OS) {
+ if (!this->Name.empty())
+ OS << "namespace " << this->Name << " {\n";
}
~NamespaceEmitter() { close(); }
@@ -76,9 +77,9 @@ class NamespaceEmitter {
// }
//
// and cannot use "namespace ::mlir::toy".
- static std::string trim(const Twine &NameUntrimmed) {
- std::string Name = NameUntrimmed.str();
- StringRef StrRef = Name;
+ static std::string trim(const Twine &Name) {
+ SmallString<64> Storage;
+ StringRef StrRef = Name.toStringRef(Storage);
StrRef.consume_front("::");
return StrRef.str();
}
diff --git a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
index 706fcd1699b0e..b939bddd26349 100644
--- a/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
+++ b/mlir/tools/mlir-tblgen/OpDefinitionsGen.cpp
@@ -4938,7 +4938,7 @@ static void emitOpDefShard(const RecordKeeper &records,
ArrayRef<const Record *> defs,
const Dialect &dialect, unsigned shardIndex,
unsigned shardCount, raw_ostream &os) {
- IfDefEmitter scope(os, Twine("GET_OP_DEFS_") + Twine(shardIndex));
+ IfDefEmitter scope(os, "GET_OP_DEFS_" + Twine(shardIndex));
// Emit the op registration hook in the first shard.
const char *const opRegistrationHook =
More information about the Mlir-commits
mailing list