[clang] [Clang] Fix __builtin_dynamic_object_size off by 4 (PR #111015)

Bill Wendling via cfe-commits cfe-commits at lists.llvm.org
Mon Oct 7 17:25:17 PDT 2024


bwendling wrote:

> So, we would actually get gcc's behavior with this patch:
> 
> ```
> diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp
> index c864714182e0..21ffe7b46a6e 100644
> --- a/clang/lib/CodeGen/CGBuiltin.cpp
> +++ b/clang/lib/CodeGen/CGBuiltin.cpp
> @@ -1049,25 +1049,7 @@ CodeGenFunction::emitFlexibleArrayMemberSize(const Expr *E, unsigned Type,
>    Value *Res = FAMSize;
>  
>    if (isa<DeclRefExpr>(Base)) {
> -    // The whole struct is specificed in the __bdos.
> -    const ASTRecordLayout &Layout = Ctx.getASTRecordLayout(OuterRD);
> -
> -    // Get the offset of the FAM.
> -    llvm::Constant *FAMOffset = ConstantInt::get(ResType, Offset, IsSigned);
> -    Value *OffsetAndFAMSize =
> -        Builder.CreateAdd(FAMOffset, Res, "", !IsSigned, IsSigned);
> -
> -    // Get the full size of the struct.
> -    llvm::Constant *SizeofStruct =
> -        ConstantInt::get(ResType, Layout.getSize().getQuantity(), IsSigned);
> -
> -    // max(sizeof(struct s),
> -    //     offsetof(struct s, array) + p->count * sizeof(*p->array))
> -    Res = IsSigned
> -              ? Builder.CreateBinaryIntrinsic(llvm::Intrinsic::smax,
> -                                              OffsetAndFAMSize, SizeofStruct)
> -              : Builder.CreateBinaryIntrinsic(llvm::Intrinsic::umax,
> -                                              OffsetAndFAMSize, SizeofStruct);
> +    return nullptr;
>    }
>  
>    // A negative \p IdxInst or \p CountedByInst means that the index lands
> ```

This just turns off `__builtin_dynamic_object_size(ptr, 0)`, which I'm not in favor of.

https://github.com/llvm/llvm-project/pull/111015


More information about the cfe-commits mailing list