================
@@ -273,6 +273,204 @@ void CIRGenFunction::addCatchHandlerAttr(
}
}
+namespace {
+/// From traditional LLVM, useful info for LLVM lowering support:
+/// A cleanup to call __cxa_end_catch. In many cases, the caught
+/// exception type lets us state definitively that the thrown exception
+/// type does not have a destructor. In particular:
+/// - Catch-alls tell us nothing, so we have to conservatively
+/// assume that the thrown exception might have a destructor.
+/// - Catches by reference behave according to their base types.
+/// - Catches of non-record types will only trigger for exceptions
+/// of non-record types, which never have destructors.
+/// - Catches of record types can trigger for arbitrary subclasses
+/// of the caught type, so we have to assume the actual thrown
+/// exception type might have a throwing destructor, even if the
+/// caught type's destructor is trivial or nothrow.
+struct CallEndCatch final : EHScopeStack::Cleanup {
+ CallEndCatch(bool mightThrow, mlir::Value catchToken)
+ : mightThrow(mightThrow), catchToken(catchToken) {}
+ bool mightThrow;
+ mlir::Value catchToken;
+
+ void emit(CIRGenFunction &cgf, Flags flags) override {
+ // Traditional LLVM codegen would emit a call to __cxa_end_catch
+ // here. For CIR, just let it pass since the cleanup is going
+ // to be emitted on a later pass when lowering the catch region.
+ // CGF.EmitRuntimeCallOrTryCall(getEndCatchFn(CGF.CGM));
+ cir::EndCatchOp::create(cgf.getBuilder(), *cgf.currSrcLoc, catchToken);
+ cir::YieldOp::create(cgf.getBuilder(), *cgf.currSrcLoc);
+ }
+};
+} // namespace
+
+static mlir::Value
+callBeginCatch(CIRGenFunction &cgf, mlir::Value ehToken, mlir::Value exnPtr,
+ mlir::Type exnPtrTy, bool endMightThrow,
+ cir::BeginCatchKind kind = cir::BeginCatchKind::Default) {
+ auto catchTokenTy = cir::CatchTokenType::get(cgf.getBuilder().getContext());
+ auto beginCatch = cir::BeginCatchOp::create(
+ cgf.getBuilder(), cgf.getBuilder().getUnknownLoc(), catchTokenTy,
ehToken,
+ exnPtr, kind);
+
+ cgf.ehStack.pushCleanup<CallEndCatch>(
+ NormalAndEHCleanup,
+ endMightThrow && !cgf.cgm.getLangOpts().AssumeNothrowExceptionDtor,
+ beginCatch.getCatchToken());
+
+ return beginCatch.getExnPtr();
+}
+
+/// A "special initializer" callback for initializing a catch
+/// parameter during catch initialization.
+static void initCatchParam(CIRGenFunction &cgf, mlir::Value ehToken,
----------------
AmrDeveloper wrote:
I think the only CG part in this function is to emit begin catch op and some
NYIs. We can call emitBeginCatch directly, of course, but we need a way to keep
tracking NYIs(for example, the NYI's related to Ptr representation
ObjCLifetime), especially if we keep the current op definition.
https://github.com/llvm/llvm-project/pull/190612
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits