Skip to content

Commit a3c126c

Browse files
committed
[CIR][LowerToLLVM] Exceptions: lower cir.eh.typeid
1 parent a4aa65b commit a3c126c

File tree

2 files changed

+26
-6
lines changed

2 files changed

+26
-6
lines changed

clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3560,6 +3560,25 @@ class CIRUndefOpLowering
35603560
}
35613561
};
35623562

3563+
class CIREhTypeIdOpLowering
3564+
: public mlir::OpConversionPattern<mlir::cir::EhTypeIdOp> {
3565+
public:
3566+
using OpConversionPattern<mlir::cir::EhTypeIdOp>::OpConversionPattern;
3567+
3568+
mlir::LogicalResult
3569+
matchAndRewrite(mlir::cir::EhTypeIdOp op, OpAdaptor adaptor,
3570+
mlir::ConversionPatternRewriter &rewriter) const override {
3571+
mlir::Value addrOp = rewriter.create<mlir::LLVM::AddressOfOp>(
3572+
op.getLoc(), mlir::LLVM::LLVMPointerType::get(rewriter.getContext()),
3573+
op.getTypeSymAttr());
3574+
mlir::LLVM::CallIntrinsicOp newOp = createCallLLVMIntrinsicOp(
3575+
rewriter, op.getLoc(), "llvm.eh.typeid.for.p0", rewriter.getI32Type(),
3576+
mlir::ValueRange{addrOp});
3577+
rewriter.replaceOp(op, newOp);
3578+
return mlir::success();
3579+
}
3580+
};
3581+
35633582
void populateCIRToLLVMConversionPatterns(mlir::RewritePatternSet &patterns,
35643583
mlir::TypeConverter &converter) {
35653584
patterns.add<CIRReturnLowering>(patterns.getContext());
@@ -3595,8 +3614,8 @@ void populateCIRToLLVMConversionPatterns(mlir::RewritePatternSet &patterns,
35953614
CIRRintOpLowering, CIRRoundOpLowering, CIRSinOpLowering,
35963615
CIRSqrtOpLowering, CIRTruncOpLowering, CIRCopysignOpLowering,
35973616
CIRFModOpLowering, CIRFMaxOpLowering, CIRFMinOpLowering, CIRPowOpLowering,
3598-
CIRClearCacheOpLowering, CIRUndefOpLowering>(converter,
3599-
patterns.getContext());
3617+
CIRClearCacheOpLowering, CIRUndefOpLowering, CIREhTypeIdOpLowering>(
3618+
converter, patterns.getContext());
36003619
}
36013620

36023621
namespace {

clang/test/CIR/Lowering/exceptions.cir

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,13 @@ module @"try-catch.cpp" attributes {cir.lang = #cir.lang<cxx>, cir.sob = #cir.si
5252
%exception_ptr, %type_id = cir.eh.inflight_exception [@_ZTIi, @_ZTIPKc]
5353
// LLVM: extractvalue { ptr, i32 } %[[EHINFO]], 0, !dbg !29
5454
// LLVM: extractvalue { ptr, i32 } %[[EHINFO]], 1, !dbg !29
55+
cir.br ^bb5(%exception_ptr, %type_id : !cir.ptr<!void>, !u32i)
56+
^bb5(%16: !cir.ptr<!void>, %17: !u32i):
57+
%18 = cir.eh.typeid @_ZTIi
58+
// LLVM: call i32 @llvm.eh.typeid.for.p0(ptr @_ZTIi)
59+
%19 = cir.cmp(eq, %17, %18) : !u32i, !cir.bool
5560
cir.br ^bb10
5661
// TODO: TBD
57-
// cir.br ^bb5(%exception_ptr, %type_id : !cir.ptr<!void>, !u32i)
58-
// ^bb5(%16: !cir.ptr<!void>, %17: !u32):
59-
// %18 = cir.eh.typeid @_ZTIi
60-
// %19 = cir.cmp(eq, %17, %18) : !u32i, !cir.bool
6162
// cir.brcond %19 ^bb6(%16 : !cir.ptr<!void>), ^bb7(%16, %17 : !cir.ptr<!void>, !u32i)
6263
// ^bb6(%20: !cir.ptr<!void>):
6364
// %21 = cir.catch_param begin %20 -> !cir.ptr<!s32i>

0 commit comments

Comments
 (0)