[clang] [CIR] Add coroutine cleanup handling and update co_return semantics (PR #189281)
via cfe-commits
cfe-commits at lists.llvm.org
Tue Apr 7 08:52:50 PDT 2026
================
@@ -4120,6 +4120,67 @@ def CIR_AwaitOp : CIR_Op<"await",[
let hasVerifier = 1;
}
+//===----------------------------------------------------------------------===//
+// CoroBody
+//===----------------------------------------------------------------------===//
+def CIR_CoroBodyOp : CIR_Op<"coro.body", [
+ DeclareOpInterfaceMethods<RegionBranchOpInterface, ["getSuccessorInputs"]>,
+ RecursivelySpeculatable, AutomaticAllocationScope, NoRegionArguments,
+ RecursiveMemoryEffects
+]> {
+ let summary = "Region containing the user-authored coroutine body";
+ let description = [{
+ The `cir.coro.body` operation models the region where the user-authored
+ coroutine code is emitted.
+
+ This operation serves as a structural boundary separating the coroutine
+ setup and teardown logic (e.g. initial suspend, final suspend, and cleanup)
+ from the user-provided statements inside the coroutine.
+
+ The body region contains the code corresponding to the original function
+ body, including `co_await` and `co_return` expressions. In particular,
+ `cir.co_return` operations inside this region mark coroutine exit points
+ and introduce structured control flow that transfers execution to the
+ final suspend point of the coroutine.
+ }];
+
+ let regions = (region AnyRegion:$bodyRegion);
+
+ let skipDefaultBuilders = 1;
+
+ let builders = [
+ OpBuilder<(ins "BuilderCallbackRef":$bodyBuilder)>
+ ];
+
+ let assemblyFormat = [{
+ $bodyRegion attr-dict
+ }];
+
+ let hasLLVMLowering = false;
+ let hasVerifier = 1;
+}
+
+//===----------------------------------------------------------------------===//
+// CoReturnOp
+//===----------------------------------------------------------------------===//
+
+def CIR_CoReturnOp : CIR_Op<"co_return", [
+ ReturnLike, Pure, Terminator
+]> {
+ let summary = "Coroutine return operation";
+ let description = [{
+ The `cir.co_return` operation models a coroutine return point inside a
+ `cir.coro.body` region.
+ This operation is expected to appear only within a `cir.coro.body` region.
----------------
Andres-Salamanca wrote:
Done
https://github.com/llvm/llvm-project/pull/189281
More information about the cfe-commits
mailing list