@@ -182,8 +182,8 @@ static bool AwaitSuspendStmtCanThrow(const Stmt *S) {
182
182
// auto && x = CommonExpr();
183
183
// if (!x.await_ready()) {
184
184
// llvm_coro_save();
185
- // llvm_coro_await_suspend(&x, frame, wrapper) (*)
186
- // llvm_coro_suspend(); (**)
185
+ // llvm_coro_await_suspend(&x, frame, wrapper) (*) (**)
186
+ // llvm_coro_suspend(); (*** )
187
187
// }
188
188
// x.await_resume();
189
189
//
@@ -202,11 +202,11 @@ static bool AwaitSuspendStmtCanThrow(const Stmt *S) {
202
202
// return awaiter.await_suspend(handle);
203
203
// }
204
204
//
205
- // If x.await_suspend return type is bool, it allows to veto a suspend:
205
+ // (**) If x.await_suspend return type is bool, it allows to veto a suspend:
206
206
// if (x.await_suspend(...))
207
207
// llvm_coro_suspend();
208
208
//
209
- // (**) llvm_coro_suspend() encodes three possible continuations as
209
+ // (*** ) llvm_coro_suspend() encodes three possible continuations as
210
210
// a switch instruction:
211
211
//
212
212
// %where-to = call i8 @llvm.coro.suspend(...)
@@ -250,14 +250,9 @@ static LValueOrRValue emitSuspendExpression(CodeGenFunction &CGF, CGCoroData &Co
250
250
auto *NullPtr = llvm::ConstantPointerNull::get (CGF.CGM .Int8PtrTy );
251
251
auto *SaveCall = Builder.CreateCall (CoroSave, {NullPtr});
252
252
253
- const auto AwaitSuspendCanThrow =
254
- AwaitSuspendStmtCanThrow (S.getSuspendExpr ());
255
-
256
253
auto SuspendWrapper = CodeGenFunction (CGF.CGM ).generateAwaitSuspendWrapper (
257
254
CGF.CurFn ->getName (), Prefix, S);
258
255
259
- llvm::CallBase *SuspendRet = nullptr ;
260
-
261
256
CGF.CurCoro .InSuspendBlock = true ;
262
257
263
258
assert (CGF.CurCoro .Data && CGF.CurCoro .Data ->CoroBegin &&
@@ -271,21 +266,26 @@ static LValueOrRValue emitSuspendExpression(CodeGenFunction &CGF, CGCoroData &Co
271
266
SuspendIntrinsicCallArgs.push_back (SuspendWrapper);
272
267
273
268
const auto SuspendReturnType = S.getSuspendReturnType ();
274
- llvm::Intrinsic::ID IID ;
269
+ llvm::Intrinsic::ID AwaitSuspendIID ;
275
270
276
271
switch (SuspendReturnType) {
277
- case CoroutineSuspendExpr::SuspendVoid:
278
- IID = llvm::Intrinsic::coro_await_suspend_void;
272
+ case CoroutineSuspendExpr::SuspendReturnType:: SuspendVoid:
273
+ AwaitSuspendIID = llvm::Intrinsic::coro_await_suspend_void;
279
274
break ;
280
- case CoroutineSuspendExpr::SuspendBool:
281
- IID = llvm::Intrinsic::coro_await_suspend_bool;
275
+ case CoroutineSuspendExpr::SuspendReturnType:: SuspendBool:
276
+ AwaitSuspendIID = llvm::Intrinsic::coro_await_suspend_bool;
282
277
break ;
283
- case CoroutineSuspendExpr::SuspendHandle:
284
- IID = llvm::Intrinsic::coro_await_suspend_handle;
278
+ case CoroutineSuspendExpr::SuspendReturnType:: SuspendHandle:
279
+ AwaitSuspendIID = llvm::Intrinsic::coro_await_suspend_handle;
285
280
break ;
286
281
}
287
282
288
- llvm::Function *AwaitSuspendIntrinsic = CGF.CGM .getIntrinsic (IID);
283
+ llvm::Function *AwaitSuspendIntrinsic = CGF.CGM .getIntrinsic (AwaitSuspendIID);
284
+
285
+ const auto AwaitSuspendCanThrow =
286
+ AwaitSuspendStmtCanThrow (S.getSuspendExpr ());
287
+
288
+ llvm::CallBase *SuspendRet = nullptr ;
289
289
// FIXME: add call attributes?
290
290
if (AwaitSuspendCanThrow)
291
291
SuspendRet =
@@ -298,10 +298,10 @@ static LValueOrRValue emitSuspendExpression(CodeGenFunction &CGF, CGCoroData &Co
298
298
CGF.CurCoro .InSuspendBlock = false ;
299
299
300
300
switch (SuspendReturnType) {
301
- case CoroutineSuspendExpr::SuspendVoid:
301
+ case CoroutineSuspendExpr::SuspendReturnType:: SuspendVoid:
302
302
assert (SuspendRet->getType ()->isVoidTy ());
303
303
break ;
304
- case CoroutineSuspendExpr::SuspendBool: {
304
+ case CoroutineSuspendExpr::SuspendReturnType:: SuspendBool: {
305
305
assert (SuspendRet->getType ()->isIntegerTy ());
306
306
307
307
// Veto suspension if requested by bool returning await_suspend.
@@ -311,7 +311,7 @@ static LValueOrRValue emitSuspendExpression(CodeGenFunction &CGF, CGCoroData &Co
311
311
CGF.EmitBlock (RealSuspendBlock);
312
312
break ;
313
313
}
314
- case CoroutineSuspendExpr::SuspendHandle: {
314
+ case CoroutineSuspendExpr::SuspendReturnType:: SuspendHandle: {
315
315
assert (SuspendRet->getType ()->isPointerTy ());
316
316
317
317
auto ResumeIntrinsic = CGF.CGM .getIntrinsic (llvm::Intrinsic::coro_resume);
0 commit comments