BertalanD created this revision. Herald added a project: All. BertalanD requested review of this revision. Herald added a project: clang. Herald added a subscriber: cfe-commits.
If we do not know the alignment of the operand, we can't assume it has the preferred alignment. It might be e.g. a pointer to a struct member which follows ABI alignment rules. This makes UBSAN no longer report "constructor call on misaligned address" when constructing a double into a struct field of type double on i686. The psABI specifies an alignment of 4 bytes, but the preferred alignment used by Clang is 8 bytes. Fixes #54845 Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D124736 Files: clang/lib/CodeGen/CGExprCXX.cpp Index: clang/lib/CodeGen/CGExprCXX.cpp =================================================================== --- clang/lib/CodeGen/CGExprCXX.cpp +++ clang/lib/CodeGen/CGExprCXX.cpp @@ -1573,7 +1573,7 @@ llvm::Value *allocSize = EmitCXXNewAllocSize(*this, E, minElements, numElements, allocSizeWithoutCookie); - CharUnits allocAlign = getContext().getPreferredTypeAlignInChars(allocType); + CharUnits allocAlign; // Emit the allocation call. If the allocator is a global placement // operator, just "inline" it directly. @@ -1583,6 +1583,8 @@ assert(E->getNumPlacementArgs() == 1); const Expr *arg = *E->placement_arguments().begin(); + allocAlign = getContext().getTypeAlignInChars(allocType); + LValueBaseInfo BaseInfo; allocation = EmitPointerWithAlignment(arg, &BaseInfo); @@ -1605,6 +1607,8 @@ allocator->getType()->castAs<FunctionProtoType>(); unsigned ParamsToSkip = 0; + allocAlign = getContext().getPreferredTypeAlignInChars(allocType); + // The allocation size is the first argument. QualType sizeType = getContext().getSizeType(); allocatorArgs.add(RValue::get(allocSize), sizeType);
Index: clang/lib/CodeGen/CGExprCXX.cpp =================================================================== --- clang/lib/CodeGen/CGExprCXX.cpp +++ clang/lib/CodeGen/CGExprCXX.cpp @@ -1573,7 +1573,7 @@ llvm::Value *allocSize = EmitCXXNewAllocSize(*this, E, minElements, numElements, allocSizeWithoutCookie); - CharUnits allocAlign = getContext().getPreferredTypeAlignInChars(allocType); + CharUnits allocAlign; // Emit the allocation call. If the allocator is a global placement // operator, just "inline" it directly. @@ -1583,6 +1583,8 @@ assert(E->getNumPlacementArgs() == 1); const Expr *arg = *E->placement_arguments().begin(); + allocAlign = getContext().getTypeAlignInChars(allocType); + LValueBaseInfo BaseInfo; allocation = EmitPointerWithAlignment(arg, &BaseInfo); @@ -1605,6 +1607,8 @@ allocator->getType()->castAs<FunctionProtoType>(); unsigned ParamsToSkip = 0; + allocAlign = getContext().getPreferredTypeAlignInChars(allocType); + // The allocation size is the first argument. QualType sizeType = getContext().getSizeType(); allocatorArgs.add(RValue::get(allocSize), sizeType);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits