[clang] [llvm] [coroutine] Implement llvm.coro.await.suspend intrinsic (PR #79712)
Akira Hatanaka via cfe-commits
cfe-commits at lists.llvm.org
Thu Mar 28 23:54:39 PDT 2024
================
@@ -338,6 +409,69 @@ static QualType getCoroutineSuspendExprReturnType(const ASTContext &Ctx,
}
#endif
+llvm::Function *
+CodeGenFunction::generateAwaitSuspendWrapper(Twine const &CoroName,
+ Twine const &SuspendPointName,
+ CoroutineSuspendExpr const &S) {
+ std::string FuncName = "__await_suspend_wrapper_";
+ 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();
+
+ 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);
+
+ StartFunction(GlobalDecl(), ReturnTy, Fn, FI, args);
+
+ // FIXME: add TBAA metadata to the loads
+ llvm::Value *AwaiterPtr = Builder.CreateLoad(GetAddrOfLocalVar(&AwaiterDecl));
+ auto AwaiterLValue =
+ MakeNaturalAlignAddrLValue(AwaiterPtr, AwaiterDecl.getType());
----------------
ahatanak wrote:
I wonder whether the type passed to `MakeNaturalAlignAddrLValue` is correct. `AwaiterDecl.getType()` is `void *`, but shouldn't `S.getOpaqueValue()` be passed?
I think this was causing a libc++ test to crash when ubsan was enabled (see https://github.com/llvm/llvm-project/pull/86898).
`S.getOpaqueValue()` and `AwaiterLValue` are passed to `OpaqueValueMappingData::bind`. clang mis-compiles when the lvalue has a larger alignment than the type of `S.getOpaqueValue()`.
https://github.com/llvm/llvm-project/pull/79712/files#diff-da3676b91275038b801aabe1e10b6fdedfbe50b679eac152080c2a26fbd8ec7dR458
https://github.com/llvm/llvm-project/pull/79712
More information about the cfe-commits
mailing list