[clang] 664fb3b - [CIR] Upstream Exceptions EHTypeIdOp (#172558)
via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 7 11:06:25 PST 2026
Author: Amr Hesham
Date: 2026-01-07T20:06:21+01:00
New Revision: 664fb3b61061a96e4e9c730bacd1de5b8ce3f669
URL: https://github.com/llvm/llvm-project/commit/664fb3b61061a96e4e9c730bacd1de5b8ce3f669
DIFF: https://github.com/llvm/llvm-project/commit/664fb3b61061a96e4e9c730bacd1de5b8ce3f669.diff
LOG: [CIR] Upstream Exceptions EHTypeIdOp (#172558)
Upstream the Exceptions EHTypeIdOp
Issue https://github.com/llvm/llvm-project/issues/154992
Added:
clang/test/CIR/IR/eh-type-id.cir
clang/test/CIR/IR/invalid-eh-type-id.cir
clang/test/CIR/Lowering/eh-type-id.cir
Modified:
clang/include/clang/CIR/Dialect/IR/CIROps.td
clang/lib/CIR/Dialect/IR/CIRDialect.cpp
clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
Removed:
################################################################################
diff --git a/clang/include/clang/CIR/Dialect/IR/CIROps.td b/clang/include/clang/CIR/Dialect/IR/CIROps.td
index 8358b076ee7b6..4274ed25542b1 100644
--- a/clang/include/clang/CIR/Dialect/IR/CIROps.td
+++ b/clang/include/clang/CIR/Dialect/IR/CIROps.td
@@ -5519,6 +5519,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 its 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 8f0dc705181e6..e1df5d5185a04 100644
--- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
+++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp
@@ -3508,6 +3508,19 @@ static mlir::ParseResult parseTryHandlerRegions(
return mlir::success();
}
+//===----------------------------------------------------------------------===//
+// EhTypeIdOp
+//===----------------------------------------------------------------------===//
+
+LogicalResult
+cir::EhTypeIdOp::verifySymbolUses(SymbolTableCollection &symbolTable) {
+ Operation *op = symbolTable.lookupNearestSymbolFrom(*this, getTypeSymAttr());
+ if (!isa_and_nonnull<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 7686add38250e..cbd4550056c51 100644
--- a/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
+++ b/clang/lib/CIR/Lowering/DirectToLLVM/LowerToLLVM.cpp
@@ -3470,6 +3470,18 @@ mlir::LogicalResult CIRToLLVMResumeFlatOpLowering::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());
+ rewriter.replaceOpWithNewOp<mlir::LLVM::EhTypeidForOp>(
+ op, rewriter.getI32Type(), addrOp);
+ 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/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 at +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
new file mode 100644
index 0000000000000..ada9f22f86a72
--- /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.intr.eh.typeid.for %[[GV_ADDR_OF]] : (!llvm.ptr) -> i32
+// CHECK: llvm.return
+// CHECK: }
+
+}
+
More information about the cfe-commits
mailing list