================ @@ -21,20 +20,526 @@ #include "clang/AST/APValue.h" #include "clang/AST/ASTContext.h" #include "clang/AST/Attr.h" +#include "clang/AST/CharUnits.h" #include "clang/AST/OperationKinds.h" #include "clang/AST/RecordLayout.h" #include "clang/AST/StmtVisitor.h" #include "clang/Basic/Builtins.h" -#include "clang/Basic/Specifiers.h" #include "clang/CIR/Dialect/IR/CIRAttrs.h" #include "clang/CIR/Dialect/IR/CIRTypes.h" +#include "clang/CIR/MissingFeatures.h" #include "llvm/ADT/STLExtras.h" -#include "llvm/ADT/Sequence.h" #include "llvm/Support/ErrorHandling.h" +#include <iterator> using namespace clang; using namespace clang::CIRGen; +//===----------------------------------------------------------------------===// +// ConstantAggregateBuilder +//===----------------------------------------------------------------------===// + +namespace { +class ConstExprEmitter; + +static mlir::TypedAttr computePadding(CIRGenModule &cgm, CharUnits size) { + mlir::Type eltTy = cgm.UCharTy; + clang::CharUnits::QuantityType arSize = size.getQuantity(); + CIRGenBuilderTy &bld = cgm.getBuilder(); + if (size > CharUnits::One()) { + SmallVector<mlir::Attribute, 4> elts(arSize, cir::ZeroAttr::get(eltTy)); + return bld.getConstArray(mlir::ArrayAttr::get(bld.getContext(), elts), + cir::ArrayType::get(eltTy, arSize)); + } + + return cir::ZeroAttr::get(eltTy); +} + +static mlir::Attribute +emitArrayConstant(CIRGenModule &cgm, mlir::Type desiredType, + mlir::Type commonElementType, unsigned arrayBound, + SmallVectorImpl<mlir::TypedAttr> &elements, + mlir::TypedAttr filler); + +struct ConstantAggregateBuilderUtils { + CIRGenModule &cgm; + cir::CIRDataLayout dataLayout; + + ConstantAggregateBuilderUtils(CIRGenModule &cgm) + : cgm(cgm), dataLayout{cgm.getModule()} {} + + CharUnits getAlignment(const mlir::TypedAttr c) const { + return CharUnits::fromQuantity( + dataLayout.getAlignment(c.getType(), /*abiOrPref=*/true)); + } + + CharUnits getSize(mlir::Type ty) const { + return CharUnits::fromQuantity(dataLayout.getTypeAllocSize(ty)); + } + + CharUnits getSize(const mlir::TypedAttr c) const { + return getSize(c.getType()); + } + + mlir::TypedAttr getPadding(CharUnits size) const { + return computePadding(cgm, size); + } +}; + +/// Incremental builder for an mlir::TypedAttr holding a record or array +/// constant. +class ConstantAggregateBuilder : private ConstantAggregateBuilderUtils { + /// The elements of the constant. These two arrays must have the same size; + /// Offsets[i] describes the offset of Elems[i] within the constant. The ---------------- andykaylor wrote:
```suggestion /// offsets[i] describes the offset of elems[i] within the constant. The ``` https://github.com/llvm/llvm-project/pull/155663 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits