diff --git a/bolt/lib/Passes/LongJmp.cpp b/bolt/lib/Passes/LongJmp.cpp --- a/bolt/lib/Passes/LongJmp.cpp +++ b/bolt/lib/Passes/LongJmp.cpp @@ -322,14 +322,20 @@ uint32_t CurrentIndex = 0; if (opts::HotFunctionsAtEnd) { for (BinaryFunction *BF : SortedFunctions) { - if (BF->hasValidIndex() && LastHotIndex == -1u) + if (BF->hasValidIndex()) { LastHotIndex = CurrentIndex; + break; + } + ++CurrentIndex; } } else { for (BinaryFunction *BF : SortedFunctions) { - if (!BF->hasValidIndex() && LastHotIndex == -1u) + if (!BF->hasValidIndex()) { LastHotIndex = CurrentIndex; + break; + } + ++CurrentIndex; } } @@ -386,17 +392,23 @@ } // Relocation mode - uint64_t EstimatedTextSize = tentativeLayoutRelocMode(BC, SortedFunctions, 0); + uint64_t EstimatedTextSize = 0; + if (opts::UseOldText) { + EstimatedTextSize = tentativeLayoutRelocMode(BC, SortedFunctions, 0); + + // Initial padding + if (EstimatedTextSize <= BC.OldTextSectionSize) { + DotAddress = BC.OldTextSectionAddress; + uint64_t Pad = + offsetToAlignment(DotAddress, llvm::Align(opts::AlignText)); + if (Pad + EstimatedTextSize <= BC.OldTextSectionSize) { + DotAddress += Pad; + } + } + } - // Initial padding - if (opts::UseOldText && EstimatedTextSize <= BC.OldTextSectionSize) { - DotAddress = BC.OldTextSectionAddress; - uint64_t Pad = offsetToAlignment(DotAddress, llvm::Align(opts::AlignText)); - if (Pad + EstimatedTextSize <= BC.OldTextSectionSize) - DotAddress += Pad; - } else { + if (!EstimatedTextSize || EstimatedTextSize > BC.OldTextSectionSize) DotAddress = alignTo(BC.LayoutStartAddress, opts::AlignText); - } tentativeLayoutRelocMode(BC, SortedFunctions, DotAddress); }