================
@@ -16309,6 +16315,23 @@ tryEvaluateBuiltinObjectSize(const Expr *E, unsigned
Type, EvalInfo &Info) {
if (LVal.getLValueOffset().isNegative())
return 0;
+ // For __builtin_dynamic_object_size on a counted_by-annotated flexible
+ // array member, defer to IR generation (emitCountedBySize in CGBuiltin):
+ // its runtime computation uses the live 'count' field and is more accurate
+ // than the layout/initializer-derived size we'd produce here. Use the same
+ // findStructFieldAccess form-recognition CGBuiltin does, so we refuse to
+ // fold on exactly the shapes that path handles (and, importantly, *not*
+ // on '&af.fam' which designates the array-as-a-whole and stays on the
+ // layout-derived path to match GCC). Checked after the negative-offset
+ // early return above so that obviously out-of-bounds operands still fold
+ // to 0, preserving existing behavior.
+ if (IsDynamic) {
+ const auto *ME = dyn_cast_or_null<MemberExpr>(findStructFieldAccess(E));
+ const auto *FD = ME ? dyn_cast<FieldDecl>(ME->getMemberDecl()) : nullptr;
+ if (FD && FD->getType()->isCountAttributedType())
+ return std::nullopt;
----------------
efriedma-quic wrote:
In theory, we could try to constant-fold the load of the __counted_by field.
Not sure how useful that would be in practice.
https://github.com/llvm/llvm-project/pull/201161
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits