@@ -55,11 +55,160 @@ mlir::LogicalResult CIRGenFunction::emitStmt(const Stmt *s,
55
55
if (mlir::succeeded (emitSimpleStmt (s, useCurrentScope)))
56
56
return mlir::success ();
57
57
58
- // Only a subset of simple statements are supported at the moment. When more
59
- // kinds of statements are supported, a
60
- // switch (s->getStmtClass()) {
61
- // will be added here.
62
- return mlir::failure ();
58
+ switch (s->getStmtClass ()) {
59
+
60
+ #define STMT (Type, Base )
61
+ #define ABSTRACT_STMT (Op )
62
+ #define EXPR (Type, Base ) case Stmt::Type##Class:
63
+ #include " clang/AST/StmtNodes.inc"
64
+ {
65
+ // Remember the block we came in on.
66
+ mlir::Block *incoming = builder.getInsertionBlock ();
67
+ assert (incoming && " expression emission must have an insertion point" );
68
+
69
+ emitIgnoredExpr (cast<Expr>(s));
70
+
71
+ mlir::Block *outgoing = builder.getInsertionBlock ();
72
+ assert (outgoing && " expression emission cleared block!" );
73
+ return mlir::success ();
74
+ }
75
+
76
+ case Stmt::OMPScopeDirectiveClass:
77
+ case Stmt::OMPErrorDirectiveClass:
78
+ case Stmt::NoStmtClass:
79
+ case Stmt::CXXCatchStmtClass:
80
+ case Stmt::SEHExceptStmtClass:
81
+ case Stmt::SEHFinallyStmtClass:
82
+ case Stmt::MSDependentExistsStmtClass:
83
+ case Stmt::NullStmtClass:
84
+ case Stmt::CompoundStmtClass:
85
+ case Stmt::DeclStmtClass:
86
+ case Stmt::LabelStmtClass:
87
+ case Stmt::AttributedStmtClass:
88
+ case Stmt::GotoStmtClass:
89
+ case Stmt::BreakStmtClass:
90
+ case Stmt::ContinueStmtClass:
91
+ case Stmt::DefaultStmtClass:
92
+ case Stmt::CaseStmtClass:
93
+ case Stmt::SEHLeaveStmtClass:
94
+ case Stmt::SYCLKernelCallStmtClass:
95
+ case Stmt::IfStmtClass:
96
+ case Stmt::SwitchStmtClass:
97
+ case Stmt::ForStmtClass:
98
+ case Stmt::WhileStmtClass:
99
+ case Stmt::DoStmtClass:
100
+ case Stmt::CoroutineBodyStmtClass:
101
+ case Stmt::CoreturnStmtClass:
102
+ case Stmt::CXXTryStmtClass:
103
+ case Stmt::CXXForRangeStmtClass:
104
+ case Stmt::IndirectGotoStmtClass:
105
+ case Stmt::ReturnStmtClass:
106
+ case Stmt::GCCAsmStmtClass:
107
+ case Stmt::MSAsmStmtClass:
108
+ case Stmt::OMPParallelDirectiveClass:
109
+ case Stmt::OMPTaskwaitDirectiveClass:
110
+ case Stmt::OMPTaskyieldDirectiveClass:
111
+ case Stmt::OMPBarrierDirectiveClass:
112
+ case Stmt::CapturedStmtClass:
113
+ case Stmt::ObjCAtTryStmtClass:
114
+ case Stmt::ObjCAtThrowStmtClass:
115
+ case Stmt::ObjCAtSynchronizedStmtClass:
116
+ case Stmt::ObjCForCollectionStmtClass:
117
+ case Stmt::ObjCAutoreleasePoolStmtClass:
118
+ case Stmt::SEHTryStmtClass:
119
+ case Stmt::OMPMetaDirectiveClass:
120
+ case Stmt::OMPCanonicalLoopClass:
121
+ case Stmt::OMPSimdDirectiveClass:
122
+ case Stmt::OMPTileDirectiveClass:
123
+ case Stmt::OMPUnrollDirectiveClass:
124
+ case Stmt::OMPForDirectiveClass:
125
+ case Stmt::OMPForSimdDirectiveClass:
126
+ case Stmt::OMPSectionsDirectiveClass:
127
+ case Stmt::OMPSectionDirectiveClass:
128
+ case Stmt::OMPSingleDirectiveClass:
129
+ case Stmt::OMPMasterDirectiveClass:
130
+ case Stmt::OMPCriticalDirectiveClass:
131
+ case Stmt::OMPParallelForDirectiveClass:
132
+ case Stmt::OMPParallelForSimdDirectiveClass:
133
+ case Stmt::OMPParallelMasterDirectiveClass:
134
+ case Stmt::OMPParallelSectionsDirectiveClass:
135
+ case Stmt::OMPTaskDirectiveClass:
136
+ case Stmt::OMPTaskgroupDirectiveClass:
137
+ case Stmt::OMPFlushDirectiveClass:
138
+ case Stmt::OMPDepobjDirectiveClass:
139
+ case Stmt::OMPScanDirectiveClass:
140
+ case Stmt::OMPOrderedDirectiveClass:
141
+ case Stmt::OMPAtomicDirectiveClass:
142
+ case Stmt::OMPTargetDirectiveClass:
143
+ case Stmt::OMPTeamsDirectiveClass:
144
+ case Stmt::OMPCancellationPointDirectiveClass:
145
+ case Stmt::OMPCancelDirectiveClass:
146
+ case Stmt::OMPTargetDataDirectiveClass:
147
+ case Stmt::OMPTargetEnterDataDirectiveClass:
148
+ case Stmt::OMPTargetExitDataDirectiveClass:
149
+ case Stmt::OMPTargetParallelDirectiveClass:
150
+ case Stmt::OMPTargetParallelForDirectiveClass:
151
+ case Stmt::OMPTaskLoopDirectiveClass:
152
+ case Stmt::OMPTaskLoopSimdDirectiveClass:
153
+ case Stmt::OMPMaskedTaskLoopDirectiveClass:
154
+ case Stmt::OMPMaskedTaskLoopSimdDirectiveClass:
155
+ case Stmt::OMPMasterTaskLoopDirectiveClass:
156
+ case Stmt::OMPMasterTaskLoopSimdDirectiveClass:
157
+ case Stmt::OMPParallelGenericLoopDirectiveClass:
158
+ case Stmt::OMPParallelMaskedDirectiveClass:
159
+ case Stmt::OMPParallelMaskedTaskLoopDirectiveClass:
160
+ case Stmt::OMPParallelMaskedTaskLoopSimdDirectiveClass:
161
+ case Stmt::OMPParallelMasterTaskLoopDirectiveClass:
162
+ case Stmt::OMPParallelMasterTaskLoopSimdDirectiveClass:
163
+ case Stmt::OMPDistributeDirectiveClass:
164
+ case Stmt::OMPDistributeParallelForDirectiveClass:
165
+ case Stmt::OMPDistributeParallelForSimdDirectiveClass:
166
+ case Stmt::OMPDistributeSimdDirectiveClass:
167
+ case Stmt::OMPTargetParallelGenericLoopDirectiveClass:
168
+ case Stmt::OMPTargetParallelForSimdDirectiveClass:
169
+ case Stmt::OMPTargetSimdDirectiveClass:
170
+ case Stmt::OMPTargetTeamsGenericLoopDirectiveClass:
171
+ case Stmt::OMPTargetUpdateDirectiveClass:
172
+ case Stmt::OMPTeamsDistributeDirectiveClass:
173
+ case Stmt::OMPTeamsDistributeSimdDirectiveClass:
174
+ case Stmt::OMPTeamsDistributeParallelForSimdDirectiveClass:
175
+ case Stmt::OMPTeamsDistributeParallelForDirectiveClass:
176
+ case Stmt::OMPTeamsGenericLoopDirectiveClass:
177
+ case Stmt::OMPTargetTeamsDirectiveClass:
178
+ case Stmt::OMPTargetTeamsDistributeDirectiveClass:
179
+ case Stmt::OMPTargetTeamsDistributeParallelForDirectiveClass:
180
+ case Stmt::OMPTargetTeamsDistributeParallelForSimdDirectiveClass:
181
+ case Stmt::OMPTargetTeamsDistributeSimdDirectiveClass:
182
+ case Stmt::OMPInteropDirectiveClass:
183
+ case Stmt::OMPDispatchDirectiveClass:
184
+ case Stmt::OMPGenericLoopDirectiveClass:
185
+ case Stmt::OMPReverseDirectiveClass:
186
+ case Stmt::OMPInterchangeDirectiveClass:
187
+ case Stmt::OMPAssumeDirectiveClass:
188
+ case Stmt::OMPMaskedDirectiveClass:
189
+ case Stmt::OMPStripeDirectiveClass:
190
+ case Stmt::OpenACCComputeConstructClass:
191
+ case Stmt::OpenACCLoopConstructClass:
192
+ case Stmt::OpenACCCombinedConstructClass:
193
+ case Stmt::OpenACCDataConstructClass:
194
+ case Stmt::OpenACCEnterDataConstructClass:
195
+ case Stmt::OpenACCExitDataConstructClass:
196
+ case Stmt::OpenACCHostDataConstructClass:
197
+ case Stmt::OpenACCWaitConstructClass:
198
+ case Stmt::OpenACCInitConstructClass:
199
+ case Stmt::OpenACCShutdownConstructClass:
200
+ case Stmt::OpenACCSetConstructClass:
201
+ case Stmt::OpenACCUpdateConstructClass:
202
+ case Stmt::OpenACCCacheConstructClass:
203
+ case Stmt::OpenACCAtomicConstructClass:
204
+ case Stmt::ObjCAtCatchStmtClass:
205
+ case Stmt::ObjCAtFinallyStmtClass:
206
+ cgm.errorNYI (s->getSourceRange (),
207
+ std::string (" emitStmt: " ) + s->getStmtClassName ());
208
+ return mlir::failure ();
209
+ }
210
+
211
+ llvm_unreachable (" Unexpected statement class" );
63
212
}
64
213
65
214
mlir::LogicalResult CIRGenFunction::emitSimpleStmt (const Stmt *s,
@@ -106,16 +255,11 @@ mlir::LogicalResult CIRGenFunction::emitReturnStmt(const ReturnStmt &s) {
106
255
// this section will do nothing. But for now a ReturnOp is necessary.
107
256
builder.create <ReturnOp>(loc);
108
257
} else if (rv->getType ()->isVoidType ()) {
109
- // No return value. Emit the return expression for its side effects.
110
- // TODO(CIR): Once emitAnyExpr(e) has been upstreamed, get rid of the check
111
- // and just call emitAnyExpr(rv) here.
112
- if (CIRGenFunction::hasScalarEvaluationKind (rv->getType ())) {
113
- emitScalarExpr (rv);
114
- } else {
115
- getCIRGenModule ().errorNYI (s.getSourceRange (),
116
- " non-scalar function return type" );
258
+ // Make sure not to return anything, but evaluate the expression
259
+ // for side effects.
260
+ if (rv) {
261
+ emitAnyExpr (rv);
117
262
}
118
- builder.create <ReturnOp>(loc);
119
263
} else if (fnRetTy->isReferenceType ()) {
120
264
getCIRGenModule ().errorNYI (s.getSourceRange (),
121
265
" function return type that is a reference" );
0 commit comments