[clang] 8aebfcd - [CIR][NFC] Generate ABI lowering patterns with TableGen (#175021)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Jan 9 08:18:13 PST 2026
Author: Sirui Mu
Date: 2026-01-10T00:18:09+08:00
New Revision: 8aebfcd953727aa63aed3838584d6ce5c44c423e
URL: https://github.com/llvm/llvm-project/commit/8aebfcd953727aa63aed3838584d6ce5c44c423e
DIFF: https://github.com/llvm/llvm-project/commit/8aebfcd953727aa63aed3838584d6ce5c44c423e.diff
LOG: [CIR][NFC] Generate ABI lowering patterns with TableGen (#175021)
This patch teaches clang-tblgen to start emitting ABI lowering pattern
declarations.
Added:
Modified:
clang/include/clang/CIR/Dialect/IR/CIROps.td
clang/lib/CIR/Dialect/Transforms/CXXABILowering.cpp
clang/utils/TableGen/CIRLoweringEmitter.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td
index 50798be64551a..e2b582c5c55df 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIROps.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td
@@ -79,6 +79,8 @@ class LLVMLoweringInfo {
class CIR_Op<string mnemonic, list<Trait> traits = []> :
Op<CIR_Dialect, mnemonic, traits>, LLVMLoweringInfo {
+ // Should we generate an ABI lowering pattern for this op?
+ bit hasCXXABILowering = false;
// Should we generate an LLVM lowering pattern for this op?
bit hasLLVMLowering = true;
// Is the LLVM lowering pattern for this operation recursive?
@@ -451,6 +453,7 @@ def CIR_ConstantOp : CIR_Op<"const", [
let hasFolder = 1;
+ let hasCXXABILowering = true;
let isLLVMLoweringRecursive = true;
}
@@ -571,6 +574,8 @@ def CIR_AllocaOp : CIR_Op<"alloca", [
`]`
($annotations^)? attr-dict
}];
+
+ let hasCXXABILowering = true;
}
//===----------------------------------------------------------------------===//
@@ -2251,6 +2256,8 @@ def CIR_GlobalOp : CIR_Op<"global", [
let hasVerifier = 1;
+ let hasCXXABILowering = true;
+
let isLLVMLoweringRecursive = true;
let extraLLVMLoweringPatternDecl = [{
mlir::LogicalResult matchAndRewriteRegionInitializedGlobal(
@@ -3009,6 +3016,8 @@ def CIR_FuncOp : CIR_Op<"func", [
let hasCustomAssemblyFormat = 1;
let hasVerifier = 1;
+ let hasCXXABILowering = true;
+
let extraLLVMLoweringPatternDecl = [{
static mlir::StringRef getLinkageAttrNameString() { return "linkage"; }
@@ -3785,6 +3794,7 @@ def CIR_GetRuntimeMemberOp : CIR_Op<"get_runtime_member"> {
let hasVerifier = 1;
+ let hasCXXABILowering = true;
let hasLLVMLowering = false;
}
diff --git a/clang/lib/CIR/Dialect/Transforms/CXXABILowering.cpp b/clang/lib/CIR/Dialect/Transforms/CXXABILowering.cpp
index 49087ca38d948..d586a3bf8974d 100644
--- a/clang/lib/CIR/Dialect/Transforms/CXXABILowering.cpp
+++ b/clang/lib/CIR/Dialect/Transforms/CXXABILowering.cpp
@@ -31,38 +31,9 @@ namespace mlir {
namespace {
-template <typename Op>
-class CIROpCXXABILoweringPattern : public mlir::OpConversionPattern<Op> {
-protected:
- mlir::DataLayout *dataLayout;
- cir::LowerModule *lowerModule;
-
-public:
- CIROpCXXABILoweringPattern(mlir::MLIRContext *context,
- const mlir::TypeConverter &typeConverter,
- mlir::DataLayout &dataLayout,
- cir::LowerModule &lowerModule)
- : mlir::OpConversionPattern<Op>(typeConverter, context),
- dataLayout(&dataLayout), lowerModule(&lowerModule) {}
-};
-
-// TODO(cir): Use TableGen to generate these patterns.
-#define CIR_CXXABI_LOWERING_PATTERN(name, operation) \
- struct name : CIROpCXXABILoweringPattern<operation> { \
- using CIROpCXXABILoweringPattern<operation>::CIROpCXXABILoweringPattern; \
- \
- mlir::LogicalResult \
- matchAndRewrite(operation op, OpAdaptor adaptor, \
- mlir::ConversionPatternRewriter &rewriter) const override; \
- }
-
-CIR_CXXABI_LOWERING_PATTERN(CIRAllocaOpABILowering, cir::AllocaOp);
-CIR_CXXABI_LOWERING_PATTERN(CIRConstantOpABILowering, cir::ConstantOp);
-CIR_CXXABI_LOWERING_PATTERN(CIRFuncOpABILowering, cir::FuncOp);
-CIR_CXXABI_LOWERING_PATTERN(CIRGetRuntimeMemberOpABILowering,
- cir::GetRuntimeMemberOp);
-CIR_CXXABI_LOWERING_PATTERN(CIRGlobalOpABILowering, cir::GlobalOp);
-#undef CIR_CXXABI_LOWERING_PATTERN
+#define GET_ABI_LOWERING_PATTERNS
+#include "clang/CIR/Dialect/IR/CIRLowering.inc"
+#undef GET_ABI_LOWERING_PATTERNS
struct CXXABILoweringPass
: public impl::CXXABILoweringBase<CXXABILoweringPass> {
@@ -346,13 +317,9 @@ void CXXABILoweringPass::runOnOperation() {
patterns.add<CIRGenericCXXABILoweringPattern>(patterns.getContext(),
typeConverter);
patterns.add<
- // clang-format off
- CIRAllocaOpABILowering,
- CIRConstantOpABILowering,
- CIRFuncOpABILowering,
- CIRGetRuntimeMemberOpABILowering,
- CIRGlobalOpABILowering
- // clang-format on
+#define GET_ABI_LOWERING_PATTERNS_LIST
+#include "clang/CIR/Dialect/IR/CIRLowering.inc"
+#undef GET_ABI_LOWERING_PATTERNS_LIST
>(patterns.getContext(), typeConverter, dataLayout, *lowerModule);
mlir::ConversionTarget target(*ctx);
diff --git a/clang/utils/TableGen/CIRLoweringEmitter.cpp b/clang/utils/TableGen/CIRLoweringEmitter.cpp
index c81b8941f9a39..a669f21aa1108 100644
--- a/clang/utils/TableGen/CIRLoweringEmitter.cpp
+++ b/clang/utils/TableGen/CIRLoweringEmitter.cpp
@@ -20,6 +20,8 @@ using namespace llvm;
using namespace clang;
namespace {
+std::vector<std::string> CXXABILoweringPatterns;
+std::vector<std::string> CXXABILoweringPatternsList;
std::vector<std::string> LLVMLoweringPatterns;
std::vector<std::string> LLVMLoweringPatternsList;
@@ -45,6 +47,13 @@ std::string GetOpCppClassName(const Record *OpRecord) {
return CppClassName.str();
}
+std::string GetOpABILoweringPatternName(llvm::StringRef OpName) {
+ std::string Name = "CIR";
+ Name += OpName;
+ Name += "ABILowering";
+ return Name;
+}
+
std::string GetOpLLVMLoweringPatternName(llvm::StringRef OpName) {
std::string Name = "CIRToLLVM";
Name += OpName;
@@ -52,6 +61,36 @@ std::string GetOpLLVMLoweringPatternName(llvm::StringRef OpName) {
return Name;
}
+void GenerateABILoweringPattern(llvm::StringRef OpName,
+ llvm::StringRef PatternName) {
+ std::string CodeBuffer;
+ llvm::raw_string_ostream Code(CodeBuffer);
+
+ Code << "class " << PatternName
+ << " : public mlir::OpConversionPattern<cir::" << OpName << "> {\n";
+ Code << " [[maybe_unused]] mlir::DataLayout *dataLayout;\n";
+ Code << " [[maybe_unused]] cir::LowerModule *lowerModule;\n";
+ Code << "\n";
+
+ Code << "public:\n";
+ Code << " " << PatternName
+ << "(mlir::MLIRContext *context, const mlir::TypeConverter "
+ "&typeConverter, mlir::DataLayout &dataLayout, cir::LowerModule "
+ "&lowerModule)\n";
+ Code << " : OpConversionPattern<cir::" << OpName
+ << ">(typeConverter, context), dataLayout(&dataLayout), "
+ "lowerModule(&lowerModule) {}\n";
+ Code << "\n";
+
+ Code << " mlir::LogicalResult matchAndRewrite(cir::" << OpName
+ << " op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) "
+ "const override;\n";
+
+ Code << "};\n";
+
+ CXXABILoweringPatterns.push_back(std::move(CodeBuffer));
+}
+
void GenerateLLVMLoweringPattern(llvm::StringRef OpName,
llvm::StringRef PatternName, bool IsRecursive,
llvm::StringRef ExtraDecl) {
@@ -103,6 +142,12 @@ void GenerateLLVMLoweringPattern(llvm::StringRef OpName,
void Generate(const Record *OpRecord) {
std::string OpName = GetOpCppClassName(OpRecord);
+ if (OpRecord->getValueAsBit("hasCXXABILowering")) {
+ std::string PatternName = GetOpABILoweringPatternName(OpName);
+ GenerateABILoweringPattern(OpName, PatternName);
+ CXXABILoweringPatternsList.push_back(std::move(PatternName));
+ }
+
if (OpRecord->getValueAsBit("hasLLVMLowering")) {
std::string PatternName = GetOpLLVMLoweringPatternName(OpName);
bool IsRecursive = OpRecord->getValueAsBit("isLLVMLoweringRecursive");
@@ -121,6 +166,11 @@ void clang::EmitCIRLowering(const llvm::RecordKeeper &RK,
for (const auto *OpRecord : RK.getAllDerivedDefinitions("CIR_Op"))
Generate(OpRecord);
+ OS << "#ifdef GET_ABI_LOWERING_PATTERNS\n"
+ << llvm::join(CXXABILoweringPatterns, "\n") << "#endif\n\n";
+ OS << "#ifdef GET_ABI_LOWERING_PATTERNS_LIST\n"
+ << llvm::join(CXXABILoweringPatternsList, ",\n") << "\n#endif\n\n";
+
OS << "#ifdef GET_LLVM_LOWERING_PATTERNS\n"
<< llvm::join(LLVMLoweringPatterns, "\n") << "#endif\n\n";
OS << "#ifdef GET_LLVM_LOWERING_PATTERNS_LIST\n"
More information about the cfe-commits
mailing list