[lld/mac] Leave more room for thunks in thunk placement code
authorNico Weber <thakis@chromium.org>
Mon, 30 Aug 2021 18:32:29 +0000 (14:32 -0400)
committerNico Weber <thakis@chromium.org>
Tue, 31 Aug 2021 02:09:05 +0000 (22:09 -0400)
commit86c8f395ae7ad901a4b64fda67d367610c05a5cb
tree025f3f76027183862527df6e984b2bffbfa1ae9a
parent93764ff6e2005b92057cffa9b3866307e2de260f
[lld/mac] Leave more room for thunks in thunk placement code

Fixes PR51578 in practice.

Currently there's only enough room for a single thunk, which for real-life code
isn't enough. The error case only happens when there are many branch statements
very close to each other (0 or 1 instructions apart), with the function at the
finalization barrier small.

There's a FIXME on what to do if we hit this case, but that suggestion sounds
complicated to me (see end of PR51578 comment 5 for why).

Instead, just leave more room for thunks. Chromium's unit_tests links fine with
room for 3 thunks. Leave room for 100, which should fix this for most cases in
practice.

There's little cost for leaving lots of room: This slop value only determines
when we finalize sections, and we insert thunks for forward jumps into
unfinalized sections. So leaving room means we'll need a few more thunks, but
the thunk jump range is 128 MiB while a single thunk is just 12 bytes.

For Chromium's unit_tests:
With a slop of   3: thunk calls = 355418, thunks = 10903
With a slop of 100: thunk calls = 355426, thunks = 10904

Chances are 100 is enough for all use cases we'll hit in practice, but even
bumping it to 1000 would probably be fine.

Differential Revision: https://reviews.llvm.org/D108930
lld/MachO/ConcatOutputSection.cpp
lld/test/MachO/arm64-thunk-starvation.s [new file with mode: 0644]