Skip to content

Commit 22cd380

Browse files
authored
[CIR] ThrowOp with Complex type as Subexpr (llvm#163078)
Upstream support to throw Complex type with RTTI and update `getComdatAttr` to perform symtab lookup before adding new selector to comdat, to avoid generating duplicate symbol in comdat. Ref from FIR: https://github.com/llvm/clangir/blob/8c0951a3efbc6fec04312d36739771b2c840c8d2/flang/lib/Optimizer/CodeGen/CodeGen.cpp#L3281-L3283 Issue llvm#154992
1 parent cc25119 commit 22cd380

File tree

3 files changed

+33
-5
lines changed

3 files changed

+33
-5
lines changed

clang/lib/CIR/CodeGen/CIRGenItaniumCXXABI.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -939,8 +939,7 @@ const char *vTableClassNameForType(const CIRGenModule &cgm, const Type *ty) {
939939
case Type::Atomic:
940940
// FIXME: GCC treats block pointers as fundamental types?!
941941
case Type::BlockPointer:
942-
cgm.errorNYI("VTableClassNameForType: __fundamental_type_info");
943-
break;
942+
return "_ZTVN10__cxxabiv123__fundamental_type_infoE";
944943
case Type::ConstantArray:
945944
case Type::IncompleteArray:
946945
case Type::VariableArray:

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1793,12 +1793,20 @@ CIRToLLVMGlobalOpLowering::getComdatAttr(cir::GlobalOp &op,
17931793
if (!comdatOp) {
17941794
builder.setInsertionPointToStart(module.getBody());
17951795
comdatOp =
1796-
builder.create<mlir::LLVM::ComdatOp>(module.getLoc(), comdatName);
1796+
mlir::LLVM::ComdatOp::create(builder, module.getLoc(), comdatName);
1797+
}
1798+
1799+
if (auto comdatSelector = comdatOp.lookupSymbol<mlir::LLVM::ComdatSelectorOp>(
1800+
op.getSymName())) {
1801+
return mlir::SymbolRefAttr::get(
1802+
builder.getContext(), comdatName,
1803+
mlir::FlatSymbolRefAttr::get(comdatSelector.getSymNameAttr()));
17971804
}
17981805

17991806
builder.setInsertionPointToStart(&comdatOp.getBody().back());
1800-
auto selectorOp = builder.create<mlir::LLVM::ComdatSelectorOp>(
1801-
comdatOp.getLoc(), op.getSymName(), mlir::LLVM::comdat::Comdat::Any);
1807+
auto selectorOp = mlir::LLVM::ComdatSelectorOp::create(
1808+
builder, comdatOp.getLoc(), op.getSymName(),
1809+
mlir::LLVM::comdat::Comdat::Any);
18021810
return mlir::SymbolRefAttr::get(
18031811
builder.getContext(), comdatName,
18041812
mlir::FlatSymbolRefAttr::get(selectorOp.getSymNameAttr()));

clang/test/CIR/CodeGen/throws.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,3 +123,24 @@ void paren_expr() { (throw 0, 1 + 2); }
123123
// OGCG: %[[EXCEPTION_ADDR:.*]] = call ptr @__cxa_allocate_exception(i64 4)
124124
// OGCG: store i32 0, ptr %[[EXCEPTION_ADDR]], align 16
125125
// OGCG: call void @__cxa_throw(ptr %[[EXCEPTION_ADDR]], ptr @_ZTIi, ptr null)
126+
127+
void throw_complex_expr() {
128+
throw __builtin_complex(1.1f, 2.2f);
129+
}
130+
131+
// CIR: %[[EXCEPTION_ADDR:.*]] = cir.alloc.exception 8 -> !cir.ptr<!cir.complex<!cir.float>>
132+
// CIR: %[[EXCEPTION_VALUE:.*]] = cir.const #cir.const_complex<#cir.fp<1.100000e+00> : !cir.float, #cir.fp<2.200000e+00> : !cir.float> : !cir.complex<!cir.float>
133+
// CIR: cir.store{{.*}} %[[EXCEPTION_VALUE]], %[[EXCEPTION_ADDR]] : !cir.complex<!cir.float>, !cir.ptr<!cir.complex<!cir.float>>
134+
// CIR: cir.throw %[[EXCEPTION_ADDR]] : !cir.ptr<!cir.complex<!cir.float>>, @_ZTICf
135+
// CIR: cir.unreachable
136+
137+
// LLVM: %[[EXCEPTION_ADDR:.*]] = call ptr @__cxa_allocate_exception(i64 8)
138+
// LLVM: store { float, float } { float 0x3FF19999A0000000, float 0x40019999A0000000 }, ptr %[[EXCEPTION_ADDR]], align 16
139+
// LLVM: call void @__cxa_throw(ptr %[[EXCEPTION_ADDR]], ptr @_ZTICf, ptr null)
140+
141+
// OGCG: %[[EXCEPTION_ADDR:.*]] = call ptr @__cxa_allocate_exception(i64 8)
142+
// OGCG: %[[EXCEPTION_REAL:.*]] = getelementptr inbounds nuw { float, float }, ptr %[[EXCEPTION_ADDR]], i32 0, i32 0
143+
// OGCG: %[[EXCEPTION_IMAG:.*]] = getelementptr inbounds nuw { float, float }, ptr %[[EXCEPTION_ADDR]], i32 0, i32 1
144+
// OGCG: store float 0x3FF19999A0000000, ptr %[[EXCEPTION_REAL]], align 16
145+
// OGCG: store float 0x40019999A0000000, ptr %[[EXCEPTION_IMAG]], align 4
146+
// OGCG: call void @__cxa_throw(ptr %[[EXCEPTION_ADDR]], ptr @_ZTICf, ptr null)

0 commit comments

Comments
 (0)