https://github.com/AmrDeveloper created https://github.com/llvm/llvm-project/pull/143960
Update `isSized` function with the upstreamed types >From 60b5efc3cc213c9031ca28f94827289250916099 Mon Sep 17 00:00:00 2001 From: AmrDeveloper <am...@programmer.net> Date: Thu, 12 Jun 2025 21:59:29 +0200 Subject: [PATCH] [CIR] Update isSized with upstreamed types --- clang/lib/CIR/CodeGen/CIRGenBuilder.h | 4 ++-- clang/lib/CIR/CodeGen/CIRGenTypes.cpp | 13 +++++++++++-- clang/test/CIR/CodeGen/array.cpp | 23 +++++++++++++++++++++++ 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/clang/lib/CIR/CodeGen/CIRGenBuilder.h b/clang/lib/CIR/CodeGen/CIRGenBuilder.h index fb1a290c18fa2..0beb234168482 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuilder.h +++ b/clang/lib/CIR/CodeGen/CIRGenBuilder.h @@ -139,8 +139,8 @@ class CIRGenBuilderTy : public cir::CIRBaseBuilderTy { } bool isSized(mlir::Type ty) { - if (mlir::isa<cir::PointerType, cir::ArrayType, cir::BoolType, - cir::IntType>(ty)) + if (mlir::isa<cir::PointerType, cir::ArrayType, cir::BoolType, cir::IntType, + cir::CIRFPTypeInterface, cir::ComplexType, cir::RecordType>(ty)) return true; if (const auto vt = mlir::dyn_cast<cir::VectorType>(ty)) diff --git a/clang/lib/CIR/CodeGen/CIRGenTypes.cpp b/clang/lib/CIR/CodeGen/CIRGenTypes.cpp index eaba3dfd1105e..bab47924dd719 100644 --- a/clang/lib/CIR/CodeGen/CIRGenTypes.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenTypes.cpp @@ -419,6 +419,15 @@ mlir::Type CIRGenTypes::convertType(QualType type) { case Type::ConstantArray: { const ConstantArrayType *arrTy = cast<ConstantArrayType>(ty); mlir::Type elemTy = convertTypeForMem(arrTy->getElementType()); + + // TODO(CIR): In LLVM, "lower arrays of undefined struct type to arrays of + // i8 just to have a concrete type" + if (!builder.isSized(elemTy)) { + cgm.errorNYI(SourceLocation(), "arrays of undefined struct type", type); + resultType = cgm.UInt32Ty; + break; + } + resultType = cir::ArrayType::get(elemTy, arrTy->getSize().getZExtValue()); break; } @@ -432,8 +441,8 @@ mlir::Type CIRGenTypes::convertType(QualType type) { } case Type::Enum: { - const EnumDecl *ED = cast<EnumType>(ty)->getDecl(); - if (auto integerType = ED->getIntegerType(); !integerType.isNull()) + const EnumDecl *ed = cast<EnumType>(ty)->getDecl(); + if (auto integerType = ed->getIntegerType(); !integerType.isNull()) return convertType(integerType); // Return a placeholder 'i32' type. This can be changed later when the // type is defined (see UpdateCompletedType), but is likely to be the diff --git a/clang/test/CIR/CodeGen/array.cpp b/clang/test/CIR/CodeGen/array.cpp index 7b90c1682ec45..26e172a006451 100644 --- a/clang/test/CIR/CodeGen/array.cpp +++ b/clang/test/CIR/CodeGen/array.cpp @@ -473,3 +473,26 @@ void func10(int *a) { // OGCG: %[[ELE:.*]] = getelementptr inbounds i32, ptr %[[TMP_1]], i64 5 // OGCG: %[[TMP_2:.*]] = load i32, ptr %[[ELE]], align 4 // OGCG: store i32 %[[TMP_2]], ptr %[[INIT]], align 4 + +void func11() { int _Complex a[4]; } + +// CIR: %[[ARR:.*]] = cir.alloca !cir.array<!cir.complex<!s32i> x 4>, !cir.ptr<!cir.array<!cir.complex<!s32i> x 4>>, ["a"] + +// LLVM: %[[ARR:.*]] = alloca [4 x { i32, i32 }], i64 1, align 16 + +// OGCG: %[[ARR:.*]] = alloca [4 x { i32, i32 }], align 16 + +void func12() { + struct Point { + int x; + int y; + }; + + Point a[4]; +} + +// CIR: %[[ARR:.*]] = cir.alloca !cir.array<!rec_Point x 4>, !cir.ptr<!cir.array<!rec_Point x 4>>, ["a"] + +// LLVM: %[[ARR:.*]] = alloca [4 x %struct.Point], i64 1, align 16 + +// OGCG: %[[ARR:.*]] = alloca [4 x %struct.Point], align 16 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits