@@ -100,6 +100,25 @@ class FuncOpLowering : public OpConversionPattern<cxx::FuncOp> {
100
100
}
101
101
};
102
102
103
+ class GlobalOpLowering : public OpConversionPattern <cxx::GlobalOp> {
104
+ public:
105
+ using OpConversionPattern::OpConversionPattern;
106
+
107
+ auto matchAndRewrite (cxx::GlobalOp op, OpAdaptor adaptor,
108
+ ConversionPatternRewriter &rewriter) const
109
+ -> LogicalResult override {
110
+ auto typeConverter = getTypeConverter ();
111
+
112
+ auto elementType = getTypeConverter ()->convertType (op.getGlobalType ());
113
+
114
+ rewriter.replaceOpWithNewOp <LLVM::GlobalOp>(
115
+ op, elementType, op.getConstant (), LLVM::linkage::Linkage::Private,
116
+ op.getSymName (), adaptor.getValue ().value ());
117
+
118
+ return success ();
119
+ }
120
+ };
121
+
103
122
class ReturnOpLowering : public OpConversionPattern <cxx::ReturnOp> {
104
123
public:
105
124
using OpConversionPattern::OpConversionPattern;
@@ -145,6 +164,28 @@ class CallOpLowering : public OpConversionPattern<cxx::CallOp> {
145
164
}
146
165
};
147
166
167
+ class AddressOfOpLowering : public OpConversionPattern <cxx::AddressOfOp> {
168
+ public:
169
+ using OpConversionPattern::OpConversionPattern;
170
+
171
+ auto matchAndRewrite (cxx::AddressOfOp op, OpAdaptor adaptor,
172
+ ConversionPatternRewriter &rewriter) const
173
+ -> LogicalResult override {
174
+ auto typeConverter = getTypeConverter ();
175
+
176
+ auto resultType = typeConverter->convertType (op.getType ());
177
+ if (!resultType) {
178
+ return rewriter.notifyMatchFailure (op,
179
+ " failed to convert address of type" );
180
+ }
181
+
182
+ rewriter.replaceOpWithNewOp <LLVM::AddressOfOp>(op, resultType,
183
+ adaptor.getSymName ());
184
+
185
+ return success ();
186
+ }
187
+ };
188
+
148
189
class AllocaOpLowering : public OpConversionPattern <cxx::AllocaOp> {
149
190
public:
150
191
AllocaOpLowering (const TypeConverter &typeConverter,
@@ -461,7 +502,6 @@ class ArrayToPointerOpLowering
461
502
462
503
SmallVector<LLVM::GEPArg> indices;
463
504
464
- indices.push_back (0 );
465
505
indices.push_back (0 );
466
506
467
507
auto resultType = LLVM::LLVMPointerType::get (context);
@@ -1254,8 +1294,8 @@ void CxxToLLVMLoweringPass::runOnOperation() {
1254
1294
RewritePatternSet patterns (context);
1255
1295
1256
1296
// function operations
1257
- patterns.insert <FuncOpLowering, ReturnOpLowering, CallOpLowering>(
1258
- typeConverter, context);
1297
+ patterns.insert <FuncOpLowering, GlobalOpLowering, ReturnOpLowering,
1298
+ CallOpLowering, AddressOfOpLowering>( typeConverter, context);
1259
1299
1260
1300
// memory operations
1261
1301
DataLayout dataLayout{module };
0 commit comments