Author: Amr Hesham Date: 2025-06-18T21:47:50+02:00 New Revision: 67c52aacae2aa698eb1d31d81d2376bd77723d3a
URL: https://github.com/llvm/llvm-project/commit/67c52aacae2aa698eb1d31d81d2376bd77723d3a DIFF: https://github.com/llvm/llvm-project/commit/67c52aacae2aa698eb1d31d81d2376bd77723d3a.diff LOG: [CIR] Upstream support for IncompleteArrayType (#144138) This change adds the basic support for IncompleteArray Issue https://github.com/llvm/llvm-project/issues/130197 Added: Modified: clang/lib/CIR/CodeGen/CIRGenTypes.cpp clang/test/CIR/CodeGen/struct.c Removed: ################################################################################ diff --git a/clang/lib/CIR/CodeGen/CIRGenTypes.cpp b/clang/lib/CIR/CodeGen/CIRGenTypes.cpp index bab47924dd719..621eb66962bfb 100644 --- a/clang/lib/CIR/CodeGen/CIRGenTypes.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenTypes.cpp @@ -416,6 +416,22 @@ mlir::Type CIRGenTypes::convertType(QualType type) { break; } + case Type::IncompleteArray: { + const IncompleteArrayType *arrTy = cast<IncompleteArrayType>(ty); + if (arrTy->getIndexTypeCVRQualifiers() != 0) + cgm.errorNYI(SourceLocation(), "non trivial array types", type); + + mlir::Type elemTy = convertTypeForMem(arrTy->getElementType()); + // int X[] -> [0 x int], unless the element type is not sized. If it is + // unsized (e.g. an incomplete record) just use [0 x i8]. + if (!builder.isSized(elemTy)) { + elemTy = cgm.SInt8Ty; + } + + resultType = cir::ArrayType::get(elemTy, 0); + break; + } + case Type::ConstantArray: { const ConstantArrayType *arrTy = cast<ConstantArrayType>(ty); mlir::Type elemTy = convertTypeForMem(arrTy->getElementType()); diff --git a/clang/test/CIR/CodeGen/struct.c b/clang/test/CIR/CodeGen/struct.c index ed84edd97e5d0..b722b64eeb583 100644 --- a/clang/test/CIR/CodeGen/struct.c +++ b/clang/test/CIR/CodeGen/struct.c @@ -19,6 +19,7 @@ // CIR-DAG: !rec_CycleEnd = !cir.record<struct "CycleEnd" {!cir.ptr<!cir.record<struct "CycleStart" {!cir.ptr<!cir.record<struct "CycleMiddle" {!cir.ptr<!cir.record<struct "CycleEnd">>}>>}>>}> // CIR-DAG: !rec_CycleMiddle = !cir.record<struct "CycleMiddle" {!cir.ptr<!rec_CycleEnd>}> // CIR-DAG: !rec_CycleStart = !cir.record<struct "CycleStart" {!cir.ptr<!rec_CycleMiddle>}> +// CIR-DAG: !rec_IncompleteArray = !cir.record<struct "IncompleteArray" {!cir.array<!s32i x 0>}> // LLVM-DAG: %struct.CompleteS = type { i32, i8 } // LLVM-DAG: %struct.OuterS = type { %struct.InnerS, i32 } // LLVM-DAG: %struct.InnerS = type { i32, i8 } @@ -30,6 +31,7 @@ // LLVM-DAG: %struct.CycleStart = type { ptr } // LLVM-DAG: %struct.CycleMiddle = type { ptr } // LLVM-DAG: %struct.CycleEnd = type { ptr } +// LLVM-DAG: %struct.IncompleteArray = type { [0 x i32] } // OGCG-DAG: %struct.CompleteS = type { i32, i8 } // OGCG-DAG: %struct.OuterS = type { %struct.InnerS, i32 } // OGCG-DAG: %struct.InnerS = type { i32, i8 } @@ -41,6 +43,7 @@ // OGCG-DAG: %struct.CycleStart = type { ptr } // OGCG-DAG: %struct.CycleMiddle = type { ptr } // OGCG-DAG: %struct.CycleEnd = type { ptr } +// OGCG-DAG: %struct.IncompleteArray = type { [0 x i32] } struct CompleteS { int a; @@ -149,6 +152,16 @@ struct CycleEnd { // LLVM-DAG: @end = global %struct.CycleEnd zeroinitializer // OGCG-DAG: @end = global %struct.CycleEnd zeroinitializer +struct IncompleteArray { + int array[]; +} incomplete; + +// CIR: cir.global external @incomplete = #cir.zero : !rec_IncompleteArray + +// LLVM-DAG: global %struct.IncompleteArray zeroinitializer + +// OGCG-DAG: global %struct.IncompleteArray zeroinitializer + void f(void) { struct IncompleteS *p; } @@ -313,3 +326,4 @@ void f6(struct CycleStart *start) { // OGCG: %[[MIDDLE:.*]] = getelementptr inbounds nuw %struct.CycleStart, ptr %{{.*}}, i32 0, i32 0 // OGCG: %[[END:.*]] = getelementptr inbounds nuw %struct.CycleMiddle, ptr %{{.*}}, i32 0, i32 0 // OGCG: %[[START2:.*]] = getelementptr inbounds nuw %struct.CycleEnd, ptr %{{.*}}, i32 0, i32 0 + _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits