86c8f395ae
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 |
||
---|---|---|
.. | ||
Arch | ||
CMakeLists.txt | ||
ConcatOutputSection.cpp | ||
ConcatOutputSection.h | ||
Config.h | ||
Driver.cpp | ||
Driver.h | ||
DriverUtils.cpp | ||
Dwarf.cpp | ||
Dwarf.h | ||
ExportTrie.cpp | ||
ExportTrie.h | ||
ICF.cpp | ||
ICF.h | ||
InputFiles.cpp | ||
InputFiles.h | ||
InputSection.cpp | ||
InputSection.h | ||
LTO.cpp | ||
LTO.h | ||
MachOStructs.h | ||
MapFile.cpp | ||
MapFile.h | ||
MarkLive.cpp | ||
MarkLive.h | ||
ObjC.cpp | ||
ObjC.h | ||
Options.td | ||
OutputSection.cpp | ||
OutputSection.h | ||
OutputSegment.cpp | ||
OutputSegment.h | ||
Relocations.cpp | ||
Relocations.h | ||
Symbols.cpp | ||
Symbols.h | ||
SymbolTable.cpp | ||
SymbolTable.h | ||
SyntheticSections.cpp | ||
SyntheticSections.h | ||
Target.cpp | ||
Target.h | ||
UnwindInfoSection.cpp | ||
UnwindInfoSection.h | ||
Writer.cpp | ||
Writer.h |