2424#include " mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
2525#include " mlir/Target/LLVMIR/Export.h"
2626#include " mlir/Transforms/DialectConversion.h"
27- #include " clang/CIR/Dialect/IR/CIRAttrVisitor.h"
2827#include " clang/CIR/Dialect/IR/CIRDialect.h"
2928#include " clang/CIR/MissingFeatures.h"
3029#include " clang/CIR/Passes.h"
30+ #include " llvm/ADT/TypeSwitch.h"
3131#include " llvm/IR/Module.h"
3232#include " llvm/Support/TimeProfiler.h"
3333
@@ -37,7 +37,7 @@ using namespace llvm;
3737namespace cir {
3838namespace direct {
3939
40- class CIRAttrToValue : public CirAttrVisitor <CIRAttrToValue, mlir::Value> {
40+ class CIRAttrToValue {
4141public:
4242 CIRAttrToValue (mlir::Operation *parentOp,
4343 mlir::ConversionPatternRewriter &rewriter,
@@ -46,19 +46,26 @@ class CIRAttrToValue : public CirAttrVisitor<CIRAttrToValue, mlir::Value> {
4646
4747 mlir::Value lowerCirAttrAsValue (mlir::Attribute attr) { return visit (attr); }
4848
49- mlir::Value visitCirIntAttr (cir::IntAttr intAttr) {
49+ mlir::Value visit (mlir::Attribute attr) {
50+ return llvm::TypeSwitch<mlir::Attribute, mlir::Value>(attr)
51+ .Case <cir::IntAttr, cir::FPAttr, cir::ConstPtrAttr>(
52+ [&](auto attrT) { return visitCirAttr (attrT); })
53+ .Default ([&](auto attrT) { return mlir::Value (); });
54+ }
55+
56+ mlir::Value visitCirAttr (cir::IntAttr intAttr) {
5057 mlir::Location loc = parentOp->getLoc ();
5158 return rewriter.create <mlir::LLVM::ConstantOp>(
5259 loc, converter->convertType (intAttr.getType ()), intAttr.getValue ());
5360 }
5461
55- mlir::Value visitCirFPAttr (cir::FPAttr fltAttr) {
62+ mlir::Value visitCirAttr (cir::FPAttr fltAttr) {
5663 mlir::Location loc = parentOp->getLoc ();
5764 return rewriter.create <mlir::LLVM::ConstantOp>(
5865 loc, converter->convertType (fltAttr.getType ()), fltAttr.getValue ());
5966 }
6067
61- mlir::Value visitCirConstPtrAttr (cir::ConstPtrAttr ptrAttr) {
68+ mlir::Value visitCirAttr (cir::ConstPtrAttr ptrAttr) {
6269 mlir::Location loc = parentOp->getLoc ();
6370 if (ptrAttr.isNullValue ()) {
6471 return rewriter.create <mlir::LLVM::ZeroOp>(
@@ -81,19 +88,25 @@ class CIRAttrToValue : public CirAttrVisitor<CIRAttrToValue, mlir::Value> {
8188
8289// This class handles rewriting initializer attributes for types that do not
8390// require region initialization.
84- class GlobalInitAttrRewriter
85- : public CirAttrVisitor<GlobalInitAttrRewriter, mlir::Attribute> {
91+ class GlobalInitAttrRewriter {
8692public:
8793 GlobalInitAttrRewriter (mlir::Type type,
8894 mlir::ConversionPatternRewriter &rewriter)
8995 : llvmType(type), rewriter(rewriter) {}
9096
9197 mlir::Attribute rewriteInitAttr (mlir::Attribute attr) { return visit (attr); }
9298
93- mlir::Attribute visitCirIntAttr (cir::IntAttr attr) {
99+ mlir::Attribute visit (mlir::Attribute attr) {
100+ return llvm::TypeSwitch<mlir::Attribute, mlir::Attribute>(attr)
101+ .Case <cir::IntAttr, cir::FPAttr>(
102+ [&](auto attrT) { return visitCirAttr (attrT); })
103+ .Default ([&](auto attrT) { return mlir::Attribute (); });
104+ }
105+
106+ mlir::Attribute visitCirAttr (cir::IntAttr attr) {
94107 return rewriter.getIntegerAttr (llvmType, attr.getValue ());
95108 }
96- mlir::Attribute visitCirFPAttr (cir::FPAttr attr) {
109+ mlir::Attribute visitCirAttr (cir::FPAttr attr) {
97110 return rewriter.getFloatAttr (llvmType, attr.getValue ());
98111 }
99112
0 commit comments