[clang] [CIR] Upstream CIR Dialect TryOp with Catch Attrs (PR #162897)
Andy Kaylor via cfe-commits
cfe-commits at lists.llvm.org
Tue Oct 14 17:26:23 PDT 2025
================
@@ -4296,6 +4296,88 @@ def CIR_AllocExceptionOp : CIR_Op<"alloc.exception"> {
}];
}
+//===----------------------------------------------------------------------===//
+// TryOp
+//===----------------------------------------------------------------------===//
+
+def CIR_TryOp : CIR_Op<"try",[
+ DeclareOpInterfaceMethods<RegionBranchOpInterface>,
+ RecursivelySpeculatable, AutomaticAllocationScope, NoRegionArguments
+]> {
+ let summary = "C++ try block";
+ let description = [{
+ Holds the lexical scope of `try {}`. Note that resources used on catch
+ clauses are usually allocated in the same parent as `cir.try`.
+
+ `synthetic`: use `cir.try` to represent try/catches not originally
+ present in the source code. For example, a synthetic `cir.try` region
+ is created around the constructor call when `operator new` is used
+ so that the memory allocated will be freed if the constructor throws
+ an exception.
+
+ `cleanup`: indicates that there are cleanups that must be performed
+ when exiting the try region via exception, even if the exception is not
+ caught.
+
+ Example:
+
+ ```mlir
+ cir.try {
+ cir.call exception @function() : () -> ()
+ cir.yield
+ } catch [type #cir.global_view<@_ZTIPf> : !cir.ptr<!u8i>] {
+ ...
+ cir.yield
+ } unwind {
+ cir.resume
+ }
+ ```
+ }];
+
+ let arguments = (ins
+ UnitAttr:$synthetic,
+ UnitAttr:$cleanup,
+ CIR_GlobalViewOrCatchAllOrUnwindArrayAttr:$catch_types
+ );
+
+ let regions = (region
+ AnyRegion:$try_region,
+ VariadicRegion<MinSizedRegion<1>>:$handlers
+ );
+
+ let assemblyFormat = [{
+ (`synthetic` $synthetic^)?
+ (`cleanup` $cleanup^)?
+ $try_region
+ custom<CatchRegions>($handlers, $catch_types)
+ attr-dict
+ }];
+
+ let builders = [
+ OpBuilder<(ins
+ "llvm::function_ref<void(mlir::OpBuilder &, "
+ "mlir::Location)>":$tryBuilder,
+ "llvm::function_ref<void(mlir::OpBuilder &, mlir::Location, "
+ "mlir::OperationState &)>":$catchBuilder),
----------------
andykaylor wrote:
I feel like I'm splitting hairs at this point, but `catchBuilder` isn't quite right, is it?
https://github.com/llvm/llvm-project/pull/162897
More information about the cfe-commits
mailing list