================
@@ -550,9 +550,84 @@ mlir::Value
CIRAttrToValue::visitCirAttr(cir::ConstArrayAttr attr) {
return result;
}
+// Figure out if we want mark the new struct 'packed' if it isn't already. IF
+// it is already, we have to keep that behavior. We pack it with logic similar
+// to classic codegen, though will end up missing cases, since we don't want to
+// change the type other than the FAM.
+// We can do so if:
+// 1- Packing it won't change any of the field offsets.
+// 2- the non-padded struct would add padding beyond the
+// flexible array member. We don't pack if the flexible array member manages
+// to not cause trailing padding.
+static bool shouldPackFAMStruct(const mlir::DataLayout &dataLayout,
+ llvm::ArrayRef<mlir::Type> members) {
+ uint64_t maxAlign = 1;
+ uint64_t totalSize = 0;
+ for (mlir::Type member : members) {
+ uint64_t align = dataLayout.getTypeABIAlignment(member);
+ maxAlign = std::max(maxAlign, align);
+ uint64_t size = dataLayout.getTypeSize(member).getFixedValue();
+
+ if (llvm::alignTo(totalSize, align) != totalSize)
+ return false;
+
+ totalSize += size;
+ }
+ return llvm::alignTo(totalSize, maxAlign) != totalSize;
+}
+
+// CIR supports flexible-array-members in its struct types. That is, a
----------------
andykaylor wrote:
Looks good!
https://github.com/llvm/llvm-project/pull/206564
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits