================ @@ -338,6 +386,85 @@ static QualType getCoroutineSuspendExprReturnType(const ASTContext &Ctx, } #endif +llvm::Function *CodeGenFunction::generateAwaitSuspendHelper( + Twine const &CoroName, Twine const &SuspendPointName, + CoroutineSuspendExpr const &S, bool CanThrow) { + std::string FuncName = "__await_suspend_helper_"; + FuncName += CoroName.str(); + FuncName += '_'; + FuncName += SuspendPointName.str(); + + ASTContext &C = getContext(); + + FunctionArgList args; + + ImplicitParamDecl AwaiterDecl(C, C.VoidPtrTy, ImplicitParamKind::Other); + ImplicitParamDecl FrameDecl(C, C.VoidPtrTy, ImplicitParamKind::Other); + QualType ReturnTy = S.getSuspendExpr()->getType(); + + if (ReturnTy->isBooleanType()) { + ReturnTy = C.BoolTy; + } else if (ReturnTy->isVoidPointerType()) { + ReturnTy = C.VoidPtrTy; + } else { + ReturnTy = C.VoidTy; + } + + args.push_back(&AwaiterDecl); + args.push_back(&FrameDecl); + + const CGFunctionInfo &FI = + CGM.getTypes().arrangeBuiltinFunctionDeclaration(ReturnTy, args); + + llvm::FunctionType *LTy = CGM.getTypes().GetFunctionType(FI); + + llvm::Function *Fn = llvm::Function::Create( + LTy, llvm::GlobalValue::PrivateLinkage, FuncName, &CGM.getModule()); + + Fn->addParamAttr(0, llvm::Attribute::AttrKind::NonNull); + Fn->addParamAttr(0, llvm::Attribute::AttrKind::NoUndef); + + Fn->addParamAttr(1, llvm::Attribute::AttrKind::NoUndef); + + Fn->setMustProgress(); + Fn->addFnAttr(llvm::Attribute::AttrKind::AlwaysInline); + + if (!CanThrow) { + Fn->addFnAttr(llvm::Attribute::AttrKind::NoUnwind); + } ---------------- ChuanqiXu9 wrote:
We don't need this. If I remember correctly, LLVM can add it automatically as long as the await_suspend is marked noexcept. https://github.com/llvm/llvm-project/pull/79712 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits