Author: pcc Date: Sat Mar 16 12:25:39 2019 New Revision: 356328 URL: http://llvm.org/viewvc/llvm-project?rev=356328&view=rev Log: CodeGen: Preserve packed attribute in constStructWithPadding.
Otherwise the object may have an incorrect size due to tail padding. Differential Revision: https://reviews.llvm.org/D59446 Modified: cfe/trunk/lib/CodeGen/CGDecl.cpp cfe/trunk/test/CodeGenCXX/auto-var-init.cpp Modified: cfe/trunk/lib/CodeGen/CGDecl.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/CodeGen/CGDecl.cpp?rev=356328&r1=356327&r2=356328&view=diff ============================================================================== --- cfe/trunk/lib/CodeGen/CGDecl.cpp (original) +++ cfe/trunk/lib/CodeGen/CGDecl.cpp Sat Mar 16 12:25:39 2019 @@ -1113,7 +1113,7 @@ static llvm::Constant *constStructWithPa } if (NestedIntact && Values.size() == STy->getNumElements()) return constant; - return llvm::ConstantStruct::getAnon(Values); + return llvm::ConstantStruct::getAnon(Values, STy->isPacked()); } /// Replace all padding bytes in a given constant with either a pattern byte or Modified: cfe/trunk/test/CodeGenCXX/auto-var-init.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/CodeGenCXX/auto-var-init.cpp?rev=356328&r1=356327&r2=356328&view=diff ============================================================================== --- cfe/trunk/test/CodeGenCXX/auto-var-init.cpp (original) +++ cfe/trunk/test/CodeGenCXX/auto-var-init.cpp Sat Mar 16 12:25:39 2019 @@ -85,6 +85,8 @@ struct paddedpacked { char c; int i; } _ // PATTERN: @__const.test_paddedpackedarray_custom.custom = private unnamed_addr constant %struct.paddedpackedarray { [2 x %struct.paddedpacked] [%struct.paddedpacked <{ i8 42, i32 13371337 }>, %struct.paddedpacked <{ i8 43, i32 13371338 }>] }, align 1 // ZERO: @__const.test_paddedpackedarray_custom.custom = private unnamed_addr constant %struct.paddedpackedarray { [2 x %struct.paddedpacked] [%struct.paddedpacked <{ i8 42, i32 13371337 }>, %struct.paddedpacked <{ i8 43, i32 13371338 }>] }, align 1 struct paddedpackedarray { struct paddedpacked p[2]; }; +// PATTERN-O0: @__const.test_unpackedinpacked_uninit.uninit = private unnamed_addr constant <{ { i8, [3 x i8], i32 }, i8 }> <{ { i8, [3 x i8], i32 } { i8 -86, [3 x i8] c"\AA\AA\AA", i32 -1431655766 }, i8 -86 }>, align 1 +struct unpackedinpacked { padded a; char b; } __attribute__((packed)); // PATTERN-O0: @__const.test_paddednested_uninit.uninit = private unnamed_addr constant { { i8, [3 x i8], i32 }, { i8, [3 x i8], i32 } } { { i8, [3 x i8], i32 } { i8 -86, [3 x i8] c"\AA\AA\AA", i32 -1431655766 }, { i8, [3 x i8], i32 } { i8 -86, [3 x i8] c"\AA\AA\AA", i32 -1431655766 } }, align 4 // PATTERN: @__const.test_paddednested_custom.custom = private unnamed_addr constant { { i8, [3 x i8], i32 }, { i8, [3 x i8], i32 } } { { i8, [3 x i8], i32 } { i8 42, [3 x i8] c"\AA\AA\AA", i32 13371337 }, { i8, [3 x i8], i32 } { i8 43, [3 x i8] c"\AA\AA\AA", i32 13371338 } }, align 4 // ZERO: @__const.test_paddednested_custom.custom = private unnamed_addr constant { { i8, [3 x i8], i32 }, { i8, [3 x i8], i32 } } { { i8, [3 x i8], i32 } { i8 42, [3 x i8] zeroinitializer, i32 13371337 }, { i8, [3 x i8], i32 } { i8 43, [3 x i8] zeroinitializer, i32 13371338 } }, align 4 @@ -778,6 +780,10 @@ TEST_CUSTOM(paddedpackedarray, paddedpac // CHECK-NEXT: call void @llvm.memcpy{{.*}}({{.*}}@__const.test_paddedpackedarray_custom.custom // CHECK-NEXT: call void @{{.*}}used{{.*}}%custom) +TEST_UNINIT(unpackedinpacked, unpackedinpacked); +// CHECK-LABEL: @test_unpackedinpacked_uninit() +// PATTERN-O0: call void @llvm.memcpy{{.*}}, i64 9, i1 false) + TEST_UNINIT(paddednested, paddednested); // CHECK-LABEL: @test_paddednested_uninit() // CHECK: %uninit = alloca %struct.paddednested, align _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits