Skip to content

Commit d00c3a3

Browse files
committed
[CIR][CIRGen] Exceptions: unlock nested try/catch support
1 parent c947dc7 commit d00c3a3

File tree

2 files changed

+49
-16
lines changed

2 files changed

+49
-16
lines changed

clang/lib/CIR/CodeGen/CIRGenCleanup.cpp

Lines changed: 2 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -284,21 +284,8 @@ void CIRGenFunction::PopCleanupBlock(bool FallthroughIsBranchThrough) {
284284

285285
// Emit the EH cleanup if required.
286286
if (RequiresEHCleanup) {
287-
mlir::cir::TryOp tryOp = nullptr;
288-
if (CGM.globalOpContext) {
289-
SmallVector<mlir::cir::TryOp> trys;
290-
CGM.globalOpContext.walk(
291-
[&](mlir::cir::TryOp op) { trys.push_back(op); });
292-
assert(trys.size() == 1 && "unknow global initialization style");
293-
tryOp = trys[0];
294-
} else {
295-
SmallVector<mlir::cir::TryOp> trys;
296-
auto funcOp = dyn_cast<mlir::cir::FuncOp>(CurFn);
297-
funcOp.walk([&](mlir::cir::TryOp op) { trys.push_back(op); });
298-
assert(trys.size() == 1 && "nested or multiple try/catch NYI");
299-
tryOp = trys[0];
300-
}
301-
287+
mlir::cir::TryOp tryOp =
288+
ehEntry->getParentOp()->getParentOfType<mlir::cir::TryOp>();
302289
assert(tryOp && "expected available cir.try");
303290
auto *nextAction = getEHDispatchBlock(EHParent, tryOp);
304291
(void)nextAction;

clang/test/CIR/CodeGen/try-catch-dtors.cpp

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,4 +263,50 @@ void yo3(bool x) {
263263
// LLVM: call ptr @__cxa_begin_catch
264264
// LLVM: br label %[[RET]],
265265
// LLVM: [[RET]]:
266-
// LLVM: ret void
266+
// LLVM: ret void
267+
268+
void yo2(bool x) {
269+
int r = 1;
270+
try {
271+
Vec v1, v2;
272+
try {
273+
Vec v3, v4;
274+
} catch (...) {
275+
r++;
276+
}
277+
} catch (...) {
278+
r++;
279+
}
280+
}
281+
282+
// CIR: cir.scope {
283+
// CIR: %[[V1:.*]] = cir.alloca ![[VecTy]], !cir.ptr<![[VecTy]]>, ["v1"
284+
// CIR: %[[V2:.*]] = cir.alloca ![[VecTy]], !cir.ptr<![[VecTy]]>, ["v2"
285+
// CIR: cir.try {
286+
// CIR: cir.call exception @_ZN3VecC1Ev(%[[V1]]) : (!cir.ptr<![[VecTy]]>) -> ()
287+
// CIR: cir.call exception @_ZN3VecC1Ev(%[[V2]]) : (!cir.ptr<![[VecTy]]>) -> () cleanup {
288+
// CIR: cir.call @_ZN3VecD1Ev(%[[V1]]) : (!cir.ptr<![[VecTy]]>) -> ()
289+
// CIR: cir.yield
290+
// CIR: }
291+
// CIR: cir.scope {
292+
// CIR: %[[V3:.*]] = cir.alloca ![[VecTy]], !cir.ptr<![[VecTy]]>, ["v3"
293+
// CIR: %[[V4:.*]] = cir.alloca ![[VecTy]], !cir.ptr<![[VecTy]]>, ["v4"
294+
// CIR: cir.try {
295+
// CIR: cir.call exception @_ZN3VecC1Ev(%[[V3]]) : (!cir.ptr<![[VecTy]]>) -> ()
296+
// CIR: cir.call exception @_ZN3VecC1Ev(%[[V4]]) : (!cir.ptr<![[VecTy]]>) -> () cleanup {
297+
// CIR: cir.call @_ZN3VecD1Ev(%[[V3]]) : (!cir.ptr<![[VecTy]]>) -> ()
298+
// CIR: cir.yield
299+
// CIR: }
300+
// CIR: cir.call @_ZN3VecD1Ev(%[[V4]]) : (!cir.ptr<![[VecTy]]>) -> ()
301+
// CIR: cir.call @_ZN3VecD1Ev(%[[V3]]) : (!cir.ptr<![[VecTy]]>) -> ()
302+
// CIR: cir.yield
303+
// CIR: } catch [type #cir.all {
304+
// CIR: cir.catch_param -> !cir.ptr<!void>
305+
// CIR: }]
306+
// CIR: }
307+
// CIR: cir.call @_ZN3VecD1Ev(%[[V2]]) : (!cir.ptr<![[VecTy]]>) -> ()
308+
// CIR: cir.call @_ZN3VecD1Ev(%[[V1]]) : (!cir.ptr<![[VecTy]]>) -> ()
309+
// CIR: cir.yield
310+
// CIR: } catch [type #cir.all {
311+
// CIR: cir.catch_param -> !cir.ptr<!void>
312+
// CIR: }]

0 commit comments

Comments
 (0)