aboutsummaryrefslogtreecommitdiff
path: root/contrib/llvm-project/llvm/lib/Support/OptimizedStructLayout.cpp
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2021-08-22 19:00:43 +0000
committerDimitry Andric <dim@FreeBSD.org>2021-12-06 16:30:02 +0000
commit5f7ddb1456d5b926e85710da690bf548ef0c9fc8 (patch)
treef8845b108c5c07836b95c8229c96cd745fc9fb2c /contrib/llvm-project/llvm/lib/Support/OptimizedStructLayout.cpp
parent3f82687cdf02983d8f3294df4d97b09cf211141b (diff)
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Support/OptimizedStructLayout.cpp')
-rw-r--r--contrib/llvm-project/llvm/lib/Support/OptimizedStructLayout.cpp8
1 files changed, 7 insertions, 1 deletions
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<Field> Fields) {
Optional<uint64_t> 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<Field> Fields) {
// Helper function to find the "best" flexible-offset field according
// to the criteria described above.
auto tryAddBestField = [&](Optional<uint64_t> BeforeOffset) -> bool {
+ assert(!BeforeOffset || LastEnd < *BeforeOffset);
auto QueueB = FlexibleFieldsByAlignment.begin();
auto QueueE = FlexibleFieldsByAlignment.end();
@@ -403,9 +405,12 @@ llvm::performOptimizedStructLayout(MutableArrayRef<Field> 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<Field> 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;