[prev in list] [next in list] [prev in thread] [next in thread]
List: cfe-commits
Subject: [clang] [CodeGen] Revamp counted_by calculations (PR #70606)
From: Bill Wendling via cfe-commits <cfe-commits () lists ! llvm ! org>
Date: 2023-10-31 22:55:55
Message-ID: 654185fb.170a0220.bd24d.4476 () mx ! google ! com
[Download RAW message or body]
================
@@ -859,53 +859,60 @@ CodeGenFunction::emitBuiltinObjectSize(const Expr *E, unsigned \
Type, }
if (IsDynamic) {
- LangOptions::StrictFlexArraysLevelKind StrictFlexArraysLevel =
- getLangOpts().getStrictFlexArraysLevel();
- const Expr *Base = E->IgnoreParenImpCasts();
-
- if (FieldDecl *FD = FindCountedByField(Base, StrictFlexArraysLevel)) {
- const auto *ME = dyn_cast<MemberExpr>(Base);
- llvm::Value *ObjectSize = nullptr;
-
- if (!ME) {
- const auto *DRE = dyn_cast<DeclRefExpr>(Base);
- ValueDecl *VD = nullptr;
-
- ObjectSize = ConstantInt::get(
- ResType,
- getContext().getTypeSize(DRE->getType()->getPointeeType()) / 8,
- true);
-
- if (auto *RD = DRE->getType()->getPointeeType()->getAsRecordDecl())
- VD = RD->getLastField();
-
- Expr *ICE = ImplicitCastExpr::Create(
- getContext(), DRE->getType(), CK_LValueToRValue,
- const_cast<Expr *>(cast<Expr>(DRE)), nullptr, VK_PRValue,
- FPOptionsOverride());
- ME = MemberExpr::CreateImplicit(getContext(), ICE, true, VD,
- VD->getType(), VK_LValue, OK_Ordinary);
- }
-
- // At this point, we know that \p ME is a flexible array member.
- const auto *ArrayTy = getContext().getAsArrayType(ME->getType());
+ // The code generated here calculates the size of a struct with a flexible
+ // array member that uses the counted_by attribute. There are two instances
+ // we handle:
+ //
+ // struct s {
+ // unsigned long flags;
+ // int count;
+ // int array[] __attribute__((counted_by(count)));
+ // }
+ //
+ // 1) bdos of the flexible array itself:
+ //
+ // __builtin_dynamic_object_size(p->array, 1) ==
+ // p->count * sizeof(*p->array)
+ //
+ // 2) bdos of the whole struct, including the flexible array:
+ //
+ // __builtin_dynamic_object_size(p, 1) ==
+ // sizeof(*p) + p->count * sizeof(*p->array)
----------------
bwendling wrote:
> Sorry, I'm a bit confused. Could you clarify what you meant by "what this feature \
> does"?
Responding to:
> I meant the full struct size should include the FAM part that is specified by \
> __counted_by(7), but not more than that (e.g., &s->fam[13]).
So `s->fam[13]` access should fail, of course. And so we use `__bdos(p->array, 1)` to \
get the size of the FAM. It can then be checked against this index. There is code \
however that passes in the struct pointer itself to `__bdos(p, 1)`. In those cases, \
we also add in the struct size. The assumption is that the user really did mean to \
calculate the full size (struct + fam). Before this feature, that `__bdos` call would \
return `-1`. Now it can return something that allows for better array access \
checking.
https://github.com/llvm/llvm-project/pull/70606
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic