From 5f7ddb1456d5b926e85710da690bf548ef0c9fc8 Mon Sep 17 00:00:00 2001 From: Dimitry Andric Date: Sun, 22 Aug 2021 21:00:43 +0200 Subject: Merge llvm-project main llvmorg-13-init-16847-g88e66fa60ae5 This updates llvm, clang, compiler-rt, libc++, libunwind, lld, lldb and openmp to llvmorg-13-init-16847-g88e66fa60ae5, the last commit before the upstream release/13.x branch was created. PR: 258209 (cherry picked from commit fe6060f10f634930ff71b7c50291ddc610da2475) --- contrib/llvm-project/llvm/lib/Support/OptimizedStructLayout.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'contrib/llvm-project/llvm/lib/Support/OptimizedStructLayout.cpp') diff --git a/contrib/llvm-project/llvm/lib/Support/OptimizedStructLayout.cpp b/contrib/llvm-project/llvm/lib/Support/OptimizedStructLayout.cpp index 9bbd767c5ce9..19a93ed6776d 100644 --- a/contrib/llvm-project/llvm/lib/Support/OptimizedStructLayout.cpp +++ b/contrib/llvm-project/llvm/lib/Support/OptimizedStructLayout.cpp @@ -350,6 +350,7 @@ llvm::performOptimizedStructLayout(MutableArrayRef Fields) { Optional EndOffset) -> bool { assert(Queue->Head); assert(StartOffset == alignTo(LastEnd, Queue->Alignment)); + assert(!EndOffset || StartOffset < *EndOffset); // Figure out the maximum size that a field can be, and ignore this // queue if there's nothing in it that small. @@ -372,6 +373,7 @@ llvm::performOptimizedStructLayout(MutableArrayRef Fields) { // Helper function to find the "best" flexible-offset field according // to the criteria described above. auto tryAddBestField = [&](Optional BeforeOffset) -> bool { + assert(!BeforeOffset || LastEnd < *BeforeOffset); auto QueueB = FlexibleFieldsByAlignment.begin(); auto QueueE = FlexibleFieldsByAlignment.end(); @@ -403,9 +405,12 @@ llvm::performOptimizedStructLayout(MutableArrayRef Fields) { return false; // Otherwise, scan backwards to find the most-aligned queue that - // still has minimal leading padding after LastEnd. + // still has minimal leading padding after LastEnd. If that + // minimal padding is already at or past the end point, we're done. --FirstQueueToSearch; Offset = alignTo(LastEnd, FirstQueueToSearch->Alignment); + if (BeforeOffset && Offset >= *BeforeOffset) + return false; while (FirstQueueToSearch != QueueB && Offset == alignTo(LastEnd, FirstQueueToSearch[-1].Alignment)) --FirstQueueToSearch; @@ -415,6 +420,7 @@ llvm::performOptimizedStructLayout(MutableArrayRef Fields) { // Phase 1: fill the gaps between fixed-offset fields with the best // flexible-offset field that fits. for (auto I = Fields.begin(); I != FirstFlexible; ++I) { + assert(LastEnd <= I->Offset); while (LastEnd != I->Offset) { if (!tryAddBestField(I->Offset)) break; -- cgit v1.2.3