Skip to content

Commit c8dfbac

Browse files
committed
fixup! fix remaining test failures
1 parent ab8bd80 commit c8dfbac

File tree

4 files changed

+21
-11
lines changed

4 files changed

+21
-11
lines changed

clang/lib/CodeGen/CGExprConstant.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13+
#include "ABIInfoImpl.h"
1314
#include "CGCXXABI.h"
1415
#include "CGObjCRuntime.h"
1516
#include "CGRecordLayout.h"
@@ -2481,8 +2482,10 @@ static llvm::Constant *EmitNullConstant(CodeGenModule &CGM,
24812482
cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
24822483

24832484
// Ignore empty bases.
2484-
if (base->isEmpty() ||
2485-
CGM.getContext().getASTRecordLayout(base).getNonVirtualSize()
2485+
if (isEmptyRecord(CGM.getContext(), I.getType(), false, true) ||
2486+
CGM.getContext()
2487+
.getASTRecordLayout(base)
2488+
.getNonVirtualSize()
24862489
.isZero())
24872490
continue;
24882491

@@ -2518,7 +2521,7 @@ static llvm::Constant *EmitNullConstant(CodeGenModule &CGM,
25182521
cast<CXXRecordDecl>(I.getType()->castAs<RecordType>()->getDecl());
25192522

25202523
// Ignore empty bases.
2521-
if (base->isEmpty())
2524+
if (isEmptyRecord(CGM.getContext(), I.getType(), false, true))
25222525
continue;
25232526

25242527
unsigned fieldIndex = layout.getVirtualBaseIndex(base);

clang/lib/CodeGen/CGRecordLayoutBuilder.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -635,7 +635,9 @@ CGRecordLowering::accumulateBitFields(bool isNonVirtualBaseType,
635635
// non-reusable tail padding.
636636
CharUnits LimitOffset;
637637
for (auto Probe = Field; Probe != FieldEnd; ++Probe)
638-
if (!isEmptyField(Context, *Probe, false, true)) {
638+
if (!Probe->isZeroLengthBitField(Context) &&
639+
!(isEmptyField(Context, *Probe, false, true) &&
640+
!Probe->isBitField())) {
639641
// A member with storage sets the limit.
640642
assert((getFieldBitOffset(*Probe) % CharBits) == 0 &&
641643
"Next storage is not byte-aligned");
@@ -1163,7 +1165,8 @@ CodeGenTypes::ComputeRecordLayout(const RecordDecl *D, llvm::StructType *Ty) {
11631165
const FieldDecl *FD = *it;
11641166

11651167
// Ignore zero-sized fields.
1166-
if (isEmptyField(Context, FD, false, true))
1168+
if (FD->isZeroLengthBitField(Context) ||
1169+
(isEmptyField(Context, FD, false, true) && !FD->isBitField()))
11671170
continue;
11681171

11691172
// For non-bit-fields, just check that the LLVM struct offset matches the

clang/test/CodeGen/voidptr-vaarg.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,8 @@ typedef struct {
245245
// CHECK-NEXT: [[ARGP_NEXT:%.*]] = getelementptr inbounds i8, ptr [[ARGP_CUR]], i32 4
246246
// CHECK-NEXT: store ptr [[ARGP_NEXT]], ptr [[LIST_ADDR]], align 4
247247
// CHECK-NEXT: call void @llvm.memcpy.p0.p0.i32(ptr align 4 [[RETVAL]], ptr align 4 [[ARGP_CUR]], i32 4, i1 false)
248-
// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[RETVAL]], align 4
248+
// CHECK-NEXT: [[COERCE_DIVE:%.*]] = getelementptr inbounds [[STRUCT_EMPTY_INT_T]], ptr [[RETVAL]], i32 0, i32 0
249+
// CHECK-NEXT: [[TMP0:%.*]] = load i32, ptr [[COERCE_DIVE]], align 4
249250
// CHECK-NEXT: ret i32 [[TMP0]]
250251
//
251252
empty_int_t empty_int(__builtin_va_list list) {

clang/test/CodeGenCXX/auto-var-init.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown -fblocks %s -emit-llvm -o - | FileCheck %s -check-prefixes=CHECK,CHECK-O0
2-
// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown -fblocks -ftrivial-auto-var-init=pattern %s -emit-llvm -o - | FileCheck %s -check-prefixes=CHECK-O0,PATTERN,PATTERN-O0
2+
// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown -fblocks -ftrivial-auto-var-init=pattern %s -emit-llvm -o - | FileCheck %s -check-prefixes=CHECK-O0,PATTERN,PATTERN-O0,PATTERN-64-O0
33
// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown -fblocks -ftrivial-auto-var-init=pattern %s -O1 -emit-llvm -o - | FileCheck %s -check-prefixes=PATTERN,PATTERN-O1
44
// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown -fblocks -ftrivial-auto-var-init=zero %s -emit-llvm -o - | FileCheck %s -check-prefixes=CHECK-O0,ZERO,ZERO-O0
55
// RUN: %clang_cc1 -std=c++14 -triple x86_64-unknown-unknown -fblocks -ftrivial-auto-var-init=zero %s -O1 -emit-llvm -o - | FileCheck %s -check-prefixes=ZERO,ZERO-O1
6-
// RUN: %clang_cc1 -std=c++14 -triple i386-unknown-unknown -fblocks -ftrivial-auto-var-init=pattern %s -emit-llvm -o - | FileCheck %s -check-prefixes=CHECK-O0,PATTERN,PATTERN-O0
6+
// RUN: %clang_cc1 -std=c++14 -triple i386-unknown-unknown -fblocks -ftrivial-auto-var-init=pattern %s -emit-llvm -o - | FileCheck %s -check-prefixes=CHECK-O0,PATTERN,PATTERN-O0,PATTERN-32-O0
77

88
#pragma clang diagnostic ignored "-Winaccessible-base"
99

@@ -166,14 +166,17 @@ struct semivolatileinit { int i = 0x11111111; volatile int vi = 0x11111111; };
166166
// PATTERN-O0: @__const.test_base_braces.braces = private unnamed_addr constant %struct.base { ptr inttoptr ([[IPTRT]] [[IPTR]] to ptr) }, align
167167
// PATTERN-O1-NOT: @__const.test_base_braces.braces
168168
struct base { virtual ~base(); };
169-
// PATTERN-O0: @__const.test_derived_uninit.uninit = private unnamed_addr constant %struct.derived { [8 x i8] c"\AA\AA\AA\AA\AA\AA\AA\AA" }, align 8
169+
// PATTERN-32-O0: @__const.test_derived_uninit.uninit = private unnamed_addr constant %struct.derived { [4 x i8] c"\FF\FF\FF\FF" }, align 4
170+
// PATTERN-64-O0: @__const.test_derived_uninit.uninit = private unnamed_addr constant %struct.derived { [8 x i8] c"\AA\AA\AA\AA\AA\AA\AA\AA" }, align 8
170171
// PATTERN-O1-NOT: @__const.test_derived_uninit.uninit
171-
// PATTERN-O0: @__const.test_derived_braces.braces = private unnamed_addr constant %struct.derived { [8 x i8] c"\AA\AA\AA\AA\AA\AA\AA\AA" }, align 8
172+
// PATTERN-32-O0: @__const.test_derived_braces.braces = private unnamed_addr constant %struct.derived { [4 x i8] c"\FF\FF\FF\FF" }, align 4
173+
// PATTERN-64-O0: @__const.test_derived_braces.braces = private unnamed_addr constant %struct.derived { [8 x i8] c"\AA\AA\AA\AA\AA\AA\AA\AA" }, align 8
172174
// PATTERN-O1-NOT: @__const.test_derived_braces.braces
173175
struct derived : public base {};
174176
// PATERN-O0: @__const.test_virtualderived_uninit.uninit = private unnamed_addr constant %struct.virtualderived { %struct.base { ptr inttoptr (i64 -6148914691236517206 to ptr) }, [8 x i8] c"\AA\AA\AA\AA\AA\AA\AA\AA" }, align 8
175177
// PATTERN-O1-NOT: @__const.test_virtualderived_uninit.uninit
176-
// PATTERN-O0: @__const.test_virtualderived_braces.braces = private unnamed_addr constant %struct.virtualderived { %struct.base { ptr inttoptr (i64 -6148914691236517206 to ptr) }, [8 x i8] c"\AA\AA\AA\AA\AA\AA\AA\AA" }, align 8
178+
// PATTERN-32-O0: @__const.test_virtualderived_uninit.uninit = private unnamed_addr constant %struct.virtualderived { %struct.base { ptr inttoptr (i32 -1 to ptr) }, [4 x i8] c"\FF\FF\FF\FF" }, align 4
179+
// PATTERN-64-O0: @__const.test_virtualderived_uninit.uninit = private unnamed_addr constant %struct.virtualderived { %struct.base { ptr inttoptr (i64 -6148914691236517206 to ptr) }, [8 x i8] c"\AA\AA\AA\AA\AA\AA\AA\AA" }, align 8
177180
// PATTERN-O1-NOT: @__const.test_virtualderived_braces.braces
178181
struct virtualderived : public virtual base, public virtual derived {};
179182
// PATTERN-O0: @__const.test_matching_uninit.uninit = private unnamed_addr constant %union.matching { i32 [[I32]] }, align 4

0 commit comments

Comments
 (0)