================
@@ -214,13 +256,26 @@ bool EHScopeStack::requiresCatchOrCleanup() const {
return false;
}
-static void emitCleanup(CIRGenFunction &cgf, EHScopeStack::Cleanup *cleanup,
+static void emitCleanup(CIRGenFunction &cgf, cir::CleanupScopeOp cleanupScope,
+ EHScopeStack::Cleanup *cleanup,
EHScopeStack::Cleanup::Flags flags) {
+ CIRGenBuilderTy &builder = cgf.getBuilder();
+ mlir::Block &block = cleanupScope.getCleanupRegion().back();
+
+ mlir::OpBuilder::InsertionGuard guard(builder);
+ builder.setInsertionPointToStart(&block);
+
// Ask the cleanup to emit itself.
assert(cgf.haveInsertPoint() && "expected insertion point");
assert(!cir::MissingFeatures::ehCleanupActiveFlag());
cleanup->emit(cgf, flags);
assert(cgf.haveInsertPoint() && "cleanup ended with no insertion point?");
+
+ if (block.empty() || !block.back().hasTrait<mlir::OpTrait::IsTerminator>()) {
----------------
andykaylor wrote:
This seems to be assuming that the emitted cleanup will have a single block.
That may be true in practice, but I'd like to see an assertion to guard that
assumption. It might be better to call `cleanupScope.getCleanupRegion().back()`
again here, in case the emitted cleanup created multiple blocks.
The one case I could think of that might create multiple blocks is the NRVO
cleanup, but I see that it is creating a `cir.if` statement rather than
branching, so I think a single region with a single block is something we can
expect.
https://github.com/llvm/llvm-project/pull/180276
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits