24
24
#include " mlir/Target/LLVMIR/Dialect/LLVMIR/LLVMToLLVMIRTranslation.h"
25
25
#include " mlir/Target/LLVMIR/Export.h"
26
26
#include " mlir/Transforms/DialectConversion.h"
27
- #include " clang/CIR/Dialect/IR/CIRAttrVisitor.h"
28
27
#include " clang/CIR/Dialect/IR/CIRDialect.h"
29
28
#include " clang/CIR/MissingFeatures.h"
30
29
#include " clang/CIR/Passes.h"
30
+ #include " llvm/ADT/TypeSwitch.h"
31
31
#include " llvm/IR/Module.h"
32
32
#include " llvm/Support/TimeProfiler.h"
33
33
@@ -37,7 +37,7 @@ using namespace llvm;
37
37
namespace cir {
38
38
namespace direct {
39
39
40
- class CIRAttrToValue : public CirAttrVisitor <CIRAttrToValue, mlir::Value> {
40
+ class CIRAttrToValue {
41
41
public:
42
42
CIRAttrToValue (mlir::Operation *parentOp,
43
43
mlir::ConversionPatternRewriter &rewriter,
@@ -46,19 +46,26 @@ class CIRAttrToValue : public CirAttrVisitor<CIRAttrToValue, mlir::Value> {
46
46
47
47
mlir::Value lowerCirAttrAsValue (mlir::Attribute attr) { return visit (attr); }
48
48
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) {
50
57
mlir::Location loc = parentOp->getLoc ();
51
58
return rewriter.create <mlir::LLVM::ConstantOp>(
52
59
loc, converter->convertType (intAttr.getType ()), intAttr.getValue ());
53
60
}
54
61
55
- mlir::Value visitCirFPAttr (cir::FPAttr fltAttr) {
62
+ mlir::Value visitCirAttr (cir::FPAttr fltAttr) {
56
63
mlir::Location loc = parentOp->getLoc ();
57
64
return rewriter.create <mlir::LLVM::ConstantOp>(
58
65
loc, converter->convertType (fltAttr.getType ()), fltAttr.getValue ());
59
66
}
60
67
61
- mlir::Value visitCirConstPtrAttr (cir::ConstPtrAttr ptrAttr) {
68
+ mlir::Value visitCirAttr (cir::ConstPtrAttr ptrAttr) {
62
69
mlir::Location loc = parentOp->getLoc ();
63
70
if (ptrAttr.isNullValue ()) {
64
71
return rewriter.create <mlir::LLVM::ZeroOp>(
@@ -81,19 +88,25 @@ class CIRAttrToValue : public CirAttrVisitor<CIRAttrToValue, mlir::Value> {
81
88
82
89
// This class handles rewriting initializer attributes for types that do not
83
90
// require region initialization.
84
- class GlobalInitAttrRewriter
85
- : public CirAttrVisitor<GlobalInitAttrRewriter, mlir::Attribute> {
91
+ class GlobalInitAttrRewriter {
86
92
public:
87
93
GlobalInitAttrRewriter (mlir::Type type,
88
94
mlir::ConversionPatternRewriter &rewriter)
89
95
: llvmType(type), rewriter(rewriter) {}
90
96
91
97
mlir::Attribute rewriteInitAttr (mlir::Attribute attr) { return visit (attr); }
92
98
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) {
94
107
return rewriter.getIntegerAttr (llvmType, attr.getValue ());
95
108
}
96
- mlir::Attribute visitCirFPAttr (cir::FPAttr attr) {
109
+ mlir::Attribute visitCirAttr (cir::FPAttr attr) {
97
110
return rewriter.getFloatAttr (llvmType, attr.getValue ());
98
111
}
99
112
0 commit comments