Skip to content

Commit 66b3f31

Browse files
bcardosolopeslanza
authored andcommitted
[CIR][LowerToLLVM] Exceptions: lower cir.eh.typeid
1 parent 0a7001d commit 66b3f31

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
@@ -3561,6 +3561,25 @@ class CIRUndefOpLowering
35613561
}
35623562
};
35633563

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

36033622
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)