================
@@ -1521,6 +1521,101 @@ ConstantEmitter::~ConstantEmitter() {
"not finalized after being initialized for non-abstract emission");
}
+static mlir::TypedAttr emitNullConstantForBase(CIRGenModule &cgm,
+ mlir::Type baseType,
+ const CXXRecordDecl *baseDecl);
+
+static mlir::TypedAttr emitNullConstant(CIRGenModule &cgm, const RecordDecl
*rd,
+ bool asCompleteObject) {
+ const CIRGenRecordLayout &layout = cgm.getTypes().getCIRGenRecordLayout(rd);
+ mlir::Type ty = (asCompleteObject ? layout.getCIRType()
+ : layout.getBaseSubobjectCIRType());
+ auto recordTy = cast<cir::RecordType>(ty);
+
+ unsigned numElements = recordTy.getNumElements();
+ SmallVector<mlir::Attribute> elements(numElements);
+
+ auto cxxrd = dyn_cast<CXXRecordDecl>(rd);
+ // Fill in all the bases.
+ if (cxxrd) {
+ for (const auto &base : cxxrd->bases()) {
+ if (base.isVirtual()) {
+ // Ignore virtual bases; if we're laying out for a complete
+ // object, we'll lay these out later.
+ continue;
+ }
+
+ const auto *baseDecl = base.getType()->castAsCXXRecordDecl();
+ // Ignore empty bases.
+ if (isEmptyRecordForLayout(cgm.getASTContext(), base.getType()) ||
+ cgm.getASTContext()
+ .getASTRecordLayout(baseDecl)
+ .getNonVirtualSize()
+ .isZero())
+ continue;
+
+ unsigned fieldIndex = layout.getNonVirtualBaseCIRFieldNo(baseDecl);
+ mlir::Type baseType = recordTy.getElementType(fieldIndex);
+ elements[fieldIndex] = emitNullConstantForBase(cgm, baseType, baseDecl);
+ }
+ }
+
+ // Fill in all the fields.
+ for (const auto *field : rd->fields()) {
+ // Fill in non-bitfields. (Bitfields always use a zero pattern, which we
+ // will fill in later.)
+ if (!field->isBitField() &&
+ !isEmptyFieldForLayout(cgm.getASTContext(), field)) {
+ unsigned fieldIndex = layout.getCIRFieldNo(field);
+ elements[fieldIndex] = cgm.emitNullConstantAttr(field->getType());
+ }
+
+ // For unions, stop after the first named field.
+ if (rd->isUnion()) {
+ if (field->getIdentifier())
+ break;
+ if (const auto *fieldRD = field->getType()->getAsRecordDecl())
+ if (fieldRD->findFirstNamedDataMember())
+ break;
+ }
+ }
+
+ // Fill in the virtual bases, if we're working with the complete object.
+ if (cxxrd && asCompleteObject) {
+ for ([[maybe_unused]] const auto &vbase : cxxrd->vbases()) {
----------------
erichkeane wrote:
```suggestion
for ([[maybe_unused]] const CXXBaseSpecifier &vbase : cxxrd->vbases()) {
```
https://github.com/llvm/llvm-project/pull/168646
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits