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" _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
