llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-codegen Author: Bill Wendling (bwendling) <details> <summary>Changes</summary> 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 <morbo@<!-- -->google.com> --- Full diff: https://github.com/llvm/llvm-project/pull/125298.diff 1 Files Affected: - (modified) clang/lib/CodeGen/CGBuiltin.cpp (+24-6) ``````````diff diff --git a/clang/lib/CodeGen/CGBuiltin.cpp b/clang/lib/CodeGen/CGBuiltin.cpp index 11fa295dad9524..21faf85a16e2d2 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); `````````` </details> https://github.com/llvm/llvm-project/pull/125298 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits