================
@@ -212,113 +228,84 @@ emitBodyAndFallthrough(CIRGenFunction &cgf, const
CoroutineBodyStmt &s,
return mlir::success();
}
-cir::CallOp CIRGenFunction::emitCoroIDBuiltinCall(mlir::Location loc,
- mlir::Value nullPtr) {
- cir::IntType int32Ty = builder.getUInt32Ty();
-
- const TargetInfo &ti = cgm.getASTContext().getTargetInfo();
- unsigned newAlign = ti.getNewAlign() / ti.getCharWidth();
+cir::CoroIntrinsicIdOp
+CIRGenFunction::emitCoroIDBuiltinCall(const CallExpr *e) {
+ mlir::Location loc = getLoc(e->getBeginLoc());
- mlir::Operation *builtin = cgm.getGlobalValue(cgm.builtinCoroId);
-
- cir::FuncOp fnOp;
- if (!builtin) {
- fnOp = cgm.createCIRBuiltinFunction(
- loc, cgm.builtinCoroId,
- cir::FuncType::get({int32Ty, voidPtrTy, voidPtrTy, voidPtrTy},
int32Ty),
- /*FD=*/nullptr);
- assert(fnOp && "should always succeed");
- } else {
- fnOp = cast<cir::FuncOp>(builtin);
+ llvm::SmallVector<mlir::Value, 4> args;
+ for (auto const *arg : e->arguments()) {
+ args.push_back(emitScalarExpr(arg));
}
-
- return builder.createCallOp(loc, fnOp,
- mlir::ValueRange{builder.getUInt32(newAlign,
loc),
- nullPtr, nullPtr, nullPtr});
+ auto coroId = cir::CoroIntrinsicIdOp::create(cgm.getBuilder(), loc, args);
+ createCoroData(*this, curCoro, coroId, e);
+ return coroId;
}
-cir::CallOp CIRGenFunction::emitCoroAllocBuiltinCall(mlir::Location loc) {
- cir::BoolType boolTy = builder.getBoolTy();
-
- mlir::Operation *builtin = cgm.getGlobalValue(cgm.builtinCoroAlloc);
-
- cir::FuncOp fnOp;
- if (!builtin) {
- fnOp = cgm.createCIRBuiltinFunction(loc, cgm.builtinCoroAlloc,
- cir::FuncType::get({uInt32Ty}, boolTy),
- /*fd=*/nullptr);
- assert(fnOp && "should always succeed");
- } else {
- fnOp = cast<cir::FuncOp>(builtin);
+cir::CoroIntrinsicAllocOp
+CIRGenFunction::emitCoroAllocBuiltinCall(const CallExpr *e) {
+ mlir::Location loc = getLoc(e->getBeginLoc());
+ if (!curCoro.data || !curCoro.data->coroId) {
+ cgm.error(e->getBeginLoc(), "this builtin expect that __builtin_coro_id
has"
+ " been used earlier in this function");
+ return {};
}
- return builder.createCallOp(
- loc, fnOp, mlir::ValueRange{curCoro.data->coroId.getResult()});
+ return cir::CoroIntrinsicAllocOp::create(
+ cgm.getBuilder(), loc,
+ mlir::ValueRange{curCoro.data->coroId.getResult()});
}
-cir::CallOp
-CIRGenFunction::emitCoroBeginBuiltinCall(mlir::Location loc,
- mlir::Value coroframeAddr) {
- mlir::Operation *builtin = cgm.getGlobalValue(cgm.builtinCoroBegin);
-
- cir::FuncOp fnOp;
- if (!builtin) {
- fnOp = cgm.createCIRBuiltinFunction(
- loc, cgm.builtinCoroBegin,
- cir::FuncType::get({uInt32Ty, voidPtrTy}, voidPtrTy),
- /*fd=*/nullptr);
- assert(fnOp && "should always succeed");
- } else {
- fnOp = cast<cir::FuncOp>(builtin);
- }
-
- return builder.createCallOp(
- loc, fnOp,
- mlir::ValueRange{curCoro.data->coroId.getResult(), coroframeAddr});
-}
+cir::CoroIntrinsicBeginOp
+CIRGenFunction::emitCoroBeginBuiltinCall(const CallExpr *e) {
-cir::CallOp CIRGenFunction::emitCoroEndBuiltinCall(mlir::Location loc,
- mlir::Value nullPtr) {
- cir::BoolType boolTy = builder.getBoolTy();
- mlir::Operation *builtin = cgm.getGlobalValue(cgm.builtinCoroEnd);
-
- cir::FuncOp fnOp;
- if (!builtin) {
- fnOp = cgm.createCIRBuiltinFunction(
- loc, cgm.builtinCoroEnd,
- cir::FuncType::get({voidPtrTy, boolTy}, boolTy),
- /*fd=*/nullptr);
- assert(fnOp && "should always succeed");
- } else {
- fnOp = cast<cir::FuncOp>(builtin);
+ mlir::Location loc = getLoc(e->getBeginLoc());
+ if (!curCoro.data || !curCoro.data->coroId) {
+ cgm.error(e->getBeginLoc(), "this builtin expect that __builtin_coro_id
has"
+ " been used earlier in this function");
+ return {};
+ }
+ llvm::SmallVector<mlir::Value, 2> args;
+ args.push_back(curCoro.data->coroId.getResult());
+ for (auto const *arg : e->arguments()) {
----------------
Andres-Salamanca wrote:
Done.
https://github.com/llvm/llvm-project/pull/211699
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits