https://github.com/bwendling created https://github.com/llvm/llvm-project/pull/125298
If the __bdos argument isn't an array (e.g. a pointer), due to '-Wno-int-conversion' or some other shenanigans, default to using the llvm.objectsize intrinsic. Fixes: cff0a460ae86 ("[Clang][counted_by] Refactor __builtin_dynamic_object_size on FAMs (#122198)") Signed-off-by: Bill Wendling <mo...@google.com> >From df6b80c82f1a9ce4f1eef580f008c86fd691ba71 Mon Sep 17 00:00:00 2001 From: Bill Wendling <mo...@google.com> Date: Fri, 31 Jan 2025 12:48:36 -0800 Subject: [PATCH] [Clang][counted_by] Don't treat a pointer as an array If the __bdos field isn't an array, don't process it. We'll default to using the llvm.objectsize intrinsic. --- clang/lib/CodeGen/CGBuiltin.cpp | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 11fa295dad9524c..21faf85a16e2d25 100644 --- a/clang/lib/CodeGen/CGBuiltin.cpp +++ b/clang/lib/CodeGen/CGBuiltin.cpp @@ -1319,12 +1319,36 @@ CodeGenFunction::emitCountedByMemberSize(const Expr *E, llvm::Value *EmittedE, // size_t field_offset = offsetof (struct s, field); Value *FieldOffset = nullptr; + llvm::ConstantInt *FieldBaseSize = nullptr; if (FlexibleArrayMemberFD != FD) { std::optional<int64_t> Offset = GetFieldOffset(Ctx, RD, FD); if (!Offset) return nullptr; FieldOffset = llvm::ConstantInt::get(ResType, *Offset / CharWidth, IsSigned); + + if (Idx) { + // From option (4): + // size_t field_base_size = sizeof (*ptr->field_array); + if (!FieldTy->isArrayType()) + // The field isn't an array. For example: + // + // struct { + // int count; + // char *string; + // int array[] __counted_by(count); + // } x; + // + // __builtin_dynamic_object_size(x.string[42], 0); + // + // If built with '-Wno-int-conversion', FieldTy won't be an array here. + return nullptr; + + const ArrayType *ArrayTy = Ctx.getAsArrayType(FieldTy); + CharUnits BaseSize = Ctx.getTypeSizeInChars(ArrayTy->getElementType()); + FieldBaseSize = + llvm::ConstantInt::get(ResType, BaseSize.getQuantity(), IsSigned); + } } // size_t count = (size_t) ptr->count; @@ -1376,12 +1400,6 @@ CodeGenFunction::emitCountedByMemberSize(const Expr *E, llvm::Value *EmittedE, llvm::ConstantInt::get(ResType, Size.getKnownMinValue() / CharWidth); if (Idx) { // Option (4) '&ptr->field_array[idx]' - // size_t field_base_size = sizeof (*ptr->field_array); - const ArrayType *ArrayTy = Ctx.getAsArrayType(FieldTy); - CharUnits BaseSize = Ctx.getTypeSizeInChars(ArrayTy->getElementType()); - auto *FieldBaseSize = - llvm::ConstantInt::get(ResType, BaseSize.getQuantity(), IsSigned); - // field_offset += index * field_base_size; Value *Mul = Builder.CreateMul(Index, FieldBaseSize, "field_offset", !IsSigned, IsSigned); _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits