llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang @llvm/pr-subscribers-clangir Author: Amr Hesham (AmrDeveloper) <details> <summary>Changes</summary> This change adds the basic support for ArrayType Issue #<!-- -->130197 --- Full diff: https://github.com/llvm/llvm-project/pull/130502.diff 7 Files Affected: - (modified) clang/include/clang/CIR/Dialect/IR/CIRAttrs.h (+4) - (modified) clang/include/clang/CIR/Dialect/IR/CIRTypes.td (+20-1) - (modified) clang/lib/CIR/CodeGen/CIRGenBuilder.h (+8) - (modified) clang/lib/CIR/CodeGen/CIRGenTypes.cpp (+12) - (modified) clang/lib/CIR/Dialect/IR/CIRDialect.cpp (+3) - (modified) clang/lib/CIR/Dialect/IR/CIRTypes.cpp (+16) - (added) clang/test/CIR/CodeGen/array.cpp (+12) ``````````diff diff --git a/clang/include/clang/CIR/Dialect/IR/CIRAttrs.h b/clang/include/clang/CIR/Dialect/IR/CIRAttrs.h index 438fb7d09608d..1451ea47c50c8 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIRAttrs.h +++ b/clang/include/clang/CIR/Dialect/IR/CIRAttrs.h @@ -30,6 +30,10 @@ class VarDecl; class RecordDecl; } // namespace clang +namespace cir { +class ArrayType; +} // namespace cir + #define GET_ATTRDEF_CLASSES #include "clang/CIR/Dialect/IR/CIROpsAttributes.h.inc" diff --git a/clang/include/clang/CIR/Dialect/IR/CIRTypes.td b/clang/include/clang/CIR/Dialect/IR/CIRTypes.td index a78e5eae08e33..b2bac643b62da 100644 --- a/clang/include/clang/CIR/Dialect/IR/CIRTypes.td +++ b/clang/include/clang/CIR/Dialect/IR/CIRTypes.td @@ -280,6 +280,25 @@ def CIR_BoolType : }]; } +//===----------------------------------------------------------------------===// +// ArrayType +//===----------------------------------------------------------------------===// + +def CIR_ArrayType : CIR_Type<"Array", "array", + [DeclareTypeInterfaceMethods<DataLayoutTypeInterface>]> { + + let summary = "CIR array type"; + let description = [{ + `CIR.array` represents C/C++ constant arrays. + }]; + + let parameters = (ins "mlir::Type":$eltType, "uint64_t":$size); + + let assemblyFormat = [{ + `<` $eltType `x` $size `>` + }]; +} + //===----------------------------------------------------------------------===// // FuncType //===----------------------------------------------------------------------===// @@ -386,7 +405,7 @@ def VoidPtr : Type< //===----------------------------------------------------------------------===// def CIR_AnyType : AnyTypeOf<[ - CIR_VoidType, CIR_BoolType, CIR_IntType, CIR_AnyFloat, CIR_PointerType, + CIR_VoidType, CIR_BoolType, CIR_ArrayType, CIR_IntType, CIR_AnyFloat, CIR_PointerType, CIR_FuncType ]>; diff --git a/clang/lib/CIR/CodeGen/CIRGenBuilder.h b/clang/lib/CIR/CodeGen/CIRGenBuilder.h index 01d56963883cc..250192ec254d1 100644 --- a/clang/lib/CIR/CodeGen/CIRGenBuilder.h +++ b/clang/lib/CIR/CodeGen/CIRGenBuilder.h @@ -33,6 +33,14 @@ class CIRGenBuilderTy : public cir::CIRBaseBuilderTy { llvm_unreachable("NYI: PPC double-double format for long double"); llvm_unreachable("Unsupported format for long double"); } + + bool isSized(mlir::Type ty) { + if (mlir::isa<cir::PointerType, cir::ArrayType, cir::BoolType, + cir::IntType>(ty)) + return true; + assert(0 && "Unimplemented size for type"); + return false; + } }; } // namespace clang::CIRGen diff --git a/clang/lib/CIR/CodeGen/CIRGenTypes.cpp b/clang/lib/CIR/CodeGen/CIRGenTypes.cpp index dcfaaedc2ef57..78e894dee0071 100644 --- a/clang/lib/CIR/CodeGen/CIRGenTypes.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenTypes.cpp @@ -202,6 +202,18 @@ mlir::Type CIRGenTypes::convertType(QualType type) { break; } + case Type::ConstantArray: { + const ConstantArrayType *arrTy = cast<ConstantArrayType>(ty); + mlir::Type elemTy = convertTypeForMem(arrTy->getElementType()); + + // FIXME: In LLVM, "lower arrays of undefined struct type to arrays of + // i8 just to have a concrete type". Not sure this makes sense in CIR yet. + assert(builder.isSized(elemTy) && "not implemented"); + resultType = cir::ArrayType::get(builder.getContext(), elemTy, + arrTy->getSize().getZExtValue()); + break; + } + case Type::FunctionNoProto: case Type::FunctionProto: resultType = convertFunctionTypeInternal(type); diff --git a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp index 5ad369b40cda1..1e078e2797270 100644 --- a/clang/lib/CIR/Dialect/IR/CIRDialect.cpp +++ b/clang/lib/CIR/Dialect/IR/CIRDialect.cpp @@ -166,6 +166,9 @@ static LogicalResult checkConstantTypes(mlir::Operation *op, mlir::Type opType, return success(); } + if (mlir::isa<cir::ArrayType>(opType)) + return success(); + assert(isa<TypedAttr>(attrType) && "What else could we be looking at here?"); return op->emitOpError("global with type ") << cast<TypedAttr>(attrType).getType() << " not yet supported"; diff --git a/clang/lib/CIR/Dialect/IR/CIRTypes.cpp b/clang/lib/CIR/Dialect/IR/CIRTypes.cpp index 8bdde54ad41f6..6291297492227 100644 --- a/clang/lib/CIR/Dialect/IR/CIRTypes.cpp +++ b/clang/lib/CIR/Dialect/IR/CIRTypes.cpp @@ -369,6 +369,22 @@ BoolType::getABIAlignment(const ::mlir::DataLayout &dataLayout, return 1; } +//===----------------------------------------------------------------------===// +// Definitions +//===----------------------------------------------------------------------===// + +llvm::TypeSize +ArrayType::getTypeSizeInBits(const ::mlir::DataLayout &dataLayout, + ::mlir::DataLayoutEntryListRef params) const { + return getSize() * dataLayout.getTypeSizeInBits(getEltType()); +} + +uint64_t +ArrayType::getABIAlignment(const ::mlir::DataLayout &dataLayout, + ::mlir::DataLayoutEntryListRef params) const { + return dataLayout.getTypeABIAlignment(getEltType()); +} + //===----------------------------------------------------------------------===// // PointerType Definitions //===----------------------------------------------------------------------===// diff --git a/clang/test/CIR/CodeGen/array.cpp b/clang/test/CIR/CodeGen/array.cpp new file mode 100644 index 0000000000000..3a5950ffe3d87 --- /dev/null +++ b/clang/test/CIR/CodeGen/array.cpp @@ -0,0 +1,12 @@ +// RUN: %clang_cc1 -std=c++20 -triple x86_64-unknown-linux-gnu -fclangir -emit-cir %s -o - 2>&1 | FileCheck %s + +int a[10]; +// CHECK: cir.global external @a : !cir.array<!cir.int<s, 32> x 10> + +extern int b[10]; +// CHECK: cir.global external @b : !cir.array<!cir.int<s, 32> x 10> + +void f() { + int c[10]; + // CHECK: %[[ARR:.*]] = cir.alloca !cir.array<!cir.int<s, 32> x 10>, !cir.ptr<!cir.array<!cir.int<s, 32> x 10>>, ["c"] +} `````````` </details> https://github.com/llvm/llvm-project/pull/130502 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits