https://github.com/AmrDeveloper updated https://github.com/llvm/llvm-project/pull/172558
>From 84b60c3e49a23c3c99291032eb5a41df468e125b Mon Sep 17 00:00:00 2001 From: Amr Hesham <[email protected]> Date: Tue, 16 Dec 2025 22:12:58 +0100 Subject: [PATCH 1/2] [CIR] Upstream Exceptions EHTypeIdOp --- clang/include/clang/CIR/Dialect/IR/CIROps.td | 24 +++++++++++++++++++ clang/lib/CIR/Dialect/IR/CIRDialect.cpp | 13 ++++++++++ .../CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 14 +++++++++++ clang/test/CIR/IR/eh-type-id.cir | 22 +++++++++++++++++ clang/test/CIR/Lowering/eh-type-id.cir | 23 ++++++++++++++++++ 5 files changed, 96 insertions(+) create mode 100644 clang/test/CIR/IR/eh-type-id.cir create mode 100644 clang/test/CIR/Lowering/eh-type-id.cir diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td index 0e91d008dc52d..b12308dcaea82 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIROps.td +++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td @@ -5404,6 +5404,30 @@ def CIR_EhInflightOp : CIR_Op<"eh.inflight_exception"> { }]; } +//===----------------------------------------------------------------------===// +// Exception related: EhTypeIdOp +//===----------------------------------------------------------------------===// + +def CIR_EhTypeIdOp : CIR_Op<"eh.typeid", + [Pure, DeclareOpInterfaceMethods<SymbolUserOpInterface>]> { + let summary = "Compute exception type id from it's global type symbol"; + let description = [{ + Returns the exception type id for a given global symbol representing + a type. + + Example: + ```mlir + %type_id = cir.eh.typeid @_ZTIi + ``` + }]; + + let arguments = (ins FlatSymbolRefAttr:$type_sym); + let results = (outs CIR_UInt32:$type_id); + let assemblyFormat = [{ + $type_sym attr-dict + }]; +} + //===----------------------------------------------------------------------===// // Atomic operations //===----------------------------------------------------------------------===// diff --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp index 95fc3afffb156..9f4ebbeba97d6 100644 --- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp +++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp @@ -3488,6 +3488,19 @@ static mlir::ParseResult parseTryHandlerRegions( return mlir::success(); } +//===----------------------------------------------------------------------===// +// EhTypeIdOp +//===----------------------------------------------------------------------===// + +LogicalResult +cir::EhTypeIdOp::verifySymbolUses(SymbolTableCollection &symbolTable) { + Operation *op = symbolTable.lookupNearestSymbolFrom(*this, getTypeSymAttr()); + if (!isa<GlobalOp>(op)) + return emitOpError("'") + << getTypeSym() << "' does not reference a valid cir.global"; + return success(); +} + //===----------------------------------------------------------------------===// // TableGen'd op method definitions //===----------------------------------------------------------------------===// diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index 7d854997848aa..056c44ff25d4b 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -3418,6 +3418,20 @@ mlir::LogicalResult CIRToLLVMEhInflightOpLowering::matchAndRewrite( return mlir::success(); } +mlir::LogicalResult CIRToLLVMEhTypeIdOpLowering::matchAndRewrite( + cir::EhTypeIdOp op, OpAdaptor adaptor, + mlir::ConversionPatternRewriter &rewriter) const { + mlir::Value addrOp = mlir::LLVM::AddressOfOp::create( + rewriter, op.getLoc(), + mlir::LLVM::LLVMPointerType::get(rewriter.getContext()), + op.getTypeSymAttr()); + mlir::LLVM::CallIntrinsicOp newOp = createCallLLVMIntrinsicOp( + rewriter, op.getLoc(), "llvm.eh.typeid.for.p0", rewriter.getI32Type(), + mlir::ValueRange{addrOp}); + rewriter.replaceOp(op, newOp); + return mlir::success(); +} + mlir::LogicalResult CIRToLLVMTrapOpLowering::matchAndRewrite( cir::TrapOp op, OpAdaptor adaptor, mlir::ConversionPatternRewriter &rewriter) const { diff --git a/clang/test/CIR/IR/eh-type-id.cir b/clang/test/CIR/IR/eh-type-id.cir new file mode 100644 index 0000000000000..d9acfa96b6230 --- /dev/null +++ b/clang/test/CIR/IR/eh-type-id.cir @@ -0,0 +1,22 @@ +// RUN: cir-opt %s --verify-roundtrip | FileCheck %s + +!u32i = !cir.int<u, 32> +!u8i = !cir.int<u, 8> +!void = !cir.void + +module { + +cir.global "private" constant external @_ZTIi : !cir.ptr<!u8i> + +cir.func private @exception_handling_type_id() { + %type_id = cir.eh.typeid @_ZTIi + cir.return +} + +// CHECK: cir.func private @exception_handling_type_id() { +// CHECK: %[[TYPE_ID:.*]] = cir.eh.typeid @_ZTIi +// CHECK: cir.return +// CHECK: } + +} + diff --git a/clang/test/CIR/Lowering/eh-type-id.cir b/clang/test/CIR/Lowering/eh-type-id.cir new file mode 100644 index 0000000000000..84a39a9860f4a --- /dev/null +++ b/clang/test/CIR/Lowering/eh-type-id.cir @@ -0,0 +1,23 @@ +// RUN: cir-opt %s -cir-to-llvm -o %t.cir + +!u32i = !cir.int<u, 32> +!u8i = !cir.int<u, 8> +!void = !cir.void + +module { + +cir.global "private" constant external @_ZTIi : !cir.ptr<!u8i> + +cir.func private @exception_handling_type_id() { + %type_id = cir.eh.typeid @_ZTIi + cir.return +} + +// CHECK: llvm.func @exception_handling_type_id() attributes {sym_visibility = "private"} { +// CHECK: %[[GV_ADDR_OF:.*]] = llvm.mlir.addressof @_ZTIi : !llvm.ptr +// CHECK: %[[TYPE_ID:.*]] = llvm.call_intrinsic "llvm.eh.typeid.for.p0"(%[[GV_ADDR_OF]]) : (!llvm.ptr) -> i32 +// CHECK: llvm.return +// CHECK: } + +} + >From 2528f98020defef1a5c51baef7528f85cfeb75c8 Mon Sep 17 00:00:00 2001 From: Amr Hesham <[email protected]> Date: Wed, 17 Dec 2025 20:44:24 +0100 Subject: [PATCH 2/2] Address code review comments --- clang/include/clang/CIR/Dialect/IR/CIROps.td | 2 +- clang/lib/CIR/Dialect/IR/CIRDialect.cpp | 2 +- .../CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp | 6 ++---- clang/test/CIR/IR/invalid-eh-type-id.cir | 16 ++++++++++++++++ clang/test/CIR/Lowering/eh-type-id.cir | 2 +- 5 files changed, 21 insertions(+), 7 deletions(-) create mode 100644 clang/test/CIR/IR/invalid-eh-type-id.cir diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td index b12308dcaea82..c0bf9715e6d19 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIROps.td +++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td @@ -5410,7 +5410,7 @@ def CIR_EhInflightOp : CIR_Op<"eh.inflight_exception"> { def CIR_EhTypeIdOp : CIR_Op<"eh.typeid", [Pure, DeclareOpInterfaceMethods<SymbolUserOpInterface>]> { - let summary = "Compute exception type id from it's global type symbol"; + let summary = "Compute exception type id from its global type symbol"; let description = [{ Returns the exception type id for a given global symbol representing a type. diff --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp index 9f4ebbeba97d6..bd4f2c90caba8 100644 --- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp +++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp @@ -3495,7 +3495,7 @@ static mlir::ParseResult parseTryHandlerRegions( LogicalResult cir::EhTypeIdOp::verifySymbolUses(SymbolTableCollection &symbolTable) { Operation *op = symbolTable.lookupNearestSymbolFrom(*this, getTypeSymAttr()); - if (!isa<GlobalOp>(op)) + if (!isa_and_nonnull<GlobalOp>(op)) return emitOpError("'") << getTypeSym() << "' does not reference a valid cir.global"; return success(); diff --git a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp index 056c44ff25d4b..7ccd14ce8de3d 100644 --- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp +++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp @@ -3425,10 +3425,8 @@ mlir::LogicalResult CIRToLLVMEhTypeIdOpLowering::matchAndRewrite( rewriter, op.getLoc(), mlir::LLVM::LLVMPointerType::get(rewriter.getContext()), op.getTypeSymAttr()); - mlir::LLVM::CallIntrinsicOp newOp = createCallLLVMIntrinsicOp( - rewriter, op.getLoc(), "llvm.eh.typeid.for.p0", rewriter.getI32Type(), - mlir::ValueRange{addrOp}); - rewriter.replaceOp(op, newOp); + rewriter.replaceOpWithNewOp<mlir::LLVM::EhTypeidForOp>( + op, rewriter.getI32Type(), addrOp); return mlir::success(); } diff --git a/clang/test/CIR/IR/invalid-eh-type-id.cir b/clang/test/CIR/IR/invalid-eh-type-id.cir new file mode 100644 index 0000000000000..9c90af45dffef --- /dev/null +++ b/clang/test/CIR/IR/invalid-eh-type-id.cir @@ -0,0 +1,16 @@ +// RUN: cir-opt %s -verify-diagnostics -split-input-file + +!u32i = !cir.int<u, 32> +!u8i = !cir.int<u, 8> +!void = !cir.void + +module { + +cir.func private @exception_handling_type_id() { + // expected-error@+1 {{'cir.eh.typeid' op '_ZTIi' does not reference a valid cir.global}} + %type_id = cir.eh.typeid @_ZTIi + cir.return +} + +} + diff --git a/clang/test/CIR/Lowering/eh-type-id.cir b/clang/test/CIR/Lowering/eh-type-id.cir index 84a39a9860f4a..ada9f22f86a72 100644 --- a/clang/test/CIR/Lowering/eh-type-id.cir +++ b/clang/test/CIR/Lowering/eh-type-id.cir @@ -15,7 +15,7 @@ cir.func private @exception_handling_type_id() { // CHECK: llvm.func @exception_handling_type_id() attributes {sym_visibility = "private"} { // CHECK: %[[GV_ADDR_OF:.*]] = llvm.mlir.addressof @_ZTIi : !llvm.ptr -// CHECK: %[[TYPE_ID:.*]] = llvm.call_intrinsic "llvm.eh.typeid.for.p0"(%[[GV_ADDR_OF]]) : (!llvm.ptr) -> i32 +// CHECK: %[[TYPE_ID:.*]] = llvm.intr.eh.typeid.for %[[GV_ADDR_OF]] : (!llvm.ptr) -> i32 // CHECK: llvm.return // CHECK: } _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
