================ @@ -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)); ---------------- andykaylor wrote:
```suggestion dataLayout.getAlignment(c.getType(), /*useABIAlign=*/true)); ``` `abiOrPref=true` has a real "if you come to a fork in the road, take it" quality to it. Fortunately, the actual parameter name has more clarity. 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