[clang] [CIR] Upstream non-empty Try block with catch all (PR #165158)
Andy Kaylor via cfe-commits
cfe-commits at lists.llvm.org
Tue Nov 4 13:34:35 PST 2025
================
@@ -465,12 +465,48 @@ static cir::CIRCallOpInterface
emitCallLikeOp(CIRGenFunction &cgf, mlir::Location callLoc,
cir::FuncType indirectFuncTy, mlir::Value indirectFuncVal,
cir::FuncOp directFuncOp,
- const SmallVectorImpl<mlir::Value> &cirCallArgs,
+ const SmallVectorImpl<mlir::Value> &cirCallArgs, bool isInvoke,
const mlir::NamedAttrList &attrs) {
CIRGenBuilderTy &builder = cgf.getBuilder();
assert(!cir::MissingFeatures::opCallSurroundingTry());
- assert(!cir::MissingFeatures::invokeOp());
+
+ if (isInvoke) {
+ // This call can throw, few options:
+ // - If this call does not have an associated cir.try, use the
+ // one provided by InvokeDest,
+ // - User written try/catch clauses require calls to handle
+ // exceptions under cir.try.
----------------
andykaylor wrote:
This comment block seems somehow stale. In classic codegen, `InvokeDest` is a pointer to the basic block that is the unwind destination of the invoke instruction, and at [the time that this comment was written](https://github.com/llvm/clangir/commit/0430637465604548a9f569b2fb23da7a1fe1b863), `InvokeDest` was passed to this function as a pointer to an mlir operation, though as far as I can tell it was just a pointer to the try op.
Here's my best guess as to what the comment should say, based on the latest incubator implementation.
```suggestion
// This call may throw and requires catch and/or cleanup handling.
// If this call does not appear within the `try` region of an existing
// TryOp, we must create a synthetic TryOp to contain the call. This
// happens when a call that may throw appears within a cleanup
// scope.
```
https://github.com/llvm/llvm-project/pull/165158
More information about the cfe-commits
mailing list