From b40e5785f9ace9c72038212224fb567a4a59b05b Mon Sep 17 00:00:00 2001 From: bruteforceboy Date: Mon, 17 Feb 2025 17:42:49 +0300 Subject: [PATCH 1/3] add yield fix --- clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp b/clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp index 4de62d46e5a5..5dbdfe1d2797 100644 --- a/clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp @@ -718,7 +718,8 @@ struct CallEndCatch final : EHScopeStack::Cleanup { // 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)); - CGF.getBuilder().create(*CGF.currSrcLoc); + if (!CGF.getBuilder().getBlock()->mightHaveTerminator()) + CGF.getBuilder().create(*CGF.currSrcLoc); } }; } // namespace From ddb209e304254c035944c8f099132e2807596dee Mon Sep 17 00:00:00 2001 From: bruteforceboy Date: Wed, 19 Feb 2025 16:57:24 +0300 Subject: [PATCH 2/3] add tests --- clang/test/CIR/CodeGen/try-catch.cpp | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/clang/test/CIR/CodeGen/try-catch.cpp b/clang/test/CIR/CodeGen/try-catch.cpp index 8945bc33b739..14bbaabcb680 100644 --- a/clang/test/CIR/CodeGen/try-catch.cpp +++ b/clang/test/CIR/CodeGen/try-catch.cpp @@ -104,4 +104,27 @@ unsigned long long tc4() { } return z; -} \ No newline at end of file +} + +struct S { + S() {}; + int a; +}; + +// CHECK: cir.func @_Z3tc5v() +void tc5() { + try { + S s; + } catch (...) { + tc5(); + } +} + +// CHECK: cir.try { +// CHECK: cir.call exception @_ZN1SC2Ev({{.*}}) : (!cir.ptr) -> () +// CHECK: cir.yield +// CHECK: } catch [type #cir.all { +// CHECK: {{.*}} = cir.catch_param -> !cir.ptr +// CHECK: cir.call exception @_Z3tc5v() : () -> () +// CHECK: cir.yield +// CHECK: }] From ad3fd55bedccea7fedd3a8b4d4644f069a68ee0a Mon Sep 17 00:00:00 2001 From: bruteforceboy Date: Thu, 20 Feb 2025 11:37:59 +0300 Subject: [PATCH 3/3] update prefix --- clang/test/CIR/CodeGen/try-catch.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/clang/test/CIR/CodeGen/try-catch.cpp b/clang/test/CIR/CodeGen/try-catch.cpp index 14bbaabcb680..0bcca60549b9 100644 --- a/clang/test/CIR/CodeGen/try-catch.cpp +++ b/clang/test/CIR/CodeGen/try-catch.cpp @@ -82,22 +82,22 @@ unsigned long long tc3() { return z; } -// CIR: cir.func @_Z3tc4v() +// CHECK: cir.func @_Z3tc4v() unsigned long long tc4() { int x = 50, y = 3; unsigned long long z; - // CIR-NOT: cir.try + // CHECK-NOT: cir.try try { int a = 4; a++; - // CIR: cir.scope { - // CIR: cir.alloca !s32i, !cir.ptr, ["a", init] - // CIR-NOT: cir.alloca !cir.ptr - // CIR: cir.const #cir.int<4> : !s32i - // CIR: cir.unary(inc, - // CIR: cir.store %11, %8 : !s32i, !cir.ptr + // CHECK: cir.scope { + // CHECK: cir.alloca !s32i, !cir.ptr, ["a", init] + // CHECK-NOT: cir.alloca !cir.ptr + // CHECK: cir.const #cir.int<4> : !s32i + // CHECK: cir.unary(inc, + // CHECK: cir.store %11, %8 : !s32i, !cir.ptr } catch (int idx) { z = 98; idx++;